RSA算法的C++實现.doc

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
RSA算法的C實现

RSA算法的C++实现RSA公钥加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的。RSA取名来自开发他们三者的名字。RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。?它的安全性是基于大整数素因子分解的困难性,而大整数因子分解问题是数学上的著名难题,至今没有有效的方法予以解决,因此可以确保RSA算法的安全性。RSA算法是第一个既能用于数据加密也能用于数字签名的算法,因此它为公用网络上信息的加密和鉴别提供了一种基本的方法。它通常是先生成一对RSA 密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册,人们用公钥加密文件发送给个人,个人就可以用私钥解密接受。为提高保密强度,RSA密钥至少为500位长,一般推荐使用1024位。RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。   RSA的算法涉及三个参数,n、e1、e2。   其中,n是两个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。   e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质;再选择e2,要求(e2*e1)mod((p-1)*(q-1))=1。   (n及e1),(n及e2)就是密钥对。   RSA加解密的算法完全相同,设A为明文,B为密文,则:A=B^e1 mod n;B=A^e2 mod n;   e1和e2可以互换使用,即:   A=B^e2 mod n;B=A^e1 mod n;1) 确定密钥的宽度。 ????2) 随机选择两个不同的素数p处q,它们的宽度是密钥宽度的二分之一。 ????3) 计算出p和q的乘积n 。 ????4) 在2和Φ(n)之间随机选择一个数e , e 必须和Φ(n)互素,整数e用做加密密钥(其中Φ(n)=(p-1)*(q-1))。 ????5) 从公式ed ≡ 1 mod Φ(n)中求出解密密钥d 。 ????6) 得公钥(e ,n ), 私钥 (d , n) 。 ????7) 公开公钥,但不公开私钥。 ????8) 将明文P (假设P是一个小于n的整数)加密为密文C,计算方法为: C = Pe?mod n ????9) 将密文C解密为明文P,计算方法为: P = Cd?mod n ????然而只根据n和e(不是p和q)要计算出d是不可能的。因此,任何人都可对明文进行加密,但只有授权用户(知道d)才可对密文解密 密钥产生key_produce.h?//==本程序提供密钥产生的一些基本数学实现 #include? class CKEY_PRODUCE? { public: ?CKEY_PRODUCE(); ?virtual ~CKEY_PRODUCE(); public: ?int JudgePrime(unsigned int prime);//==========判prime是否为素数 ?//============================================算出p*q的欧拉值 ?int Count_N_AoLa_Num(unsigned int p, unsigned int q, unsigned int * ao_la); ?//============================================求两个数的最大公因数 ?unsigned int CountCommonData(unsigned int a, unsigned int b); ?//=============================================随机选择公钥e ?int RandSelect_e( unsigned int ao_la, unsigned int* e ); ?//=============================================求b的e次方除d的余数 ?unsigned int GetOutNum(unsigned int b,unsigned int e , unsigned int d); ?//=============================================求任意大于2的整数的欧拉值 ?unsigned int CountAnyNumAola(unsigned int number); ?//=============================================产生RSA 公_私?密钥 int Produce_RSA_Key

文档评论(0)

fv45ffsjjI + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档