目录

  • RSA加密算法
  • 非对称加密算法
  • 工作原理
  • 数学原理
  • 因子
  • 质数
  • 互质
  • 互质性质
  • 欧拉函数
  • 欧拉函数性质
  • 同余
  • 同余性质
  • 欧拉定理
  • 费马小定理
  • 模反元素
  • 欧几里得算法
  • 定义
  • 计算过程
  • 证明
  • 扩展欧几里得算法
  • 定义
  • 计算过程
  • 证明
  • Python实现
  • Java实现
  • 确定 n , e , d n,e,d n,e,d
  • 加密解密
  • 计算过程
  • Python实现
  • Java实现
  • 证明
  • 破解私钥



RSA加密算法

RSA加密算法 是一种 非对称加密算法,在公开密钥加密和电子商业中被广泛使用。例如:

  • 在HTTPS协议的加密层(SSL/TLS)作为密钥交换的方法
  • 支付宝支付API作为签名算法
  • 银联支付API作为签名算法
  • Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议

非对称加密算法

公开密钥密码学 (英语:Public-key cryptography,也称 非对称式密码学 )是密码学的一种算法,它需要两个密钥,一个是公开密钥,另一个是私有密钥;一个用作加密,另一个则用作解密。 使用其中一个密钥把明文加密后所得的密文,只能用相对应的另一个密钥才能解密得到原本的明文;甚至连最初用来加密的密钥也不能用作解密。由于加密和解密需要两个不同的密钥,故被称为非对称加密; 不同于加密和解密都使用同一个密钥的对称加密。虽然两个密钥在数学上相关,但如果知道了其中一个,并不能凭此计算出另外一个;因此其中一个可以公开,称为公钥,任意向外发布;不公开的密钥为私钥,必须由用户自行严格秘密保管,绝不透过任何途径向任何人提供,也不会透露给被信任的要通信的另一方。

lr加密算法 加密算法rsa_扩展欧几里得算法


工作原理

本质就是依赖于三个自然数:lr加密算法 加密算法rsa_非对称加密_02lr加密算法 加密算法rsa_RSA加密算法_03lr加密算法 加密算法rsa_lr加密算法_04 构成一个密钥,lr加密算法 加密算法rsa_RSA加密算法_03lr加密算法 加密算法rsa_扩展欧几里得算法_06 构成另一个密钥。对于lr加密算法 加密算法rsa_lr加密算法_07lr加密算法 加密算法rsa_RSA加密算法_08这两个密钥,无论用哪个密钥加密出来的密文都可以用另一个密钥解开, 所以不必强调哪个用于加密,哪个用于解密,只要把一个公布出去(称为公钥),另一个自己藏着(称为私钥)就行了。

根据这种特性,通常,

  • 使用 公钥加密私钥解密 ,实现 加密
  • 使用 私钥加密公钥解密 ,实现 数字签名
  • 代替 密码散列函数+Token,比如MD5、SHA2,做 消息认证
    (关于加密、数字签名,消息认证可以期待下篇文章。)

关于

  1. 如何确定lr加密算法 加密算法rsa_lr加密算法_09这三个自然数?
  2. 如何进行加密解密?
  3. 已知公钥如何破解私钥?

我们需要了解RSA加解密的数学原理,主要包括

  • 互质
  • 欧拉函数
  • 同余
  • 欧拉定理
  • 模反元素
  • 扩展欧几里得算法

数学原理

你可以快速浏览这些定理和性质,然后进入下一章节,笔者在下一章节回答上述三个问题的同时,尽可能地将所需定理和性质做出了明确标注,阅读过程中可以随时回过头来确认。

因子

一个整数被另一整数整除,后者即是前者的 因子,如1、2、4、8都为8的因子。

质数

大于1的自然数,除1和本身外没有其他正因子,称为 质数

互质

两个自然数,除1以外没有其他公因子,则称它们为 互质

互质性质

根据以上定理可以得出以下几个性质(并不止于以下性质)

  1. 任意两个不相等质数一定互质(因为质数的因子只有1和本身,如果不相等则公因子只有1)
  2. 1和任意自然数都互质(只有1是公因子)
  3. 一个数是质数,另一个数只要不是前者的倍数,则二者互质(质数的因子只有1和本身,如果后者的因子不包含这个前者,那么二者公因子只有1)
  4. 两个数,较大的数是质数,那么二者互质(可由 互质性质3 得到)
  5. 两个不等质数之 的因子有4个,即,1,两个不等质数以及积本身(由 质数定理组合 可以得到)

