zoukankan      html  css  js  c++  java
  • RSA算法之学习

    一、RSA算法

    RSA是非对称加密算法中的代表,它的重要性不言而喻,为了弄清楚RSA算法,我们一起来完成一项任务:

    背景:现在是疫情时代,假如小明和女朋友被迫在两个城市,小明为了表达感情,想发给对方一句蜜语,但是不能让其他任何人知道。

    蜜语用计算机语言表达:105 32 7311111810132117,因为明文,所以想用RSA算法加密。如何做呢?

    分为三步:

    1、先搞清楚RSA的算法步骤

    2、对每一个数字加密

    3、对方能够解密

     

    下来,我们一起完成帮小明完成心愿。

     

    RSA的算法步骤:

     

    1、随机选两个不相等的质数pq

    2、计算pq的乘积n

    3、计算n欧拉函数 φ(n)

    4、随机选择一个整数e,条件是1<e<φ(n),e与φ(n)互质

    5、计算e对于φ(n)模反元素d

    6ne为公钥,nd为私钥

    我们按照步骤,首先生成公钥和私钥

    1、选两个质数 137

    2、n=13*7=91

    3、φ(143)=φ(13*7)=φ(13)*φ(7)=12*6=72

    4、随机取一个数为5

    5、通过扩展欧几里得算法,可以得出d=29

    6、公钥:(91,5)   私钥:(91,29

    然后加密

    m ^e c (mod n) 

    已知:m等于要发送的蜜语,e=5,n=91,求c c为加密后的信息

    m=10532 7311111810132117

    加密后的蜜语:1424776,27, 82,2,52

    最后解密

    c ^d m (mod n)     

    已知:加密后的蜜语cd=29,n=91 m  (m为原始蜜语)

    c=1424776,27, 82,2,52

    解密后:14,32,73,20,27,10,32,26

    存在问题:

    1、当n比较小的时候,要加密的数比n大时,可能存在解密出来的数和原来的数差一个模。比如111,加密后是76,解密后是20, 20+91=111,其中91是模

    2、模反元素求出的结果是负数

       负数+

    解决思路:

    选n的时候,选大一点,我们学习算法的时候,为了好计算,所以取的值比较小。如果原始数值也很大的时候,就考虑分割加密,比如,我们的n=91,要加密105,就分成两部分加密,比如加密一个10,再加密一个5,解密后,还是105,因为它只不过是字符序列而已。 

    二、质数

      

    也称素数:大于1的自然数中,除了1和它自身外,不能被其它自然数整除

    质数分布规律,随着数字越大,质数分布越稀疏

    孪生质数:相差为2的质数对,如(3,5)(5,7

    在这里,我介绍下数学界数论的四大猜想

    孪生素数猜想

    存在无限个孪生质数对

    欧拉:瑞士数学家、自然科学家1707415日~1783918

    13岁读大学、15岁大学毕业、16岁获得硕士学位,18世纪最杰出的数学家之一,不满十岁,就开始自学《代数学》,1766年患白内障,几乎失明。

    哥德巴赫:德国的一个中学数学老师,1742年,给欧拉写信,提出了哥德巴赫猜想

    哥德巴赫猜想

    a)任何一个>=6之偶数,都可以表示成两个奇质数之和。

      (b) 任何一个>=9之奇数,都可以表示成三个奇质数之和。

    9+9开始,逐步减少每个数里所含质数因子的个数,直到最后使每个数里都是一个质数为止,这样就证明了哥德巴赫猜想。中国的数学家在这个问题上是领先世界的。

    华罗庚只有初中学历,由于家庭原因,被迫辍学,但是他的自学能力特别强,出版的数学著作数不胜数,上学的时候学习过他的文章,主要讲统筹,比如,烧水的时候,同时干点别的事情。我只是简单地提下。

    陈景润有口吃,被停职,但是他的研究能力很厉害,上帝关了一道门,但是同时开了一扇窗。华罗庚发现了陈景润的才能,被带到研究院,陈景润研究哥德巴赫猜想,证明了1+2,大偶数为一个素数及一个不超过两个素数的乘积之和。迄今为止,是这个问题研究的终结点。

    四色猜想

    四色问题的内容是:“任何一张平面地图只用四种颜色就能使具有共同边界的国家着上不同的颜色。”用数学语言表示,即“将平面任意地细分为不相重叠的区域,每一个区域总可以用1234这四个数字之一来标记,而不会使相邻的两个区域得到相同的数字。”

    费马猜想

    形如xn+yn=zn的方程,当n>2时不可能有整数解。“关于此,我确信已发现了一种美妙的证法 ,可惜这里空白的地方太小,写不下”,费马很有趣,美妙的证法,没法让其他人知道。

    费马  1601817日~1665112日, 法国律师和业余数学家

    三、欧拉函数

    同余类:模m同余的整数构成的集合    

    完系:在模m同余类中每一个类取一个数构成的集合叫m的一个完全剩余系,简称完系

    最小非负完系:01,2... ,m-1

    互质是公约数只有1的两个整数,叫做互质整数,互质也称互素。

    缩系(既约剩余系):{1,2,...m}中与m互素的数的集合

    Φ(m)=s,s为缩系的个数

    换句话说,对正整数n,小于n的正整数中与n互质的数的数目

    积性函数:f(ab)=f(a)*f(b)

    欧拉函数φ(n)是积性函数如果m,n互素,Φ(m*n)=Φ(m)*Φ(n)

    例如,3和5互素,由于φ(3)=2,φ(5)=4,φ(15)=φ(3)*φ(5)=2*4=8

    积性函数证明

     

     

    构造了一个nm的矩阵,找到同时与nm互素的元素

    GCD(km+r,m)=GCD(r, m),所以每一列的 n 个元素同时与 m 互素,当且仅当 GCD(r,m)=1

    m互素的列共有Φ(m)个,假设第r列与m互素,r,m+r,2m+r,  (n-1)m+r mod n的一个完系,在这一列中与n互素的共有Φ(n)个,所以Φ(mm)=Φ(m)*Φ(n)

     

    欧拉定理:

    mφ(n) 1 (mod n)

     它能做什么?简化幂的模运算,还能做什么,与RSA算法有什么关系?这个后面就会知道

     

    欧拉定理证明:

    x1,x2...xφn n互质

    ax1 (mod n),ax2 (mod n)...axφn ( mod n) n互质,经过排序后与x1,x2...xφn相同

    所以aX1 * aX2 *  ... * aXφn ≡  X1 * X2 * ...* Xφn  (mod n)

    (aφ(n-1)X1 * X2 * ...* Xφn ≡ 0 (mod n)

    因为X1 * X2 * ...... * Xφnn互质,所以 (aφ(n-1)|n  即 aφ(n) 1 (mod n)

     

    费马小定理:

    引理1:

    abc为任意3个整数,m为正整数,且(m,c)=1,则当a·cb·c(mod m)时,有ab(mod m)

    引理2:

    m是一个整数m>1b是一个整数(m,b)=1。如果a[1],a[2],a[3],a[4],…a[m]是模m的一个完全剩余系,则b·a[1],b·a[2],b·a[3],b·a[4],…b·a[m]也构成模m的一个完全剩余系。

    构造一个p的完全剩余系

    P={1,2,3,...,p-1}

    因为 (a,p)=1,由引理2可得

    A={a,2a,3a,...,(p-1)a},也是p的一个完全剩余系。由完全剩余系的性质

    a*2a*3a*...*(p-1)a1*2*3*...*(p-1) (mod p)

    所以1*2*3*...*(p-1)*ap-11*2*3*...*(p-1) (mod p)

    (p-1)! *ap-1(p-1)! (mod p)

    ((p-1),p)=1,两边同时约去 (p-1)!

    ap-11(mod p)

    它是欧拉定理的一个特殊情况,当p为质数时,φ(p) =p-1

    四、模反元素

    ed ≡ 1 mod φ(n),已知e和φ(n),求d,用扩展欧几里得算法

    欧几里得是古希腊雅典著名的数学家,他著有《几何原本》,是当时的一本教科书,是欧式几何学的开创人。

    欧几里得算法,就是碾转相除法,求两个正整数的最大公约数,已知a,b  求gcd(a,b)=gcd(b,a mod b),编程中经常用递归去计算

    扩展欧几里得算法

    ed=kφ(n)+1

    ed-kφ(n)=1

    符合ax+by=1,求解x

    裴蜀定理:对于任何整数a、b和gcd(a,b)=d,则一定存在整数x,y,使得ax+by=d

    推论,a,b互质的充分必要条件是存在整数x,y,使得ax+by=1

    a*x+b*y = gcd(a , b)

    = gcd(b , a mod b)

    = b * x1 + (a mod b) * y1

    = b * x1 + (a - a / b * b) * y1 即

    a*x+b*y = b * x1 + (a - a / b * b) * y1

    化简上式,得

    a*x+b*y = a*y1 - b*a/b*y1 + b*x1 , 即

    a * x + b * y

    = a * y1 + b * (x1-a/b*y1)

    所以

    x=y1

    y=x1 - a/b*y1

    用代码表示:

    void exgcd(int a, int b, int &d, int &x ,int &y)
    {
    
        if ( !b )
        {
    
         d = a;
    
            x = 1;
    
            y = 0;
    
            return;
        }
    
        int x1,y1;
    
        exgcd( b , a % b , d , x1 , y1 );
    
        x = y1;
    
        y = x1 - ( a / b ) * y1;
    
        return ;
    }

    中国剩余定理,也叫孙子定理

    《孙子算经》中有这样一个问题:有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?

    x  mod 3=2

    x  mod 5=3

    x  mod 7=2

    直接解决,似乎很困难,但是每一项分开求,就简单了

    x1 mod 3=2

    x2 mod 5=3

    x3 mod 7=2

    针对同余方程组,我们假设 x=x1+x2+x3,于是可以推出

    x2+x3  mod 3 = 0

    x1+x3  mod 5 = 0

    x1+x2  mod 7 = 0

    两个数之和可以被3整除,姑且认为每个数都可以被3整除,简化问题,通过观察上面的式子就会发现,x1是5和7的公倍数,取最小公倍数35,x2和x3同理。同余方程组变为:

    35m1 2 (mod 3)

    21m2 3(mod 5)

    15m32(mod 7)

    根据引理1,可知被除数和余数同时缩小相同的倍数, 同余方程不变

    35w1 1 (mod 3)

    21w2 1(mod 5)

    15w31(mod 7)

    问题转换到求逆元,求出w1,w2,w3后,在依次计算

    已知 m1=2w1,m2=3w2, m3=2w3  ,求出 m1,m2,m3,

    已知 x1=35m1  ,x2=21m2   ,x3=15m3 ,求出x1,x2,x3   

    已知 x=x1+x2+x3,求出x

    求出x的最小值

    介绍中国剩余定理的目的,一方面是因为它在数论里很重要,另一方面,是它可以用扩展欧几里得求解。

    可是中国古人在研究这个问题的时候,欧几里得扩展法是否已广为人知。

    五、解密证明

    已知模反元素,证明解密

    已知me c (mod n)  ,证明cd m (mod n) 

    me= kn+c   

    c=me-kn

    (me-kn)d m (mod n)

    展开后,medm (mod n)

    因为ed ≡ 1 mod φ(n)

    ed=hφ(n)+1

    mhφ(n)+1 m (mod n)

     

    假设m,n互质

    根据欧拉定理 mφ(n) 1 (mod n)

    mφ(n))h  *m m (mod n)

    m,n 不互质的情况,这里不再陈述,我觉得比较繁琐。

    已知加解密过程,倒推模反元素

    me c (mod n)    cd m (mod n)   

     

    med m (mod n)

    med-1 1 (mod n)

    由欧拉定理可知  kφ(n)=ed-1

    ed=kφ(n)+1

    后记:

    1、第一部分的例子中,由于n选的不够大,所以导致加密比n的数字后,解密出来后就不准了。这个问题,希望真正想学习RSA算法的益友,可以换个稍微大一点的n,再手动走一遍算法。

    2、网上参考的文章都是先介绍数学知识,然后很多人可能连算法的全貌没有看到,直接退出去了,因为数学知识不容易懂。所以我反其道而行之,先体验加密解密的过程,然后再去弄懂算法背后的数学知识。

    3、为了搞清楚RSA算法,我准备了好几周,补习数学知识,这些知识是算法的基石。RSA算法的可靠性,建立在大数难以分解的数学原理之上。

    4、例子要传输的原文是 i love u的ASCII码,包括中间的空格

    主要参考文章:

    https://www.cnblogs.com/zylAK/p/9569668.html

    https://zhuanlan.zhihu.com/p/58241990

    https://zhuanlan.zhihu.com/p/48249182

    https://zhuanlan.zhihu.com/p/103394468

  • 相关阅读:
    HDU 4460 Friend Chains 第37届ACM/ICPC杭州赛区题目 (bfs求最短路,求两两之间最短路的最大值)
    HDU 4445 Crazy Tank (简单物理题,枚举)
    HDU 4433 locker 第37届ACM/ICPC 天津赛区现场赛C题(DP)
    JQuery 3级级联,3级联动,3级连动
    C++异常处理
    C++ Template
    学会用core dump调试程序错误(转)
    C++命名规则
    vim实用配置(转)
    GDB多进程调试(转)
  • 原文地址:https://www.cnblogs.com/wangqiang3311/p/15125247.html
Copyright © 2011-2022 走看看