一、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平方运算,但是缺点是接收者需要从四种可能的情况下选择一个正确的明文,这种不确定问题可以通过预先增加定义原始明文消息冗余来解决(例如,复制对应的比特位在固定位置,或者在明文前面添加时间戳,或者添加特定字符串在固定位置)明文消息中仅有一个符合冗余规则,即可辨认原始明文消息,也可以解决一个密文对于多个明文的问题。解密所需的算法还有扩展欧几里得算法,以及孙子定理。