RSA 算法：

#include < iostream >

#include < string >

#include < ctime >

#include “ math.h “

using namespace std;

bool isPrime( long ); // the number is prime and return true, else return
false;

long gcd( long a, long b); // find a number which the two number a and
b divide exactly.

long publicKey( long p, long q); // using p, q to calculate the public
key e.

long privateKey( long e, long Qn); // using e ,Qn to calculate the
private key d.

long generKey( const long p, const long q, long pubKey, long
priKey); // get the public key and private key. And return n = pq.
//
char
encode(char ,long n,long pubKey); // encode the Text
//
char
decode(char ,long n,long priKey); // decode the Text which has been
encoded.

long encode( long , long n, long pubKey); // encode the Text

long decode( long , long n, long priKey); // decode the Text which
has been encoded.

int main()
… {

long p,q;

long pubKey ;

long priKey ;

bool pass = true ;

while (pass)
… {

cout << “ input two prime numbers! and the two numbers are bigger than two
!! “ << endl;

cin >> p >> q;

// srand(time(0));

// q = rand();

// p = rand();

if (isPrime(p) && isPrime(q))

pass = false ;
}

cout << “ p = “ << p << “ q = “ << q << endl;

long n = generKey(p,q, & pubKey, & priKey);

cout << “ n: “ << n << endl;

cout << “ input the number for encoding! “ << endl;

long num;

cin >> num;

// cout << decode(encode(txt,n,pubKey),n,priKey);

long enText = encode(num,n,pubKey);

cout << “ encode the Text: “ << enText << endl;

cout << “ decode the Text: “ << decode(enText,n,priKey) << endl;

return 0 ;
}

bool isPrime( long a)
… {

if (a > 2 )
… {

int b = 2 ,c = sqrt(a);

for (; b < c; b ++ )
… {

if (a % b == 0 )

return false ;
}

return true ;
}

return false ;
}

long gcd( long a, long b)
… {

int x = a % b;

if (x == 0 )

return b;

else

return gcd(b,x);
}

long publicKey( const long p, const long q, const long Qn)
… {

srand(time( 0 ));

long e = rand();

if (e >= Qn)

e = 3 ;

while (gcd(e,Qn) != 1 )
… {

e ++ ;

if (e >= Qn)
… {

e = 3 ;
}
}

cout << “ e: “ << e << endl;

return e;
}

long privateKey( const long e, const long Qn)
… {

srand(time( 0 ));

long d = rand();

if (d >= Qn)

d = 3 ;

while (e
d % Qn != 1 || e == d)
… {

d ++ ;

if (d >= Qn)
… {

d = 3 ;
}
}

cout << “ d: “ << d << endl;

return d;
}

long generKey( const long p, const long q, long pubKey, long
priKey)
… {

long n = p q;

long Qn = (p - 1 )
(q - 1 );

• pubKey = publicKey(p,q,Qn);
• priKey = privateKey( pubKey,Qn);

return n;
}

/**/ /

char encode(char txt,long n,long pubKey)

{

int length = strlen(txt);

char text = new char[length];

strcpy(text,txt);

for(int i = 0; i < length; i++)

{

text[i] =(int) pow(text[i],pubKey) % n;

}

return text;

}

char
decode(char txt,long n,long priKey)

{

int length = strlen(txt);

char
text = new char[length];

strcpy(text,txt);

for(int i = 0; i < length; i++)

{

text[i] = (int)pow(text[i],priKey) % n;

}

return text;

}
/

long encode( long num, long n, long pubKey)
… {

long tmp = 1 ;

for ( int i = 0 ; i < pubKey; i ++ )
… {

tmp
= num ;

tmp %= n;
}

return tmp;
}

long decode( long num, long n, long priKey)
… {

long tmp = 1 ;

for ( int i = 0 ; i < priKey; i ++ )
… {

tmp *= num ;

tmp %= n;
}

return tmp;
}
• 本文作者： 帐前卒
• 本文链接： http://chillyc.info/2007/1545379/
• 版权声明： 本博客所有文章除特别声明外，只能复制超链接地址，且必须注明出处！