2013-04-13 158 views
2

我想在C#中实现以下内容:私钥加密公钥加密

我想要一个内部存放公钥加密例程的Generator。它可以提供一个字节数组(通常由下面描述的客户端)并用其私钥对其进行加密。

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

我看到的大多数内置C#公钥加密库都希望将私钥与解密关联起来(如RSACryptoServiceProvider)。我明白了为什么,因为很多场景都涉及保护进程的解密端而不是加密。是否有任何C#库可以直接保护加密过程?我已经尝试过整天早上看充气城堡,但我很难让它适用于基本场景。该文件留下了一些东西...

再次,我的主要目标是确保无论产生的加密拥有私钥。客户也必须确保发电机的结果与其提供的信息相符。如果有我失踪,可能更好地符合可用的库替代办法,我所有的耳朵:)

+0

所以你想要发生器产生一个签名? – Filip

+1

这已经“选择了明文攻击”写在它上面。公钥密码系统依赖于私钥的拥有者,该私钥是生成用该密钥签名的消息的实体。如果您希望生成器能够证明它拥有与给定公钥相关联的私钥,那么让生成器生成一个由可以散列的随机位组成的文档,然后发布散列,signed-with-private密钥哈希和文档。任何拥有公钥的人都可以验证散列,签名散列和文档匹配。 –

+1

如果你绝对必须让客户端 - 记住*应该由生成者假设为攻击者* - 提供文档然后至少让生成器*将随机位附加到文档*,然后*散列新文档*,然后*加密散列*。同样,生成器可以发布修改过的文档,散列和签名散列,并且客户端可以验证它们全都匹配。但只有在绝对必要时才这样做。您永远不想为攻击者*加密文档*。 –

回答

4

你写:

同样,我的主要目标是确保,无论生产 加密拥有私钥。

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

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