夜阑卧听风吹雨

铁马冰河入梦来

Loading

RSA 加密算法原理学习笔记-2

RSA算法原理(二) - 阮一峰的网络日志

密钥的生成

RSA算法

  1. 随机选择两个不相等质数(上面互质关系结论的第二点,所以这两个数互质)。这两个数越大越难破解,比如 61、53。

  2. 计算两数乘积:n = 61 * 53 = 3233。n 便是密钥的长度,n 的二进制 110010100001 长度为 12,因此密钥长度为 12。

    • 实际应用中,第 1 步选取的两个质数较大,这里的 n 一般为 1024 位,重要场合则为 2048 位。
  3. 计算 n 的欧拉函数 φ(n)φ(n) = φ(p)φ(q) = (p-1)(q-1),所以已知密钥的两个质数因数可以快速计算出 φ(n) = 60 * 52 = 3120。

  4. 随机选择一个整数 e 满足:1 < e < φ(n),且与 φ(n) 互质的数。假设选择 17,实际应用中常选择 65537(因为)。

  5. 此时,n 和 e 便是我们的公钥内容。

  6. 计算 e 的模反元素 d,注意,这里的环境是 φ(n),不使用欧拉定理求模逆元:
    \(ed \equiv 1 \pmod {\phi(n)}\) 等价于:\(ed - 1 = k\phi(n)\)
    所以实际上就是求解二元一次方程:\(ex + \phi(n)y = 1\),其中 e 和 φ(n) 是已知数。

  7. 此时,n 和 d 便是我们的私钥内容。采用 ASN.1 格式表达将 n 和 e 封装成公钥,n 和 d 封装成私钥。

RSA 算法的可靠性

公钥是我们对外的公开的,私钥是我们隐藏的。推算出私钥便会使数据丧失安全性(为什么?见下一节加解密过程)。
那么如果要用公钥推出私钥有多难?
已知公钥(n,e),推 d:

  1. \(ed \equiv 1 \pmod {\phi(n)}\)。只有知道 e 和 φ(n),才能算出 d。
  2. \(\phi(n) = (p-1)(q-1)\)。只有知道 p 和 q,才能算出 φ(n)。
  3. \(n = pq\)。只有将 n 因数分解为两个质数,才能算出 p 和 q。

结论:如能将 n 因式分解为两个质数,则可破解出私钥。
但是要将一个很大的数(1024 位(最小值是 21023+1)、2048 位)因式分解是一件很难的事。

加解密

  1. 加密使用公钥(n,e)
    假设有数据 m(m 为整数,字符串可取其 ascii 值或 unicode 值),
    m 必须小于 n(这是一个重要的条件,大于 n 的情况见本节末尾):

\[m^e ≡ c \pmod n \]

