/* * Author: 冷却 * Date: 2009年6月26日17:52:41 * E-mail: leng_que@yahoo.com.cn * Description: 简单地实现并演示了RSA公钥系统 */ #include <ctime> #include <cmath> #include <iostream> using namespace std; //判定素数 bool isPrime(int num) { if ( num<=1 ) { return false; } int i=(int)sqrt(num)+1; for ( int n=2; n<i; n++ ) { if ( num%n == 0 ) { return false; } } return true; } //得到p和q void get_p_q(int& p,int& q) { srand(time(0)); p = rand(); q = rand(); while ( !( p!=q && isPrime(p) && isPrime(q) ) ) { p = rand(); q = rand(); } } //求e int get_e(int Euler) { bool isOK; for ( int n=2; n<Euler; n++ ) { //以下为判定n与Euler是否互素 if ( Euler%n == 0 ) continue; isOK = true; for ( int i=2; i<n; i++ ) { if ( n%i == 0 && Euler%i == 0 ) { isOK = false; break; } } if ( isOK ) { return n; } // } return -1; } //求d int get_d(int e,int Euler) { for ( int n=2; n<Euler; n++ ) { if ( n==e ) continue; if ( (n*e)%Euler == 1 ) { return n; } } return -1; } //超量级幂积模运算 unsigned long superPowerMod( unsigned long c, unsigned long power, unsigned long N) { unsigned long n; __int64 result=1; for ( n=0; n<power; n++ ) { result *= c%N; if ( result > N ) { result %= N; } } return (unsigned long)result; } //主函数入口 int main(void) { int p,q; unsigned long N; unsigned long d; unsigned long Euler; unsigned long e; //生成密钥对 cout<<"正在生成密钥对,请稍等……"<<endl<<endl; start: get_p_q(p,q); N = p*q; Euler = (p-1)*(q-1); e = get_e(Euler); if ( e != -1 ) { d = get_d(e,Euler); if ( d != -1 ) { cout<<"n = "<<N<<endl; cout<<"e = "<<e<<endl; cout<<"d = "<<d<<endl; cout<<endl<<"其中n、e为公钥,d为私钥"<<endl; } else { goto start; } } else { goto start; } //使用公钥加密信息 unsigned long msg=6; unsigned long c; unsigned long m; cout<<endl<<"待加密的内容为:"<<msg<<endl; c = superPowerMod(msg,e,N); cout<<"加密后的结果为:"<<c<<endl; cout<<endl<<"正在解密,请稍等……"<<endl; m = superPowerMod(c,d,N); cout<<"解密后的结果为:"<<m<<endl; cout<<endl<<"按下回车键即可退出……"<<endl; cin.get(); return 0; }