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;
        }
    }
}
原文地址:https://www.cnblogs.com/wyzs/p/5198291.html