简介
对称加密
1976年以前,所有的加密方法都是同一种模式:
- a选择某一种加密规则,对信息进行加密;
- b使用同一种规则,对信息进行解密。
这种加密模式有一个最大缺点:
加密和解密使用同样的规则(密钥),
a必须把密钥告诉b,否则无法解密。
保存和传递密钥,就成了最头疼的问题。
非对称加密
后来出现一种 ”Diffie-Hellman密钥交换算法“,它的加密和解密可以使用不同的规则,只要这两种规则之间存在某种对应关系即可,这样就避免了直接传递密钥。
-
b生成公钥pk跟私钥sk,公钥公开任何人都可以获得,私钥保密。
-
a 获取b的公钥,然后用b的公钥进行信息加密。
-
b得到加密后的信息,用自己的私钥解密。
所以如果公钥加密的信息只有私钥解得开,那么只要私钥不泄漏,通信就是安全的。
RSA算法一直是最广为使用的非对称加密算法。
RSA算法原理
根据数论,寻求两个大素数比较简单,而将它们的乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
举个例子:
定义函数f为 f(p, q) = pq, pq是两个大质数,那么我们很容易通过pq得到 f(p, q)
如果:
f(p, q) = 32213114911055087, 求 p, q.
这样就裂开了,目前还没有有效算法。
RSA算法流程
首先看一下RSA的密码体制,课本上乱七八糟的字母看不懂也没关系,至少对这些字母有个印象。
同样的,我们通过一个例子来引入:
假设Alice要与Bob进行加密通信,注意重点来了,Alice首先生成自己的公私钥对 pk, sk
1.密钥生成
-
随机选择两个不相等的质数p和q,(这两个质数越大,就越难破解),我们为了方便举例,选取5和11
-
计算p和q的乘积n 和欧拉函数φ(n)
n = 5×11 = 55
φ(n) = (p-1)(q-1) = 40 -
随机选择一个整数b,条件是1< b < φ(n),且b与φ(n) 互质…我们就选择3吧,方便计算
-
计算b对于φ(n)的模反元素a
a ≡ b-1 (mod φ(n)) ≡ 3-1 mod 40即:a×3 ≡ 1 mod 40
(有小伙伴可能不知道怎么得来的。。a = n×40 + 3-1 ,等式两边同乘3 即 3a = 3n × 40 + 1)这个时候就又到了我们熟悉的拓展欧几里德求解不定方程。。不熟的参考上一篇欧几里德算法、拓展欧几里德、中国剩余定理多练习一下。
a×3 ≡ 1 mod 40 =>> 3a - 40y = 1
得: a = 27, y = 2 是上述不定方程的一组解
-
好了,到此整理一下Alice算的结果:
公钥pk:(n = 55, b = 3)
私钥sk:(p = 5,q = 11, a = 27)(实际应用中公钥和私钥的数据都采用ASN.1格式表达)
至此,我们的公私钥对生成阶段结束,下面开始加密
2. 加密和解密
假设Bob要向Alice发送加密信息x,他就要用Alice的公钥 (n, b) 对x进行加密。
重点:x 必须是整数(字符串可以取ascii值),且x必须小于n。
这里我们例子中的n相对较小,所以我们需要将明文拆开进行多次加密:
假设我们加密明文 987654
一个一个来:
Ek(x) = xb (mod n) = 93 mod 55 = 14
Ek(x) = xb (mod n) = 83 mod 55 = 17
Ek(x) = xb (mod n) = 73 mod 55 = 13
Ek(x) = xb (mod n) = 63 mod 55 = 51
Ek(x) = xb (mod n) = 53 mod 55 = 15
Ek(x) = xb (mod n) = 43 mod 55 = 9
最终明文结果为:14 17 13 51 15 9
然后 Alice用自己的私钥进行解密:
Dk(y) = ya (mod n) =1427 mod 55 = 9
Dk(y) = ya (mod n) =1727 mod 55 = 8
Dk(y) = ya (mod n) =1327 mod 55 = 7
Dk(y) = ya (mod n) =5127 mod 55 = 6
Dk(y) = ya (mod n) =1527 mod 55 = 5
Dk(y) = ya (mod n) =927 mod 55 = 4
计算出明文:987654
欢迎关注公众号:带问号的小朋友