为什么将RSA公共指数设置为1的提交会出现问题?
为什么将RSA公共指数设置为1的提交会出现问题?
今天在cryptohack上做了一道公钥为1的题目,当我计算出明文的时候发现其与密文一模一样,这不经让人深思,是不是当公钥为1时,根本没有对原来的明文成功加密?
对此网上有这样一个回答:
简而言之,当e=1时,d=1,加密是恒等映射,即不加密。
RSA 是一种密码系统——一种执行密钥生成、加密和解密的方法——以便您可以安全地向其他人发送消息。 RSA 是称为公钥密码系统的一类成员,因为用于加密消息的密钥是公开的并且每个人都可以自由地知道。您用来解密用公钥加密的消息的密钥是秘密的,只有您知道,因此我们将其称为私钥。
如果您将挂锁和钥匙想象为公钥和私钥的模拟,您可以看到这如何处理现实世界的消息:
- 鲍勃给了爱丽丝一把挂锁(他的公钥)并保留了锁的钥匙(他的私钥)。
- 现在,如果爱丽丝想向鲍勃发送消息,她会将消息放入一个盒子中,将他的挂锁放在盒子上,然后将盒子发送给他。
- 只有鲍勃有钥匙,因此只有鲍勃可以打开挂锁并进入盒子。
为了实际生成密钥,RSA 需要三个重要的数字:
- “N”,两个非常大的素数 p 和 q 的乘积
- “e”,“公共指数”
- “d”,“私人指数”
RSA 安全性的很大一部分来自于这样一个事实:给定 N 和 e ,要弄清楚d
是什么应该是非常困难的。
换句话说,如果我不知道鲍勃的挂锁是什么样子,那么逆向工程一把钥匙来打开鲍勃的挂锁应该是非常困难的。
为什么1
不好?
1
是一个糟糕的选择,因为它很容易对打开鲍勃挂锁的钥匙进行逆向工程,这与我们想要的相反。
有问题的部分完整如下所示:
1 | def gen_keys(keydir, keyname, keysize, user=None): |
这是一个 Python 片段,可生成 RSA 密钥e = 1
。
N
、e
、 和之间的关系d
由下式给出:
1 | d*e = 1 mod (p-1)(q-1) |
但是等等:如果你e = 1
像 SaltStack 那样选择 ,那么你就会遇到问题:
1 | d = 1 mod (p-1)(q-1) |
现在您拥有私钥了!安全性被破坏了,因为你可以弄清楚d
是什么。所以你可以解密每个人的传输——你已经做到了,这样你就可以通过鲍勃的挂锁轻松获得他的钥匙。哎呀。
事实上,情况比这更糟。在 RSA 中,加密意味着您要m
传输一条要使用公钥加密的消息<N,e>
。加密消息c
计算如下:
1 | c = m^e (mod N) |
所以,如果e = 1
,那么m^e = m
,你就有c = m mod N
。
但如果m < N
,那么m mod N
就是m
。所以你有了:
1 | c = m |
加密文本与消息文本相同,因此根本没有加密!双哎呀。
希望大家清楚为什么1
这是一个错误的选择!
为什么65537
更好?
65537 似乎是一个不寻常的、任意的选择。例如,您可能想知道为什么我们不能直接选择e = 3
.越低e
,加密速度就越快,因为要加密我们必须执行的任何内容:
1 | c = m^e (mod N) |
当很大时,可以m^e
是一个非常大的数。
综上可以看出来,当公钥为1时,我们可以很轻易的得到私钥的值,RSA的加密意义全无,因为d = 1,所以密文根本没有得到加密。