欧拉函数

我们把用来表示“ 小于或等于lr加密算法 加密算法rsa_公钥_10的正整数中与lr加密算法 加密算法rsa_公钥_10互质的数的数目 ”的函数,称为欧拉函数,计作lr加密算法 加密算法rsa_扩展欧几里得算法_12

欧拉函数性质
  1. lr加密算法 加密算法rsa_lr加密算法_13是质数,那么
    lr加密算法 加密算法rsa_RSA加密算法_14
    互质性质4 可得。
  2. lr加密算法 加密算法rsa_RSA加密算法_15,且lr加密算法 加密算法rsa_非对称加密_16lr加密算法 加密算法rsa_扩展欧几里得算法_17两个不相等的质数,那么
    lr加密算法 加密算法rsa_RSA加密算法_18
    证明:
  1. lr加密算法 加密算法rsa_非对称加密_19,即求:小于等于的lr加密算法 加密算法rsa_lr加密算法_20的正整数,有多少数与lr加密算法 加密算法rsa_lr加密算法_20互质
  2. 逆向思考,可以先求:小于等于的lr加密算法 加密算法rsa_lr加密算法_20的正整数,有多少数与lr加密算法 加密算法rsa_lr加密算法_20不互质
  3. 由于lr加密算法 加密算法rsa_非对称加密_24lr加密算法 加密算法rsa_lr加密算法_20的质因子,所以,如果一个数不与lr加密算法 加密算法rsa_lr加密算法_20互质,那么这个数一定是lr加密算法 加密算法rsa_lr加密算法_27lr加密算法 加密算法rsa_公钥_28的整数倍(由 互质性质5 得)
  4. 由于lr加密算法 加密算法rsa_非对称加密_29,所以,lr加密算法 加密算法rsa_公钥_30中包含lr加密算法 加密算法rsa_公钥_31,一共lr加密算法 加密算法rsa_扩展欧几里得算法_32lr加密算法 加密算法rsa_公钥_28的倍数;同时包含lr加密算法 加密算法rsa_公钥_34,一共lr加密算法 加密算法rsa_扩展欧几里得算法_35lr加密算法 加密算法rsa_lr加密算法_27的倍数
  5. 又因为lr加密算法 加密算法rsa_非对称加密_24lr加密算法 加密算法rsa_lr加密算法_20的质因子,所以,lr加密算法 加密算法rsa_lr加密算法_20lr加密算法 加密算法rsa_非对称加密_24的最小公倍数,即,在小于等于lr加密算法 加密算法rsa_lr加密算法_20的正整数中不存在lr加密算法 加密算法rsa_非对称加密_24的其它公倍数
  6. 所以,小于等于的lr加密算法 加密算法rsa_lr加密算法_20的正整数,有lr加密算法 加密算法rsa_RSA加密算法_44个数与lr加密算法 加密算法rsa_lr加密算法_20不互质
  7. 所以,小于等于的lr加密算法 加密算法rsa_lr加密算法_20的正整数,与lr加密算法 加密算法rsa_lr加密算法_20互质的数有
    lr加密算法 加密算法rsa_RSA加密算法_48

同余

两个整数lr加密算法 加密算法rsa_公钥_49lr加密算法 加密算法rsa_公钥_50,若它们除以正整数lr加密算法 加密算法rsa_RSA加密算法_51所得的余数相等,则称lr加密算法 加密算法rsa_公钥_49lr加密算法 加密算法rsa_公钥_50对于模lr加密算法 加密算法rsa_RSA加密算法_51同余,记作
lr加密算法 加密算法rsa_扩展欧几里得算法_55

同余性质
  1. lr加密算法 加密算法rsa_lr加密算法_56时,lr加密算法 加密算法rsa_扩展欧几里得算法_57
  2. 整除性lr加密算法 加密算法rsa_公钥_58
  3. 保持基本运算lr加密算法 加密算法rsa_扩展欧几里得算法_59
    这性质更可进一步引申成为这样:
    lr加密算法 加密算法rsa_lr加密算法_60
  4. 放大缩小底数 ,k为整数,n为正整数,lr加密算法 加密算法rsa_公钥_61

同余性质3、4 可以根据 同余性质2 整除性来证明。

