前言
某天在B站上看到了一个关于RSA加密算法的视频,感觉讲得很有意思,于是决定以此为契机学习RSA,然后手动验证一下视频中的消息加密解密过程。
参考
之后搜索查阅了一些RSA算法加密解密的资料,然后手动验证了上面视频中消息加解密的过程。下面是收集的几篇比较清晰易懂的、也是本文主要参考的文章:
- RSA 非对称加密原理(小白也能看懂哦~)
- RSA算法原理(简单易懂)
- 非对称加密算法–RSA加密原理及运用
- RSA算法原理系列文章:
- 欧拉函数:https://www.kancloud.cn/kancloud/rsa_algorithm/48486
- 欧拉定理:https://www.kancloud.cn/kancloud/rsa_algorithm/48487
RSA简介
一、主要步骤
步骤 | 说明 | 描述 | 备注 |
---|---|---|---|
1 | 找出质数 | P 、Q | 随机找两个质数P和Q,P与Q越大,越安全 |
2 | 计算公共模数 | N = P * Q | - |
3 | 欧拉函数 | φ(N) = φ§φ(Q)= (P-1)(Q-1) | 即积的欧拉函数等于各个因子的欧拉函数之积 |
4 | 计算公钥E | 1 < E < φ(N) | 随机选择一个整数E,条件是1<E<φ(n),且E与φ(n) 互质 |
5 | 计算私钥D | E * D % φ(N) = 1 | 选择一个整数D,可以使得E乘D 除以φ(n) 的余数为 1 |
6 | 加密 | C =M ^ E mod N | C:密文 M:明文 |
7 | 解密 | M =C ^ D mod N | C:密文 M:明文 |
-
实际使用时,由E和N组成公钥,由D和N组成私钥,即
公钥=(E , N)
私钥=(D, N)
二、简单示例
1、找出质数 P 、Q
P = 3
Q = 11
2、计算公共模数
N = P * Q = 3 * 11 = 33
3、 欧拉函数
φ(N) = (P-1)(Q-1) = 2 * 10 = 20
4、计算公钥E
1 < E < φ(N)
1 < E < 20
E 的取值范围 {3, 7, 9, 11, 13, 17, 19},E的取值必须是整数, E 和 φ(N) 必须是互质数
3 和 φ(N) =20 互为质数,满足条件
为了测试,我们取最小的值 E =3
5、计算私钥D
E * D % φ(N) = 1
3 * D % 20 = 1
根据上面可计算出 D = 7
6、公钥加密
我们这里为了演示,就加密一个比较小的数字 M = 2
公式:C = M^E mod N
M = 2
E = 3
N = 33
C = 2^3 % 33 = 8
明文 “2” 经过 RSA 加密后变成了密文 “8”
7、私钥解密
M =C^D mod N
C = 8
D = 7
N = 33
M = 8^7 % 33
8 * 8 * 8 * 8 * 8 * 8 * 8=2097152
8 * 8 * 8 * 8 * 8 * 8 * 8 % 33 = 2
密文 “8” 经过 RSA 解密后变成了明文 2
RSA加解密手动验证
回到最初目的,下面开始跟随视频中的步骤验证过程:
1、找出质数 P 、Q
P = 17
Q = 19
2、计算公共模数
N = P * Q = 17 * 19 = 323
3、 欧拉函数
φ(N) = (P-1)(Q-1) = 16 * 18 = 288
4、计算公钥E
1 < E < φ(N)
1 < E < 288
E必须是与φ(N) 互质的整数,且取值范围为 1 < E < φ(N)
这里选择了 E =61
因此封装的公钥=(E , N)=(61,323)
5、计算私钥D
E * D % φ(N) = 1
61 * D % 288 = 1
选择一个整数D,可以使得E乘D 除以φ(n) 的余数为 1
这里选择了 D = 85
因此封装的私钥=(D, N)=(85,323)
6、公钥加密
- 将待加密数据How are you转换成Unicode编码(16进制格式):
H | o | w | a | r | e | y | o | u | ||
---|---|---|---|---|---|---|---|---|---|---|
48 | 6F | 77 | 20 | 61 | 72 | 65 | 20 | 79 | 6F | 75 |
- 公钥=(E , N)=(61,323),对上述字符逐个进行加密
加密公式:C = M^E mod N (C:密文 M:明文)
这里以字符a为例,
先将十六进制的0x61转成十进制97,故M = 97
E = 61
N = 323
C = 97^61 % 323 = 14
得出字符a加密后的密文是14,对应的十六进制是0xE
- …依此类推,得出所有明文经过后的密文如下表:
48 | 6F | 77 | 20 | 61 | 72 | 65 | 20 | 79 | 6F | 75 |
---|---|---|---|---|---|---|---|---|---|---|
59 | 4D | BB | 101 | E | 85 | ED | 101 | 53 | 5D | 2 |
7、私钥解密
- 解密过程类似,私钥=(D, N)=(85,323),对上一步的密文表逐个进行解密
解密公式:M =C^D mod N (C:密文 M:明文)
同样以字符a为例:
先将密文0xE转成十进制14,故M = 14
D = 85
N = 323
C = 14^85 % 323 = 97
得到解密出来的明文97,即字符a
-
…依此类推,能够得到密文表对应的所有明文How are you
解密成功!