c 便是我们得到的密文。
假设公钥(3233,17),数据 m 为 65,计算 c:(6517) mod 3233 = 2790,所以密文 c 为 2790。(快速幂取模算法 - 王陸 - 博客园

  • 已知 n,c,e 了,推不出 m:这就是破解密文了,m17=2790 (mod 3233) 即 (m17 + 2790) / 3233 = k,可以看到 m,k 是有无数种可能的。每个二元一次方程都有无数对方程的解。
  1. 解密使用私钥(n,d)
    解密算法(该算法证明在后面):

\[c^d \equiv m \pmod n \]

此时私钥是(3233,2753),代入得:27902753 = m (mod 3233),求得 m = 65。

  • 那么如果数据 m 大于 n 的情况下,选择将数据分块单独加密,或者先选择一种"对称性加密算法"加密数据(比如 3DES 或 AES),再用 RSA 加密这种对称加密的密钥。

私钥解密的证明

证明解密算法:

\[c^d \equiv m \pmod n \]

\(\because\) 加密算法使用:\(m^e \equiv c \pmod n\)
\(\therefore\) 即:\(c = m^e - kn\) (不明白的可以看上面同余定理中的变式)
\(\therefore\) 替换解密算法中的 c 得:\((m^e - kn)^d \equiv m \pmod n\)
等同于求证:\(m^{ed} ≡ m \pmod n \cdots\cdots\cdots\cdots\cdots①\)

需要回忆一下二项式定理,对原式进行拆分:二项式定理_持剑的龙套的博客-CSDN博客_二项式定理
首先对左边进行拆分:\((m^e - kn)^d = m^{ed} + m^{e(d-1)}*(kn)^1 + m^{e(d-2)}*(kn)^2 + \dots + m^e(kn)^{d-1} + (kn)^d\)
只有第一个 med 不包含 n,后面均包含 n,相当于:\((m^e - kn)^d = m^{ed} + zn\),z 代表那些复杂的式子,是一个整数,因此 zn 都是可以被 n 整除的,求 \((m^e - kn)^d \equiv m \pmod n\) 相当于求证 \(m^{ed} ≡ m \pmod n\)
这种幂的求余数需要记一下,方便应用。

下面分两种情况证明:
(1)m 与 n 互质
\(\because ed \equiv 1 \pmod {\phi(n)}\)
\(\therefore ed = h\phi(n)+1\) (这个 h 就是我们上面经常用到的 k 了)
\(\therefore\) 代入式子①得:\(m^{h\phi(n)+1} ≡ m \pmod n\)
原题可变成求证:\(m^{h\phi(n)+1} ≡ m \pmod n \cdots\cdots\cdots\cdots\cdots②\)

\(\because\) m 与 n 互质,满足欧拉定理:\(m^{\phi(n)} \equiv 1 \pmod n\)
\(\therefore (m^{\phi(n)})^h × m \equiv m \pmod n\) 即式②

依旧是展开式的应用。
因为 m 与 n 互质,满足欧拉定理,可改写成:\(m^{\phi(n)} = kn + 1\)
而它的任意正整数 h 次方 \((kn + 1)^h\) 展开式为 \((kn)^h +(kn)^{h-1} + (kn)^{h-2} + \dots + (kn)^1 + 1\),只有最后一个不包含 n。
可以看出 \((kn + 1)^h\) 除以 n 余数恒为 1,即 \((kn + 1)^h \equiv 1 \pmod n\),也就是说 \((m^{\phi(n)})^h \equiv 1 \pmod n\),任意正整数次方不影响余数。

证明式②成立,即式①成立。

(2)m 与 n 不是互质关系
\(\because\) m 与 n 不是互质关系,且 \(n = pq\),p、q 为不等的两个质数,\(m < n\)
\(\therefore\) \(m = kq\)\(kp\)

因为 n 是两个互质的质数(等价于不等两个的质数)p、q 之积,所以 n 的因子除 1 和 n 外只有 p、q。
又因为 m 与 n 不是互质关系且 m < n,说明 m 与 n 有公因数,所以 m 一定是 p 或 q 的倍数,而且不会是 n。

\(m = kp\) 为例,则此时 k 与 q 必然互质,则 m 与 q 互质

因为 m = kp,n = pq,而算法中已要求 m < n,所以 k < q。
又因为 q 为质数, k 不等于 q,所以 k 与 q 互质。
因此,由均与 q 互质的 k、p 组成的 m 明显也与 q 互质(都没有公因数)。

m、q 互质,满足欧拉定理:\((kp)^{q-1} \equiv 1 \pmod q\)
进一步得到:\([(kp)^{q-1}]^{h(p-1)} × kp \equiv kp \pmod q\),即 \((kp)^{h\phi(n)} × kp \equiv kp \pmod q\)

这里与 m 和 n 互质的证明那里相似。

\(\because ed = h\phi(n)+1\) ,即:\((kp)^{ed} \equiv kp \pmod q\)
改写成等式:\((kp)^{ed} = kp + tq\)
此时,t 一定能被 p 整除

如果将等式左右两边同时除以 p,左边可以得到整数。右边 kp/p 得到整数,而剩余 tq/p 也一定是整数。因为 q 不是 p 的倍数,所以即 t/p 为整数。

\(t = t'p\),则原式变为:\((kp)^{ed} = t'pq + kp\)
\(\because m = kp,n = pq\)
\(\therefore\) 原式变为:\(m^{ed} = t'n + kp\)
\(\therefore\)\(m^{ed} ≡ m \pmod n\),证明式①成立。

posted @ 2020-12-15 13:47  二次蓝  阅读(337)  评论(0编辑  收藏  举报