我知道用我的私钥加密某些东西是用来签名的。为了证明消息确实来自我。
但是如果我用我的公钥签名呢?这意味着只有我可以用我的私钥解密它。
假设我这样做了,并且我将我的密文(用我的公钥加密)发送给了某人。他能解密吗?
我知道用我的私钥加密某些东西是用来签名的。为了证明消息确实来自我。
但是如果我用我的公钥签名呢?这意味着只有我可以用我的私钥解密它。
假设我这样做了,并且我将我的密文(用我的公钥加密)发送给了某人。他能解密吗?
有一个普遍的误解,即签署消息与使用私钥加密消息相同。这个概念从根本上是不正确的,正如Thomas Pornin在如果公钥不能用于解密由私钥加密的内容中所指出的,那么数字签名如何工作?. 正如 Pornin 解释的那样,加密/解密和签名/验证实际上是两种不同的算法。私钥可用于解密使用相应公钥加密的消息,或签署消息;但是私钥不能用于加密消息。
同样的逻辑,用公钥签署消息的概念也是根本不正确的。公钥可用于加密消息,或使用相应的私钥验证消息上的签名;但是公钥不能用于签署消息。
这里有很多混合术语。简而言之, RSA 签名不是康奈尔 CS 的 RSA 解密。
不幸的是,RSA 是一种陷门排列,它既可用于加密又可用于签名。这造成了一个普遍的混淆。
首先,虽然 RSA 可以用于加密,但我们不能。我们更喜欢混合加密,其中公钥密码系统用于密钥交换,密钥用于对称算法。DHKE-AES AES 和 RSA-KEM AES 就是示例。
如果一个人真的想用 RSA 加密发送消息,他们应该忘记使用教科书 RSA,它不使用填充机制来保证安全。PKCS#1 v1.5和OAEP 填充可用于 RSA 加密。后者更可取,因为前者难以正确实施,导致许多攻击。
如果要对消息进行签名,则应使用概率签名方案(PSS)。并且在签名时,我们不会对消息进行签名,而是对消息的哈希进行签名。这是必要的,因为消息可能很长并且用于安全证明。
当我用我的 RSA 公钥加密某些东西时会发生什么?
如果您使用没有填充的公钥对其进行加密,那么如果公钥为 3,则立方根攻击有效。现在忘记没有填充的加密。使用正确的填充,您自己发送了消息,仅此而已。
我知道用我的私钥加密某些东西是用来签名的。为了证明消息确实来自我。
但是如果我用我的公钥签名呢?这意味着只有我可以用我的私钥解密它。
公钥很小,如果您真的将其用于签名,则假定它是已知的,这意味着存在数字签名伪造。攻击者获取您的公钥(e,n)并伪造签名。
正确的术语不是解密,而是签名的验证。对于签名,我们有sign和verify功能。
假设我这样做了,并且我将我的密文(用我的公钥加密)发送给了某人。他能解密吗?
对于签名,解密不是操作。验证和伪造是操作。如果您使用公钥,那么他们将进行伪造。
最后说明:虽然 RSA 支持加密和数字签名,但我们不会为不同的操作使用相同的密钥。在 RSA 中,您需要两个不同的集合。
对于好奇的读者,这里是 Dan Boneh 关于 RSA 攻击的文章。
我将假设 RSA 具有我们希望的安全属性。特别是,我假设如果有人知道消息 p、公钥 pubKey 和 enc(p,pubKey) 的值,那么他们将很难计算出相应的私钥 priKey。而且,即使他们有很多很多纯文本/密文对,你的私钥仍然很难计算。这里难以计算意味着他们要么需要大量时间,要么需要大量硬件,或者两者兼而有之。(没有证据证明这一假设,但知道当使用足够多的位时知道一种破解 RSA 的方法似乎是真的。)
假设您使用您的公钥加密(而不是签名)消息 m,并将结果发送给某人 enc(m, pubKey)。并假设他们也知道你的公钥。从第一段的假设来看,当 m 扮演 p 的角色时,你的私钥将是安全的。即使他们以某种方式知道m,它仍然是安全的。
签名通常意味着用你的私钥加密你的消息的散列,即你发送 (m, s) where s = enc(h(m), privKey)。然后使用您的公钥的接收者可以检查 dec(s, pubKey) = h(m),这意味着 s 是 enc(h(m), privKey),因此(几乎可以肯定)一定是由知道的人计算出来的私钥。
(上一段中的这条推理链实际上依赖于第一段中没有说明的 RSA 和 h 的属性,即,如果有人知道 pubKey,但不知道 privKey,那么他们很难计算出一对( m,s) 使得 dec(s, pubKey)=h(m)。但这完全不相关,因为问题是关于使用公钥签名。)
如果您错误地使用您的公钥签名,那么您发送 (m, enc(h(m), pubKey))。现在接收者或窃听者将知道 h(m)、enc(h(m)、pubKey),并且可能还知道 pubKey。这与第一段中描述的情况相同,h(m) 扮演 p 的角色。因此,您的私钥再次安全。(接收者也知道 m,但知道 m 应该没有任何帮助,除非消息说“我的私钥是……。”)