NTL密码算法开源库-大整数ZZ类(四)

2021SC@SDUSC

NTL密码算法开源库-大整数ZZ类(四)

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");
}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

元解~殇怀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值