例如,证明:lr加密算法 加密算法rsa_公钥_62
lr加密算法 加密算法rsa_公钥_63

其它可同理证明。

同余性质 是证明RSA加解密的关键。


欧拉定理

对任何两个互质的正整数lr加密算法 加密算法rsa_公钥_49lr加密算法 加密算法rsa_RSA加密算法_03lr加密算法 加密算法rsa_扩展欧几里得算法_66,有
lr加密算法 加密算法rsa_非对称加密_67

费马小定理

如果n是质数p,那么
lr加密算法 加密算法rsa_非对称加密_68
欧拉函数性质1 可得


模反元素

如果两个正整数lr加密算法 加密算法rsa_公钥_49lr加密算法 加密算法rsa_RSA加密算法_03互质,那么一定可以找到整数lr加密算法 加密算法rsa_公钥_50,使得lr加密算法 加密算法rsa_扩展欧几里得算法_72lr加密算法 加密算法rsa_RSA加密算法_03整除
lr加密算法 加密算法rsa_扩展欧几里得算法_74
此时lr加密算法 加密算法rsa_公钥_50就是lr加密算法 加密算法rsa_公钥_49关于lr加密算法 加密算法rsa_RSA加密算法_03模反元素。由 欧拉定理 可证,lr加密算法 加密算法rsa_公钥_50一定存在。
lr加密算法 加密算法rsa_公钥_79
lr加密算法 加密算法rsa_公钥_80就是lr加密算法 加密算法rsa_公钥_49关于lr加密算法 加密算法rsa_RSA加密算法_03模反元素lr加密算法 加密算法rsa_非对称加密_83 。模反元素可以通过 扩展欧几里得算法 求得。


欧几里得算法
定义

又称 辗转相除法 ,是求最大公约数(最大公因子)的算法。两个整数lr加密算法 加密算法rsa_非对称加密_84的最大公约数,记作lr加密算法 加密算法rsa_扩展欧几里得算法_85

计算过程

前两次余数分别作为被除数除数,得到新的余数
lr加密算法 加密算法rsa_非对称加密_86
递归计算,直到 lr加密算法 加密算法rsa_公钥_87,那么此时 最大公约数lr加密算法 加密算法rsa_公钥_88

证明

证明,lr加密算法 加密算法rsa_公钥_87时,lr加密算法 加密算法rsa_扩展欧几里得算法_90lr加密算法 加密算法rsa_扩展欧几里得算法_91最大公因子lr加密算法 加密算法rsa_RSA加密算法_92

  1. 因为lr加密算法 加密算法rsa_非对称加密_93,所以lr加密算法 加密算法rsa_扩展欧几里得算法_94,所以lr加密算法 加密算法rsa_非对称加密_95可以被lr加密算法 加密算法rsa_扩展欧几里得算法_96整除,同理(递降归纳)可求所有余数lr加密算法 加密算法rsa_公钥_97都可以被lr加密算法 加密算法rsa_扩展欧几里得算法_96整除,所以lr加密算法 加密算法rsa_lr加密算法_99
  2. lr加密算法 加密算法rsa_RSA加密算法_100,有lr加密算法 加密算法rsa_非对称加密_101,即lr加密算法 加密算法rsa_lr加密算法_102整除lr加密算法 加密算法rsa_lr加密算法_103
  3. 又当lr加密算法 加密算法rsa_扩展欧几里得算法_104,又因为lr加密算法 加密算法rsa_lr加密算法_102整除lr加密算法 加密算法rsa_lr加密算法_103,那么lr加密算法 加密算法rsa_lr加密算法_102可以整除lr加密算法 加密算法rsa_RSA加密算法_108,同理(递降归纳),lr加密算法 加密算法rsa_lr加密算法_102可以整除所有余数lr加密算法 加密算法rsa_lr加密算法_110
  4. 又因为lr加密算法 加密算法rsa_扩展欧几里得算法_111,所以,此时lr加密算法 加密算法rsa_扩展欧几里得算法_112
  5. 结论,由于lr加密算法 加密算法rsa_lr加密算法_99,当lr加密算法 加密算法rsa_RSA加密算法_100时,lr加密算法 加密算法rsa_扩展欧几里得算法_112,所以当lr加密算法 加密算法rsa_RSA加密算法_100时,lr加密算法 加密算法rsa_lr加密算法_117

扩展欧几里得算法
定义

