【问题标题】:How to encrypt with private key and decrypt with public key in c# RSA如何在 c# RSA 中使用私钥加密和使用公钥解密
【发布时间】:2014-12-20 09:08:13
【问题描述】:

我找到了几种解决方案,我可以使用 .Net RSA Provider 使用公钥加密消息并使用私钥解密。

但我想要的是用私钥加密并用公钥解密。

我想将公钥存储在我的应用程序中,并使用私钥在我的开发机器上加密许可证,将其发送到应用程序并让信息使用公钥解密。

我怎样才能做到这一点?

【问题讨论】:

  • 你不能。你只能用公钥加密,用私钥解密。你的意思是签名和验证,这是一个有效的许可证申请。您获得了身份验证,但没有保密。如果您想进行互动,您当然可以取得更多成就。
  • 非对称加密/解密:每个人都可以加密(使用公钥),只有主机可以解密(使用私钥)。 非对称签名/验证:只有主机可以签名(使用私钥),每个人都可以验证(使用公钥)。
  • @Zoya 如果您认为这是一篇好文章,那么您刚刚证明您完全错过了关于密码学的要点。奇怪,你的回答似乎另有说明。
  • @Maarten 为什么?我阅读并查看了示例代码。这对我来说很清楚。我可以理解它是如何工作的。但是,如果您能稍微解释一下为什么这段代码在密码学方面是坏的或错误的,那就太好了。 (我必须补充一点,我对密码学一无所知)
  • RSA 的安全证明依赖于使用的填充。这个使用了几个(太少)字节的填充,并且专有方案没有安全证明。

标签: .net cryptography rsa


【解决方案1】:

您可以使用签名生成,其中私钥用于生成验证您的消息真实性的签名。

// Create message and signature on your end
string message = "Here is the license message";

var converter = new ASCIIEncoding();
byte[] plainText = converter.GetBytes(message);

var rsaWrite = new RSACryptoServiceProvider();
var privateParams = rsaWrite.ExportParameters(true);

// Generate the public key / these can be sent to the user.
var publicParams = rsaWrite.ExportParameters(false);

byte[] signature =
    rsaWrite.SignData(plainText, new SHA1CryptoServiceProvider());

// Verify from the user's side. Note that only the public parameters
// are needed.
var rsaRead = new RSACryptoServiceProvider();
rsaRead.ImportParameters(publicParams);
if (rsaRead.VerifyData(plainText,
                       new SHA1CryptoServiceProvider(),
                       signature))
{
    Console.WriteLine("Verified!");
}
else
{
    Console.WriteLine("NOT verified!");
}

您可以从HERE获得更多帮助

【讨论】:

  • 我删除了术语“签名策略”,因为我从未听说过这样描述签名生成。
  • 如果您希望真正加密数据——而不仅仅是使用哈希验证其真实性怎么办?
  • @Syeda“生成公钥/这些可以发送给用户”你能解释一下如何吗?我该如何处理 RSAParameters 对象?谢谢
  • 链接已失效