53

RSA 加密算法主要公式

 3 years ago
source link: https://mp.weixin.qq.com/s/_xTGHYtYgQsboXUa7MEbbg
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

RSA 是非对称的加密算法,其中它有一些相关的数学公式。 让我们从一道题开始了解 RSA 的数学公式。

计算问题

下面是一道关于 RSA 计算的问题,比较简单,可以从这道题来学习和了解关于 RSA 非对称加密算法的相关知识。当然,具体关于 RSA 加密算法的知识不能仅限于以下问题,应该更全面的了解相关的知识。但是下面的问题已经把其中的重点算法表现出来了。

问题:在 RSA 算法中,取密钥 E = 3,D = 7,则明文 6 的密文是()。

RSA 算法的相关公式

下面是关于 RSA 的主要数学公式:

n = p * q

ø(n) = (p - 1) * (q - 1)

ed ≡ 1 mod ø(n) 

c = m**e mod n

m = c**d mod n

对上面的公式进行一个简单的说明。

  • 在整个公钥体制中,e 和 n 是公开的,e 是公钥,n 是两个大素数的乘积。

  • m 和 c 分别是明文和密文,这部分在所有的加密算法中都会涉及。

  • 其余的 p、q、d 是保密的,p 和 q 是两个大素数,n 就是通过 p 和 q 相乘得到的,d 是私钥。

  • e 和 d 的关系满足 e * d ≡ 1 mod ø(n) ,也就是说 d 是 e 的乘法逆元,或者说e * d 和 1 同 ø(n)  求模同余。 其中  ≡ 是数论中的“求模同余”的意思,而不是“恒等”的意思。

说明:其中两个 ** 是幂次方的意思,这种写法是 Python 语言中的写法,比如 7 ** 3 就是 7 的 3 次方的意思。

将题中的数带入公式

ed ≡ 1 mod ø(n)

3 * 7 ≡ 1 mod ø(n)

21 ≡ 1 mod ø(n)

ø(n) = 20

ø(n) = 2 * 10 = (p - 1) * (q - 1)

p, q = 3, 11

n = p * q = 3 * 11 = 3

上面的步骤通过 ed 得到了 ø(n),而 ø(n) 是 20 的情况下,我们可能算出 p - 1 和 q - 1 是 4 和 5,也可能是 2 和 10。

如果 p - 1 和 q - 1 分别是 4 和 5,那么 p 和 q 就是 5 和 6,而 6 不是素数;

如果 p - 1 和 q - 1 分别是 2 和 10,那么 p 和 q 就是 3 和 11,此时两个数都为素数。

得到 p 和 q 以后,就得到了 n。

在得到 n 以后套用加密算法的公式,即可计算 6 的密文。

c = m**e mod n = 6 ** 3 mod 33 = 18

因此 明文 6 的密文是 18。

其中 6 ** 3 是 6 * 6 * 6,通过降幂可以简化为

6 ** 3 

3 = 1 * (2 ** 0) + 1 * (2 ** 1)

t0 = 6 mod 33 = 6

t1 = 6 ** 2 mod 33 = 3

t0 * t1 mod n = 6 * 3 mod 33 = 18

可以在 Python 的交互环境中进行验算:

>>> 6 ** 3 % 33
18

将密文进行解密验算

除了用 Python 验算以外,用解密算法对密文 18 进行解密,如果得到明文 6,也说明上面的计算是正确的。

m = c ** d mod n = 18 ** 7 mod 33 = 6

其中 18 ** 7 如果使用 7 个 18 相乘来手动计算,是一件麻烦的事情,所以这里使用降幂的方式来进行手动计算,是非常有必要的。

18 ** 7

7 = 1 * (2 ** 0) + 1 * (2 ** 1) + 1 * (2 ** 2)

t0 = 18 mod 33 = 18

t1 = 18 ** 2 mod 33 = 27

t2 = 27 ** 2 mod 33 = 3

t0 * t1 * t2 mod n = 18 * 27 * 3 mod 33 = 6

通过降幂计算,18 ** 7 计算起来只用了 4 步就完成了,数值也没有太大。

因此,密文 18 解密后是 6

在 Python 下进行验算:

>>> 18 ** 7 % 33
6

上面就是 RSA 的关键相关的公式,其中虽然 n 是公开的,但是实际 n 是两个非常大的素数相乘得到的(题目中的 3 和 11 这种素数太小了),很难通过 n 分解出两个大的素数,因此保证了其安全性。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK