C# 带私钥加密的公钥密码

C# 带私钥加密的公钥密码,c#,encryption,cryptography,key,public,C#,Encryption,Cryptography,Key,Public,我试图在C#中实现以下内容: 我想要一个内置公钥加密例程的生成器。它可以获取提供给它的字节数组(通常由下面描述的客户机提供),并使用其私钥对其进行加密 客户端有一个与生成器共享的公钥。它从生成器获取结果,并使用公钥对其进行解密。它获取最初提供给生成器的字节数组,并比较结果以查看它们是否对齐。这个想法是,如果它们匹配,它能够在一定程度上确定生成加密字节的人是否拥有私钥。它还能够验证特定的加密值是否对应于它提供的数据 我看到的大多数内置C#公钥加密库都希望将私钥与解密相关联(例如rsacyptose

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

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

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

我看到的大多数内置C#公钥加密库都希望将私钥与解密相关联(例如rsacyptoserviceprovider)。我明白为什么了,因为很多场景都涉及到保护过程的解密端而不是加密。是否有任何C#库可以直接保护加密过程?我整个上午都在看Bouncy Castle,但即使是在基本场景下,我也很难让它正常工作。文档中还有一些需要改进的地方

同样,我的主要目标是确保加密产生的任何东西都拥有私钥。客户机还必须确保生成器的结果与其提供的信息一致。如果有我遗漏的其他方法可能更好地符合可用库,我洗耳恭听:)

您写道:

再次强调,我的主要目标是确保任何产生 加密拥有私钥

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

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

你写:

再次强调,我的主要目标是确保任何产生 加密拥有私钥

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


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

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