RSA算法原理
(基本来自百度百科)
RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。1987年首次公布,当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。
RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准。
RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的。加密算法E和解密算法D也都是公开的。虽然解密密钥SK是由公开密钥PK决定的,但却不能根据PK计算出SK。
RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。
RSA算法涉及三个参数,n、e1、e2 。
其中,n是两个大素数p、q的乘积,n的二进制表示时所占用的位数,就是所谓的密钥长度。
e1和e2是一对相关的值,e1可以任意取,但要求e1 与 (p-1) * (q-1) 互质;再选则e2,要求(e2 * e1) % ( (p-1) * (q-1) ) = 1 。
(n,e1) ,(n,e2) 都是密钥对。其中(n,e1)为公钥,(n,e2)为私钥。
RSA加解密的算法完全相同,设A为明文,B为密文,则,A = B^e2 mod n; B = A^e2 mod n;公钥加密体制中,一般用公钥加密,私钥解密。
e1和e2可以互换使用。
//例子为算47 * x + 30 * y ==1 的解 public class Exercise { public static void main(String[] args) { int[] p = new int[2]; int a = 47; int b = 30; RSA(a,b,p); System.out.print("p[0] is: " + p[0] + ";p[1] is:" + p[1]);//p1为私钥 } public static int[] RSA(int a,int b,int[] p)//这里假设a > b { if(a%b == 1) { p[0] = 1; p[1] = -(a - 1) / b; return p; } else { RSA(b,a % b,p); int t = p[0]; p[0] = p[1]; p[1] = t - (a / b) * p[1]; return p; } } }