使用两个密钥的数字签名算法
Digital signing algorithms with two keys
我一直在研究数字签名,并阅读了有关私钥和 public 密钥的内容。这是我得到它的方式:
- 有人有消息
M
并生成签名 S = SomeAlgorithm1(PrivateKey, M)
- 接收方获得消息
M
和签名 S
- 接收方像
result = SomeAlgorithm2(PublicKey, S)
一样对签名进行解码并检查是否result == M
.
- 如果是,一切都很好。
但 ff 其他人知道 public 密钥,并生成随机签名 S
并执行 M = SomeAlgorithm2(PublicKey, S)
并将 M
和 S
发送到接收方.
接收方执行上面第 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 答案 ...
我一直在研究数字签名,并阅读了有关私钥和 public 密钥的内容。这是我得到它的方式:
- 有人有消息
M
并生成签名S = SomeAlgorithm1(PrivateKey, M)
- 接收方获得消息
M
和签名S
- 接收方像
result = SomeAlgorithm2(PublicKey, S)
一样对签名进行解码并检查是否result == M
. - 如果是,一切都很好。
但 ff 其他人知道 public 密钥,并生成随机签名 S
并执行 M = SomeAlgorithm2(PublicKey, S)
并将 M
和 S
发送到接收方.
接收方执行上面第 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 答案 ...