顾名思义是 欧几里得算法 的扩展。已知整数lr加密算法 加密算法rsa_非对称加密_118扩展欧几里得算法 可以在求得lr加密算法 加密算法rsa_非对称加密_118的最大公约数的同时,能找到整数lr加密算法 加密算法rsa_RSA加密算法_120(其中一个很可能是负数),使它们满足 贝祖等式
lr加密算法 加密算法rsa_非对称加密_121
在欧几里得算法中,我们仅仅利用了每步带余除法所得的余数。扩展欧几里得算法还利用了带余除法所得的商,在辗转相除的同时也能得到 贝祖等式

计算过程

扩展欧几里得算法欧几里得算法 的基础上增加了两个递归等式的计算
lr加密算法 加密算法rsa_非对称加密_122

递归计算,直到 lr加密算法 加密算法rsa_公钥_87,那么此时
lr加密算法 加密算法rsa_扩展欧几里得算法_124

证明

证明,lr加密算法 加密算法rsa_扩展欧几里得算法_125(已知条件为上述三等式),使用 完整归纳法

  1. lr加密算法 加密算法rsa_公钥_126lr加密算法 加密算法rsa_公钥_127
  2. lr加密算法 加密算法rsa_扩展欧几里得算法_128lr加密算法 加密算法rsa_非对称加密_129
  3. 假设lr加密算法 加密算法rsa_非对称加密_130成立,那么
    lr加密算法 加密算法rsa_扩展欧几里得算法_131

所以lr加密算法 加密算法rsa_扩展欧几里得算法_132lr加密算法 加密算法rsa_RSA加密算法_133满足 贝祖等式

Python实现
#python3.7
 def ext_euclid(a, b):
    r0, r1 = a, b
    s0, s1 = 1, 0
    t0, t1 = 0, 1

    if a * b == 0:
        raise Exception("a,b must be nonzero!")
    while r1 != 0:
        q = r0 // r1
        r0, r1 = r1, r0 - q * r1
        s0, s1 = s1, s0 - q * s1
        t0, t1 = t1, t0 - q * t1
    return r0, s0, t0
Java实现
public BigInteger[] extEuclid(String a, String  b) {
        BigInteger r0 = new BigInteger(a), r1 = new BigInteger(b),
                s0 = BigInteger.ONE, s1 = BigInteger.ZERO,
                t0 = BigInteger.ZERO, t1 = BigInteger.ONE;
        if(r0.multiply(r1).equals(BigInteger.ZERO))
            throw new IllegalArgumentException("a,b must be nonzero!");

        BigInteger q;
        BigInteger intermediate;
        while (!r1.equals(BigInteger.ZERO)){
            BigInteger[] quotientAndRemainder = r0.divideAndRemainder(r1);
            q = quotientAndRemainder[0];
            r0 = r1;r1 =quotientAndRemainder[1];
            intermediate = s0 ;s0 = s1;s1=intermediate.subtract(s1.multiply(q));
            intermediate = t0 ;t0 = t1;t1=intermediate.subtract(t1.multiply(q));
        }
        return new BigInteger[]{r0,s0,t0};
    }

确定lr加密算法 加密算法rsa_非对称加密_02

  1. 选择两个 不等质数 lr加密算法 加密算法rsa_RSA加密算法_135,让lr加密算法 加密算法rsa_lr加密算法_136。假设lr加密算法 加密算法rsa_lr加密算法_137,那么 lr加密算法 加密算法rsa_非对称加密_138
  2. 由上述 欧拉函数性质2 得,lr加密算法 加密算法rsa_扩展欧几里得算法_139。我们随机选择一个数lr加密算法 加密算法rsa_公钥_140,保证lr加密算法 加密算法rsa_非对称加密_141,同时保证,lr加密算法 加密算法rsa_公钥_140lr加密算法 加密算法rsa_lr加密算法_143互质。那么 lr加密算法 加密算法rsa_lr加密算法_144,随机选择lr加密算法 加密算法rsa_非对称加密_145
  3. lr加密算法 加密算法rsa_公钥_140关于lr加密算法 加密算法rsa_lr加密算法_143模反元素lr加密算法 加密算法rsa_RSA加密算法_148 ,即, lr加密算法 加密算法rsa_公钥_149
    lr加密算法 加密算法rsa_lr加密算法_150
    根据 扩展欧几里得算法 可求,lr加密算法 加密算法rsa_非对称加密_151

