您的位置:首页 > 其它

RSA算法原理

2016-02-18 15:12 363 查看
  (基本来自百度百科)

  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;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: