本文主要是介绍Rabin加密算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、Rabin加密算法
Rabin算法是一种基于模平方和模平方根的非对称加密算法
(称a为x 的算术平方,称x为a的算术平方根)
(称a为x模m时的平方,称x为模m时的平方根)
1.加密
公式为:C=m2mod n ,其中C为密文,m为明文.随机取两个大素数p、q,满足p≡q≡3mod4 ,即这两个素数形式为4k+3,计算n=pq,以n作为公钥,p、q作为私钥。
String sn = 442454454344642494;//明文BigInteger m=new BigInteger(sn);//取两个大素数,设置密钥p、q的值BigInteger p = new BigInteger("199999900000000099");BigInteger q = new BigInteger("199999900000000171");//算出n的值BigInteger n = p.multiply(q);//加密BigInteger f=m.pow(2);BigInteger c=f.mod(n);//得到密文String result=c.toString();
2.解密
解密:在已知私钥p和q时求密文, , ,在p≡q≡3mod4 时, , ,接着根据辗转相除法得出 和 ,使其满足: ,最后根据孙子定理,最后计算出的明文为:
值得注意的是该加密函数并不是一个单射,对于任意的一个密文,有四个可能的明文与之对应,根据校验码可以在明文空间中取得真正的明文,或者在密文前面添加时间戳等方法进行明文校验。求解x2≡C mod n 与分解n是等价的,所以破译Rabin密码的困难程度等价于大整数分解的困难问题。
总结
Rabin加密算法的效率非常高,因为仅需一次mod平方运算,但是缺点是接收者需要从四种可能的情况下选择一个正确的明文,这种不确定问题可以通过预先增加定义原始明文消息冗余来解决(例如,复制对应的比特位在固定位置,或者在明文前面添加时间戳,或者添加特定字符串在固定位置)明文消息中仅有一个符合冗余规则,即可辨认原始明文消息,也可以解决一个密文对于多个明文的问题。解密所需的算法还有扩展欧几里得算法,以及孙子定理。
这篇关于Rabin加密算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!