加密解密

计算过程

明文lr加密算法 加密算法rsa_RSA加密算法_51密文lr加密算法 加密算法rsa_非对称加密_153,如果用lr加密算法 加密算法rsa_公钥_154加密,lr加密算法 加密算法rsa_扩展欧几里得算法_155解密,过程如下:

  1. 加密公式lr加密算法 加密算法rsa_非对称加密_156
  2. 解密公式lr加密算法 加密算法rsa_公钥_157
  3. 已知 明文lr加密算法 加密算法rsa_公钥_158,用lr加密算法 加密算法rsa_公钥_159加密lr加密算法 加密算法rsa_扩展欧几里得算法_160
  4. 已知 密文lr加密算法 加密算法rsa_非对称加密_161,用lr加密算法 加密算法rsa_公钥_162解密lr加密算法 加密算法rsa_扩展欧几里得算法_163
Python实现
#python3.7 注意,pow()当包含第三个参数时,指数不可为负值
print(pow(38, 57, 391))
print(pow(327, 105, 391))
Java实现
System.out.println(BigInteger.valueOf(38).modPow(BigInteger.valueOf(57), BigInteger.valueOf(391)));
System.out.println(BigInteger.valueOf(327).modPow(BigInteger.valueOf(105), BigInteger.valueOf(391)));
证明

证明,已知加密公式lr加密算法 加密算法rsa_扩展欧几里得算法_164,证明解密公式lr加密算法 加密算法rsa_扩展欧几里得算法_165成立。

  1. 根据已知条件,得出公式
    lr加密算法 加密算法rsa_RSA加密算法_166
  2. lr加密算法 加密算法rsa_公钥_167互质,lr加密算法 加密算法rsa_扩展欧几里得算法_168(根据 欧拉定理
    lr加密算法 加密算法rsa_RSA加密算法_169
  3. lr加密算法 加密算法rsa_公钥_167不互质
  1. 因为lr加密算法 加密算法rsa_RSA加密算法_171不互质,所以lr加密算法 加密算法rsa_RSA加密算法_171,除1外有额外公共因子(根据 互质 定理)
  2. 因为lr加密算法 加密算法rsa_非对称加密_29,所以lr加密算法 加密算法rsa_lr加密算法_20有四个因子,lr加密算法 加密算法rsa_非对称加密_175(根据 互质性质5
  3. 又因为lr加密算法 加密算法rsa_lr加密算法_176,所以lr加密算法 加密算法rsa_公钥_177lr加密算法 加密算法rsa_非对称加密_178
  4. 假设lr加密算法 加密算法rsa_公钥_177,此时lr加密算法 加密算法rsa_RSA加密算法_180互质(根据 互质性质4 ),同时因为lr加密算法 加密算法rsa_公钥_181互质,所以lr加密算法 加密算法rsa_扩展欧几里得算法_182互质。
  5. lr加密算法 加密算法rsa_RSA加密算法_183
  6. lr加密算法 加密算法rsa_RSA加密算法_184
  7. 由4,5,6可得
    lr加密算法 加密算法rsa_公钥_185

破解私钥

假如我们已知公钥lr加密算法 加密算法rsa_公钥_154,所谓破解私钥lr加密算法 加密算法rsa_扩展欧几里得算法_155,就是通过lr加密算法 加密算法rsa_公钥_188,求出lr加密算法 加密算法rsa_lr加密算法_04
已知lr加密算法 加密算法rsa_lr加密算法_190,所以要求lr加密算法 加密算法rsa_lr加密算法_04,先求lr加密算法 加密算法rsa_扩展欧几里得算法_12
加密时我们通过lr加密算法 加密算法rsa_非对称加密_193计算出lr加密算法 加密算法rsa_扩展欧几里得算法_12,而破解时我们根本不知道lr加密算法 加密算法rsa_非对称加密_193,需要通过对lr加密算法 加密算法rsa_RSA加密算法_03进行 因数分解 求出lr加密算法 加密算法rsa_扩展欧几里得算法_12
所以,要破解私钥,就要对lr加密算法 加密算法rsa_RSA加密算法_03进行 因数分解lr加密算法 加密算法rsa_RSA加密算法_03越大破解越困难。
目前已破解748-bit的密钥,如果你觉得1024-bit还不够安全,你可以使用2048-bit的密钥,如果未来它们也被破解了,你只需要增加到更大。