2021SC@SDUSC
RSA算法
具体密钥生成步骤见@回首~阑珊
私钥解密的证明
要证cd ≡ m (mod n)
因为,根据加密规则
me ≡ c (mod n)
于是,c可以写成下面的形式:
c = me – kn
将c代入要我们要证明的那个解密规则:
(me - kn)d ≡ m (mod n)
它等同于求证
med ≡ m (mod n)
由于
ed ≡ 1 (mod φ(n))
所以
ed = hφ(n)+1
将ed代入:
mhφ(n)+1 ≡ m (mod n)
接下来,分成两种情况证明上面这个式子。
(1) m与n互质。
根据欧拉定理,此时
mφ(n) ≡ 1 (mod n)
得到
(mφ(n))h × m ≡ m (mod n)
原式得到证明。
(2)m与n不是互质关系。
此时,由于n等于质数p和q的乘积,所以m必然等于kp或kq。
以 m = kp为例,考虑到这时k与q必然互质,则根据欧拉定理,下面的式子成立:
(kp)q-1 ≡ 1 (mod q)
进一步得到
[(kp)q-1]h(p-1) × kp ≡ kp (mod q)
即
(kp)ed ≡ kp (mod q)
将它改写成下面的等式
(kp)ed = tq + kp
这时t必然能被p整除,即 t=t’p
(kp)ed = t’pq + kp
因为 m=kp,n=pq,所以
med ≡ m (mod n)
原式得到证明。
代码实现
RSA.h
/***********************************************************************
RSA 加密与解密
1、p , q 均是 " << bits <<" bits 的大素数(概率素数);
2、加密密钥 e 是 100 bits 的大整数;
3、明文文件, 密文文件及解密文件均存放于当前目录下;
***********************************************************************/
#include"RSA.H"
# pragma comment (lib, "NTL-5.3.2\\NTL532.lib")
#define BITS 256 //要求概率素数 p , q 的比特位数达 BITS bits
void main()
{
ZZ p, q ; //两个 BITS 比特的随机概率素数 p , q
ZZ n, e, d, euler; // n=p*q, euler=(p-1)*(q-1), e---加密密钥, d---解密密钥
int bits = BITS; //要求概率素数为 BITS bits
cout<<endl;
cout<<"**********************************************************"<<endl;
cout<<" NTL 库实现 RSA 加密与解密 "<<endl;
cout<<" 1、p , q 均是 " << bits <<" bits 的大素数(概率素数); "<<endl;
cout<<" 2、加密密钥 e 是 100 bits 的大整数; "<<endl;
cout<<" 3、明文文件, 密文文件及解密文件均存放于当前目录下; "<<endl;
cout<<"**********************************************************"<<endl;
system("cls");
RandomPrime( p, bits, 10 ); RandomPrime( q, bits, 10 );
n=p*q; euler=(p-1)*(q-1); //计算 n=p*q 及 欧拉函数值 euler(n)=(p-1)*(q-1)
KeyGeneration(d, e, euler); //生成密钥: d, e , where d*e=1 Mod euler(n)
SaveKey(e, d, n); //保存公钥及私钥到文件. 注意: PU={e,n}, PR={d,n}
//注意: 公钥 KU={e,n}, 用于加密方
// 私钥 KR={d,n}, 用于解密方
Encryption(e, n); //加密: C=M^e(Mod n)
Decryption(d, n); //解密: M=C^d(Mod n)
cout<<endl;
cout<<"**********************************************************"<<endl;
cout<<" NTL 库实现 RSA 加密与解密 "<<endl;
cout<<" 1、p , q 均是 " << bits <<" bits 的大素数(概率素数); "<<endl;
cout<<" 2、加密密钥 e 是 100 bits 的大整数; "<<endl;
cout<<" 3、明文文件, 密文文件及解密文件均存放于当前目录下; "<<endl;
cout<<"**********************************************************"<<endl;
cout<<"\n程序执行完毕!"<<endl;
cout<<"*********** 以下所有文件均保存于当前目录下 ***********"<<endl;
cout<<"\t 明文文件: "<< file1 <<endl;
cout<<"\t 密文文件: "<< file2 <<endl;
cout<<"\t 解密文件: "<< file3 <<endl;
cout<<"\t RSA 加密密钥文件: PublicKey.txt" << endl;
cout<<"\t RSA 解密密钥文件: PrivateKey.txt" << endl;
cout<<endl;
cout<<"******************************************************"<<endl;
cout<<endl; system("pause");
}
RSA.cpp
/***********************************************************************
RSA 加密与解密
1、p , q 均是 " << bits <<" bits 的大素数(概率素数);
2、加密密钥 e 是 100 bits 的大整数;
3、明文文件, 密文文件及解密文件均存放于当前目录下;
***********************************************************************/
#include"RSA.H"
# pragma comment (lib, "NTL-5.3.2\\NTL532.lib")
#define BITS 256 //要求概率素数 p , q 的比特位数达 BITS bits
void main()
{
ZZ p, q; //两个 BITS 比特的随机概率素数 p , q
ZZ n, e, d, euler; // n=p*q, euler=(p-1)*(q-1), e---加密密钥, d---解密密钥
int bits = BITS; //要求概率素数为 BITS bits
cout << endl;
cout << "**********************************************************" << endl;
cout << " NTL 库实现 RSA 加密与解密 " << endl;
cout << " 1、p , q 均是 " << bits << " bits 的大素数(概率素数); " << endl;
cout << " 2、加密密钥 e 是 100 bits 的大整数; " << endl;
cout << " 3、明文文件, 密文文件及解密文件均存放于当前目录下; " << endl;
cout << "**********************************************************" << endl;
system("cls");
RandomPrime(p, bits, 10); RandomPrime(q, bits, 10);
n = p * q; euler = (p - 1)*(q - 1); //计算 n=p*q 及 欧拉函数值 euler(n)=(p-1)*(q-1)
KeyGeneration(d, e, euler); //生成密钥: d, e , where d*e=1 Mod euler(n)
SaveKey(e, d, n); //保存公钥及私钥到文件. 注意: PU={e,n}, PR={d,n}
//注意: 公钥 KU={e,n}, 用于加密方
// 私钥 KR={d,n}, 用于解密方
Encryption(e, n); //加密: C=M^e(Mod n)
Decryption(d, n); //解密: M=C^d(Mod n)
cout << endl;
cout << "**********************************************************" << endl;
cout << " NTL 库实现 RSA 加密与解密 " << endl;
cout << " 1、p , q 均是 " << bits << " bits 的大素数(概率素数); " << endl;
cout << " 2、加密密钥 e 是 100 bits 的大整数; " << endl;
cout << " 3、明文文件, 密文文件及解密文件均存放于当前目录下; " << endl;
cout << "**********************************************************" << endl;
cout << "\n程序执行完毕!" << endl;
cout << "*********** 以下所有文件均保存于当前目录下 ***********" << endl;
cout << "\t 明文文件: " << file1 << endl;
cout << "\t 密文文件: " << file2 << endl;
cout << "\t 解密文件: " << file3 << endl;
cout << "\t RSA 加密密钥文件: PublicKey.txt" << endl;
cout << "\t RSA 解密密钥文件: PrivateKey.txt" << endl;
cout << endl;
cout << "******************************************************" << endl;
cout << endl; system("pause");
}