使用两个密钥的数字签名算法

Digital signing algorithms with two keys

我一直在研究数字签名,并阅读了有关私钥和 public 密钥的内容。这是我得到它的方式:

  1. 有人有消息 M 并生成签名 S = SomeAlgorithm1(PrivateKey, M)
  2. 接收方获得消息 M 和签名 S
  3. 接收方像result = SomeAlgorithm2(PublicKey, S)一样对签名进行解码并检查是否result == M.
  4. 如果是,一切都很好。

但 ff 其他人知道 public 密钥,并生成随机签名 S 并执行 M = SomeAlgorithm2(PublicKey, S) 并将 MS 发送到接收方. 接收方执行上面第 3 步中的操作,并说它很好,尽管它不是......他们可能会收到一些没有多大意义的消息。

我的问题是,是不是只有这条毫无意义的消息才能让这种黑客攻击变得不可能?理论上,如果该消息是合理的消息,那么黑客就会成功?

通常签名涉及消息的哈希...

所以(简化的)程序是

取你的消息 M 并计算 H1 = hash(M)

取你的私钥Kpriv并计算S = sign(H1,KPriv)

将 S 附加到 M 并转给收件人

收件人计算H2 = hash(M)

然后获取您的 Public 密钥 KPub 并计算 verify(S,KPub,H2) = true / false

(因为您在第 3 步中提到了类似 'decoding' 的签名...)您可能熟悉这样一个事实,即在 RSA 案例中,sign() 和 verify() 背后的操作确实是encrypt() 和 decrypt(),但请注意,这并不适用于所有签名算法,并且确实是 RSA

的特例

所以如果我们看一个例子,事情可能会变得更清楚:

在 RSA 案例中,上面的 verify(S,KPub,H2) 是:H2 == decrypt(S,KPub)

这适用于 RSA,因为从数学的角度来看,public 和私有指数是可以互换的,并且加密和解密背后的数学运算非常相同......所以上面变成了 H2 == POW(POW(H1,d),e) mod N ... N 是模数,d 是私有指数,e 是 public 指数 ... 因为 e 和 d 是选择(在创建密钥对时)以便 e*d mod phi(N) = 1 ... phi() 是欧拉 phi 函数 ... 计算变为 H2==POW(H1,1) mod N ...(费马小定理)...归结为 H2 == H1 ...

H1 由签名者计算...H2 由收件人计算...如果这两者相互匹配,则消息很可能是真实的...当然如果攻击者可以选择 M和 M' with hash(M)==hash(M'),换句话说,如果有人可以找到 2 条消息的哈希冲突,签名就变得无用了......你将有 verify(S,KPub,hash(M' ))== true 即使签名者从未见过 M'

所以说了所有这些......回到你最初的问题......

如果攻击者运用他对 verify() 或您的示例 SomeAlgorithm2() 中计算的内容的知识,会发生什么情况...?

让我们从所有这些中去除散列...而不是处理散列,我们直接对消息 M 进行操作...

确实如此,在 RSA 示例中,攻击者可以在这种情况下从 S 中恢复 M(假设 M 足够小,不会被 mod N 截断)

但是攻击者会得到原始消息……M……他已经知道了……所以是的……他可以将其发送给其他人……连同 S……他知道也已经知道了...

他没有赢得任何东西,因为他不能在不破坏签名的情况下改变 M ...

如前所述...RSA 是一种特殊情况,因为加密、解密签名和验证...都归结为相同的数学运算...

一旦包含散列,您所能恢复的就是散列...但仍然是已签名的相同散列

使用其他算法,有时您最终 true/false 没有其他任何东西 ...

但所有这些都不是重点...您所谈论的信息不是秘密...它确实与已签名的信息完全相同...

攻击者不仅需要从验证过程中获取该信息...他需要能够实际更改 M 中的某些内容并计算对 S 的最终更改...

如果他能做到那他就破坏了签名算法

作为替代方案,他可以尝试如上所述破坏散列函数......在那种情况下他并没有真正破坏签名,因为它仍然是相同的值......但他能够破坏系统其目标是证明 M 的真实性......它就像一条信任链​​......它与最弱者一样强大 link

整个主题比这复杂得多,但我认为这对于初学者来说可以作为一个简化的纲要...如果在此实现 RSA 签名系统,则存在可以暴露私钥的攻击向量没有进一步预防措施的简化方法……所以……不要!

这只是为了展示在这种情况下签名和验证的实际情况......对于现实世界的实施,你需要包括填充和进一步的消息结构和标识符......复杂的方式简单的 SO 答案 ...