为什么将RSA公共指数设置为1的提交会出现问题?


​ 今天在cryptohack上做了一道公钥为1的题目,当我计算出明文的时候发现其与密文一模一样,这不经让人深思,是不是当公钥为1时,根本没有对原来的明文成功加密?

对此网上有这样一个回答:

简而言之,当e=1时,d=1,加密是恒等映射,即不加密。

RSA 是一种密码系统——一种执行密钥生成、加密和解密的方法——以便您可以安全地向其他人发送消息。 RSA 是称为公钥密码系统的一类成员,因为用于加密消息的密钥是公开的并且每个人都可以自由地知道。您用来解密用公钥加密的消息的密钥是秘密的,只有您知道,因此我们将其称为私钥

如果您将挂锁和钥匙想象为公钥和私钥的模拟,您可以看到这如何处理现实世界的消息:

  • 鲍勃给了爱丽丝一把挂锁(他的公钥)并保留了锁的钥匙(他的私钥)。
  • 现在,如果爱丽丝想向鲍勃发送消息,她会将消息放入一个盒子中,将他的挂锁放在盒子上,然后将盒子发送给他。
  • 只有鲍勃有钥匙,因此只有鲍勃可以打开挂锁并进入盒子。

为了实际生成密钥,RSA 需要三个重要的数字:

  • “N”,两个非常大的素数 p 和 q 的乘积
  • “e”,“公共指数”
  • “d”,“私人指数”

RSA 安全性的很大一部分来自于这样一个事实:给定 N 和 e ,要弄清楚d是什么应该是非常困难的。

换句话说,如果我不知道鲍勃的挂锁是什么样子,那么逆向工程一把钥匙来打开鲍勃的挂锁应该是非常困难的。

为什么1不好?

1是一个糟糕的选择,因为它很容易对打开鲍勃挂锁的钥匙进行逆向工程,这与我们想要的相反。

有问题的部分完整如下所示:

1
2
3
4
def gen_keys(keydir, keyname, keysize, user=None):
# Generate a keypair for use with salt
# ...
gen = RSA.gen_key(keysize, 1, callback=lambda x, y, z: None)

这是一个 Python 片段,可生成 RSA 密钥e = 1

Ne、 和之间的关系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,所以密文根本没有得到加密。