非对称加密算法RSA原理

-- TOC --

本文介绍非对称加密算法RSA的原理,参考很多不同的资料。

加密算法,对称还是非对称

对称加密(Symmetric-key algorithm),又称私钥加密,即信息的发送方和接收方使用同一个密钥来进行加密和解密数据。使用对称算法最大的问题是要找到安全的密钥分发方法,确保其他人无法得到密钥。它的最大优势是加/解密速度快,适合于数据量大的场景,但密钥管理困难。DES,3DES,AES都是对称算法。(DES使用56位密钥,已不再是安全的,1999年使用枚举密钥搜索法,24小时就能破解)

非对称加密,又称公钥密钥加密。它需要使用一对密钥来分别完成加密和解密操作,一个公开发布,即公钥,另一个由用户自己秘密保存,即私钥。信息发送者用接收者公开密钥去加密,而信息接收者则用自己的私钥解密(用公钥加密,只能用私钥来解)。公钥机制灵活,但加密和解密速度却比对称密钥加密慢得多。非对称加密算法解决了对称算法中密钥分发的问题!但是,它的加密速度比对称加密钥慢很多。著名的RSA算法就是非对称的加密算法。

因此,对称算法和非对称算法各自都有应用场景,相互配合,完成安全通信的需求。而由于分发秘钥的安全性得到了非对称算法的解决,因此人们称非对称算法才是计算机通信安全的基石。

RSA算法历史

在1976年之前,世界上只有对称加密算法。

1976年,两位美国计算机学家Whitfield Diffie 和 Martin Hellman,提出了一种崭新构思,可以在不直接传递密钥的情况下,完成解密。这被称为"Diffie-Hellman密钥交换算法"。这个算法启发了其他科学家。人们认识到,加密和解密可以使用不同的规则,只要这两种规则之间存在某种对应关系即可,这样就避免了直接传递密钥。这种新的加密模式被称为"非对称加密算法"。如果公钥加密的信息只有私钥解得开,那么只要私钥不泄漏,通信就是安全的。

1977年,三位数学家 Rivest、Shamir 和 Adleman 设计了一种算法,可以实现非对称加密。这种算法用他们三个人的名字命名,叫做RSA算法。从那时直到现在,RSA算法一直是最广为使用的"非对称加密算法"。毫不夸张地说,只要有计算机网络的地方,就有RSA算法。

rsa_scientist

这种算法非常可靠,密钥越长,它就越难破解。根据已经披露的文献,目前被破解的最长RSA密钥是768个二进制位。也就是说,长度超过768位的密钥,还无法破解(至少没人公开宣布)。因此可以认为,1024位的RSA密钥基本安全,2048位的密钥极其安全。(我现在随手创建的秘钥,都是4096位的)

理解RSA算法需要的数学知识

这部分不是很难,中学数学就可以理解,因为我们不需要证明,只是去理解。

  1. 模运算和同余定理
  2. 质数和互质关系
  3. 欧拉函数和欧拉定理
  4. 模反元素

RSA算法秘钥的生成

Alice和Bob要进行加密通信,Alice应该如何选择秘钥呢?

第1步,随机选择两个不相等的质数p和q

假设Alice选择了63和53。

实际应用中,这两个质数越大越好,越大就越难以破解。

第2步,计算p和q的乘积n,得到秘钥长度

\(n=p\times q=61\times 53=3233\)

n的二进制长度,就是秘钥长度

>>> bin(3233)
'0b110010100001'
>>> len(bin(3233)[2:])
12

Alice选择的n=3233,一共12位,这个秘钥的长度就是12位的。(实际应用,不可能使用这么短的秘钥,至少1024位,我随手创建的秘钥,都是4096位的)

第3步,计算n的欧拉函数

n的欧拉函数值,就是小于等于n,同时与n互质的数的个数。根据前面提到的数学知识,这里的n的欧拉函数计算,可以使用如下等式:

$$\psi(n)=(p-1)(q-1)$$

因为p和q都是质数。

Alice算出 \(\psi(3323)=60\times 52=3120\)

第4步,随机选择一个小于\(\psi(n)\),并与它互质的整数e

Alice要在1到3120之间,随机选择一个数e,这个数要与3120互质。假设Alice选择 e=17。

实际应用一般e=65537,请参考:OpenSSL使用总结

第5步,计算e相对\(\psi(n)\)的模反元素d

参考前面的数学知识,由于模反元素解不唯一,Alice得到一个解d=2753。

第6步,封装秘钥

