带有私钥加密的公钥加密

Posted

技术标签:

【中文标题】带有私钥加密的公钥加密【英文标题】:Public Key Crypto with Private Key Encryption 【发布时间】:2013-04-06 01:05:43 【问题描述】:

我正在尝试在 C# 中实现以下内容:

我想要一个内部包含公钥加密例程的生成器。它可以接受提供给它的字节数组(通常由下面描述的客户端)并使用其私钥对其进行加密。

客户端拥有与生成器共享的公钥。它从生成器获取结果并使用公钥对其进行解密。它采用最初提供给生成器的字节数组并比较结果以查看它们是否对齐。这个想法是,如果它们匹配,它能够在一定程度上确定生成加密字节的人拥有私钥。它还能够验证特定的加密值是否与其提供的数据相对应。

我看到的大多数内置 C# 公钥加密库都希望将私钥与解密相关联(例如 RSACryptoServiceProvider)。我明白为什么,因为很多场景都涉及保护过程的解密端而不是加密。是否有任何 C# 库可以直接保护加密过程?我整个早上都在尝试看 Bouncy Castle,但即使是基本场景,我也很难让它发挥作用。文档还有一些不足之处......

同样,我的主要目标是确保产生加密的任何东西都拥有私钥。客户端还必须确保生成器的结果与其提供的信息相对应。如果我错过了可能更好地符合可用库的替代方法,我会全力以赴:)

【问题讨论】:

所以您希望生成器生成签名? 上面写满了“选择明文攻击”。公钥密码系统依赖于私钥的拥有者,即生成要使用该密钥签名的消息的实体。如果您希望生成器能够证明它拥有与给定公钥相关联的私钥,那么让生成器生成一个由它可以散列的随机位组成的文档,然后发布散列,签名与私有-key 哈希和文档。任何拥有公钥的人都可以验证哈希、签名哈希和文档是否匹配。 如果您绝对必须让客户端——记住应该被生成器假定为攻击者——提供文档,那么至少有生成器将随机位添加到文档,然后散列新文档,然后加密散列。同样,生成器可以发布修改后的文档、散列和签名散列,客户端可以验证它们是否相互匹配。但只有在绝对必要时才这样做。您永远不想代表攻击者加密文档。 @iddqd 你有什么理由不想使用普通的digital signatures?例如RSACryptoServiceProvider.SignData 提供的那些。 RSA 签名在内部使用 RSA 私钥操作,但它们添加了适当的散列和填充,这对安全性很重要。只有知道私钥才能签名,并且可以用公钥进行验证。 @Eric 选择的明文攻击在这里似乎不适用。明文本身并不是我真正想要保护的东西,所以如果有人猜到客户端生成的明文,这并不是什么大问题。问题是客户端知道加密结果来自生成器,并且加密结果来自客户端最初提交的响应。我并不是想确保生成器和客户端通过密码共享秘密数据。 【参考方案1】:

你写:

再一次,我的主要目标是确保 加密拥有私钥。

正如 CodesInChaos 所提到的,您可以正确地使用签名来实现这一点。通常签名用于验证某些数据是由持有某个私钥的人产生的,但在这里您可以使用它来验证密钥持有者本人。如果您要求他签署您制作的东西,您可以通过使用签名检查来检查他是否拥有与您的公钥对应的私钥。

签名实际上是通过对某些数据进行单向散列,然后使用私钥加密此散列来工作的。然后可以使用公钥来验证签名,方法是解密散列并将其与重新计算的数据散列值进行比较。只有拥有私钥的人才能制作散列的加密版本。首先是你打算做什么。

【讨论】:

以上是关于带有私钥加密的公钥加密的主要内容,如果未能解决你的问题,请参考以下文章

为啥公钥加密只能私钥解密而不能公钥解密

请问SSL加密的公钥和私钥区别

java中RSA用私钥加密公钥解密问题

非对称加密中的公钥和私钥怎么来的

JAVA公钥加密,私钥解密,该怎么解决

加密中 公钥和私钥如何获得?