zoukankan      html  css  js  c++  java
  • 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;
            }
        }
    }
  • 相关阅读:
    <frame>、<iframe>、<embed>、<object> 和 <applet>
    xss攻击
    回流 和 重绘
    defer 和 async 的区别
    从输入URL到浏览页面的过程
    webkit vs v8
    缓存
    LeetCode
    LeetCode
    LeetCode
  • 原文地址:https://www.cnblogs.com/wyzs/p/5198291.html
Copyright © 2011-2022 走看看