Alice的公钥为 (n,e), 即(3233,17);私钥为 (n,d) (3233,2753)

RSA算法的可靠性

RSA算法的可靠性来自于对大整数的质因数分解极其困难!根据数论,寻求两个大素数比较简单,而将它们的乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。

上面的计算,一共出现6个数字,pqned和\(\psi(n)\),着6个数字中,公钥用到两个(n,e),其它都是不公开的秘密。

攻击者只有得到私钥,即得到d,才能破解RSA,那么在知道公钥(n,e)的情况下,是否可以推到出d呢?

因为: \(e \times d \equiv 1 (\bmod \psi(n))\), 要得到 \(\psi(n)\),就需要知道p和q,\(n=pq\),n公开了,因此如果能够将n进行质因数分解得到p和q,就破解了RSA算法。但是,对一个很大的数的质因数分解,现在在数学上除了暴力计算,是无解的。

“对极大整数做因数分解的难度决定了RSA算法的可靠性。换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠。假如有人找到一种快速因数分解的算法,那么RSA的可靠性就会极度下降。但找到这样的算法的可能性是非常小的。今天只有短的RSA密钥才可能被暴力破解。到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式。只要密钥长度足够长,用RSA加密的信息实际上是不能被解破的。”

RSA的加密解密过程

现在Bob拿到了Alice的公钥(n,e),Bob要向Alice发送消息m,就要使用Alice的公钥进行加密。

m必须是整数,如果不是,需要将其转换成整数,比如取二进制值,而且m在数量上必须小于n,如果大于,计算结果将不正确,此时可采取分段加密的方式。

Bob的加密,就是按下式计算c:

$$m^e \equiv c \pmod n$$

就是计算m的e次方,然后除n,取余数。

假设m=65,计算结果为:

>>> 65**17 % 3233
2790  # c when m=65

Bob将2790发给Alice。

Alice用下面这个式子来解密:

$$c^d \equiv m \pmod n$$

就是计算c的d次方,然后除n,取余数。

>>> 2790**2753 % 3233
65

Alice解出Bob发给她的消息是65。

所以,RSA算法加密解密的过程,就是做乘法和模运算!

我们再来看看反过来的情况,Alice用私钥加密,Bob用公钥解密。假设Alice的m=99:

>>> 99**2753 % 3233
89
>>> 89**17 % 3233
99

用公钥解密私钥,常用来做数字签名,有这样的签名的信息,具有不可抵赖性和不可篡改性。

另外,不管是用公钥还是私钥,加密解密的计算过程都一样,不一样的只是,一方使用e,另一方使用d。

私钥解密的证明

我们要证明的是: \(c^d\equiv m \pmod n\)

因为: \(m^e\equiv c\pmod n\)

因此c可以写成:\(c=m^e - kn\), k是整数

将c代入我们要证明的式子,得到:

\((m^e - kn)^d \equiv m \pmod n\),这个式子等价如下面这个:

$$(m^{ed})\equiv m\pmod n \tag 1$$

因为:\(ed \equiv 1 (\bmod \psi(n))\)

所以:\(ed=h\psi(n) + 1\),将这个式子代入(1),得:

$$m^{h\psi(n)+1}\equiv m \pmod n \tag 2$$

式子(1)和(2),就是我们要证明的式子,这两个式子等价。

根据欧拉定理,\(m^{\psi(n)}\equiv 1 \pmod n\)

将上式左边做h此方计算,再乘以一个m,得:

\((m^{\psi(n)})^h\times m \equiv m \pmod n\)

这个式子与式子(2)是一样的,得证。

不互质,就意味着m和n除了1之外,还有别的公因子。由于 \(n=p\times q\),那么,m必然等于p或者q的倍数。

取 \(m=ap\),因q是质数,m与q一定互质,根据欧拉定理:

\(m^{q-1}\equiv 1 \pmod q\),(q-1)是q的欧拉函数值。

对上式进行处理:

\((m^{q-1})^{h(p-1)} \equiv 1 \pmod q\)

\((p-1)(q-1)=\psi(n)\)

\(ed=h\psi(n) + 1\)

得:\(m^{ed-1} \equiv 1 \pmod q\)

\(m^{ed-1} = 1 + tq\)

\(m^{ed}=m + tqm\), 因 m=ap,得:

\(m^{ed}=m+tapq=m+tan\),n=pq,得:

\(m^{ed} \equiv m \pmod n\),这与上面式子(1)一样,得证。

有点烧脑...

本文链接:https://cs.pynote.net/se/jjm/202110055/

-- EOF --

-- MORE --