zoukankan      html  css  js  c++  java
  • RSA加密与实践

    RSA的整体逻辑就是将一个数在经过一次运算后能变回原数,这个运算就是求幂然后取模,将这个运算拆成两个部分,其中一部分作为公钥给用户,另一部分作为私钥储存在服务器,用户用公钥运算后发送给服务器,然后服务器再用私钥运算,最终能得到还原后的数据,这就是RSA的算法流程

    算法原理解释

    所有涉及的知识(均只写出需要使用的部分)

    互质关系
    中国剩余定理
    欧拉φ函数 费马
    -欧拉定理(数论)
    模反元素
    扩展欧几里得算法
    蒙哥马利算法

    互质关系

    涉及的结论
    1. 任意两个质数构成互质关系,比如13和61
    2. 一个数是质数,另一个数只要不是前者的倍数,两者就构成互质关系,比如3和10
    3. 如果两个数之中,较大的那个数是质数,则两者构成互质关系,比如97和57
    4. 1和任意一个自然数是都是互质关系,比如1和99
    5. p是大于1的整数,则p和p-1构成互质关系,比如57和56

    中国剩余定理

    取两个质数n、m,则对于任意正整数x < n * m,均有唯一的(a,b)数对使得a = x mod n、b = x mod m
    例:
    取n = 3,m = 5,则n * m = 15
    x a b
    14 2 4
    13 1 3
    12 0 2
    11 2 1
    10 1 0
    9 0 4
    8 2 3
    7 1 2
    6 0 1
    5 2 0
    4 1 4
    3 0 3
    2 2 2
    1 1 1
    其中a有n - 1个不为0的值,b有m - 1个不为0的值,x有(n - 1)(m - 1)个不为0的值

    欧拉φ函数

    对正整数n,欧拉函数φ(n)是小于或等于n的正整数中与n互质的数的数目

    因为需要将比n小且不互质的整数去除掉,则根据容斥定理,可以得到
    即φ函数公式为:
    当n=p*q,其中p和q均为质数时,乘积性质证明
    方法一:

     ①

    证毕

    方法二:

    根据中国剩余定理,x与(a,b)数对一一对应,则:

    当a、b均不为0时,(a,b)所对应的x与n * m互质,因为n、m均为质数,则φ(n)= n - 1,φ(m)= m - 1

    根据排列组合,(a,b)数对的数量为φ(n)*φ(m),也等于φ(n * m)的数量,即φ(n * m)=φ(n)* φ(m)

    证毕

    例:

    与中国剩余定理中的红色行数一致,并且通过剩余定理,可以有另一种思路推出φ函数公式,参考文末链接

    欧拉定理

    若a与n互质,则
    证明:
    设大整数m的欧拉函数为φ(m),表示比m小的正整数中与m互质的数的个数,将此类数记为

    同时设

    定理一

    p之间两两模m不同余

    证明

    若存在两个数pi和pj模m同余,则

    将p = ax代入,得

    因为a与m互质,则xi-xj必然是m的倍数,然而xi-xj小于m,且不等于0,矛盾

    因此,pi和pj模m不同余,证毕

    定理二

    任意p模m的结果都与m互质

    证明

    根据扩展欧几里得算法,得

    证毕

    因为任意p模m的结果都与m互质,且p直接两两模m不同余,则p与x存在双射关系,即一一对应

    于是将所有p的乘积模m可得

    因为任意x都与n互质,则

    证毕 

    模反元素

    如果两个正整数a和n互质,那么一定可以找到整数b,使得 ab-1 被n整除,或者说ab被n除的余数是1,即
     ③

    证明:

    因为a与n互质,则由②得

    即一定存在b,使得a与b为模反元素 

    扩展欧几里得算法

    在③中,RSA算法一般将质数a取为65537,二进制表示为10000000000000001,因为绝大部分位置是0,因此简化了加密时的运算量
    在1024位加密下,质数p和q随机取为512位二进制数,使得n为1024位,然后根据a和n,求得a的模反元素b
    但是在实际计算过程中,如此大的幂运算,是几乎不可能直接计算出来的,因此使用了扩展欧几里得算法来计算
    欧几里得算法就是熟知的辗转相除法

    从上图中可看出,通过辗转相除,最后在b等于0时能得到最大公约数gcd,此处记为q,在扩展欧几里得算法中,使用了递归的计算,可以在得到gcd的同时得到使等式ax+by=gcd(a,b)成立的x和y,因此数据出现的顺序是如蓝色箭头所示

    直接看最后一行的数据,当b=0时计算结束,a*1+b*0=q,即ax+by=q,得到gcd,此时的a和b为上一层的b和a mod b

    将最后一行的等式带入倒数第二行,可得bx+(a mod b)y=q,如果使用取整来表示模运算,并整理等式,可得

    对于第二行,根据ax+by=q的公式,x与y将因此更新为

     

    通过整个递归算法,最终可以得到使第一行即原式成立的x和y,以及gcd,如果递归层数较多,也可以改用迭代计算

    蒙哥马利算法

    对于任意的整数a、b、q、r、n,我们可以构造

    则可得

     

    则得到模运算的乘法分配律

    利用乘法分配律可以轻松得到某些幂的模

    观察规律,则可以直接写出所有幂为2^n的数对n的模,下面展示两个,后面的以此类推

    而其他的幂则可以通过上述结果累加得到,假设幂为19,则

      将19拆分后利用乘法分配律可以得到以下结果

     

    将拆分后的数从大到小逐个提出,然后利用分配律拆开,整理后可以得到最后一行的形式,每增加一个数x,则乘以(a^x mod n),然后将乘积mod n,而所有(a^x mod n)都可以用上述规律得到,从小到大计算则可以一次得到结果

    RSA算法

    下面展示1024位加密算法的步骤
    第一步: 随机取两个512位二进制长度质数p和q,表示成十进制,以便后续运算,其中取随机数可以参考Rabin-Miller方法
    第二步:
    计算p和q的乘积n,然后由①可得φ(n)=(p-1)(q-1)
    第三步:
    根据③,将a、b分别记为e、d,意为encode和decode,其中e常设为65537,也可使用其他质数,然后根据扩展欧几里得算法求得d
    第四步:
    将e和n封装为公钥,d和n封装为私钥,将公钥发送给用户,然后将私钥保存在服务器端
    第五步:
    加解密的算法都是相同的,为大数幂的模运算,使用蒙哥马利算法计算,文本内容需要全部转换为十进制,可以存为ascii码或者unicode码,
    同时,要保证每一段的字符串长度小于n的长度,以1024位加密为例,n的十进制长度为154,以ascii码为例,左侧补零保证所有字符为3位,
    则最多可以放下51个字符,然后分段加密和解密,加密时以分段后的原文为底,e为幂,对n取模,解密时以分段后的密文为底,d为幂,对n取模

    使用方法:
    用户使用公钥加密后传输给服务器,服务器使用储存的私钥解密即完成整个RSA加密流程

    可行性证明

    假设已经得到e、d、n,设m为原文,c为密文,则可通过第一行得到c,然后需要证明第二行,即c能通过变化回到m

    证明:

    将c带入二式,得

    由③可得

    将上式带入⑤,得

    如果m与n互质,则

    证毕

    如果m与n不互质,因为n是p和q的乘积,则m必然等于kp或者kq,以m = kp为例,因为k < q且q是质数,所以k与q互质,则

    变形上式可得

    因为左边是p的倍数,右边必然是p的倍数,因为p和q互质,所以t必然是p的倍数,记t=t'p,带回原式,得

    证毕

    算法实践

    在链接中有python实现的rsa算法,也有使用该算法的IoT软硬件,可以自行尝试,如果遇到任何问题,欢迎建议与留言!

    https://github.com/Pyrokine/usb_power_meter/blob/master/FIRMWARE/python/myRSA.py

    感谢

    算法导论
    null
    RSA算法原理(一)
    http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html
    ACM数论之旅7---欧拉函数的证明及代码实现(我会证明都是骗人的╮( ̄▽ ̄)╭)
    https://www.cnblogs.com/linyujun/p/5194170.html
    25行代码实现完整的rsa算法(python3.x版本)
    https://blog.csdn.net/bian_h_f612701198412/article/details/87202462
    扩展欧几里得算法详解
    https://blog.csdn.net/destiny1507/article/details/81750874
    模运算的分配律如何证明?
    https://www.zhihu.com/question/41361614
    费马小定理、欧拉定理与扩展欧拉定理(含证明)
    https://blog.csdn.net/hzj1054689699/article/details/80693756
    浅谈欧拉定理的证明
    https://www.cnblogs.com/wangxiaodai/p/9758242.html
  • 相关阅读:
    【LeetCode OJ】Remove Element
    【LeetCode OJ】Remove Duplicates from Sorted Array
    【LeetCode OJ】Swap Nodes in Pairs
    【LeetCode OJ】Merge Two Sorted Lists
    【LeetCode OJ】Remove Nth Node From End of List
    【LeetCode OJ】Two Sum
    【LeetCode OJ】Majority Element
    最长公共子序列问题
    php fopen与file_get_contents的区别
    PHP 技巧集合
  • 原文地址:https://www.cnblogs.com/Pyrokine/p/13072526.html
Copyright © 2011-2022 走看看