如何在C# RSA中使用私钥加密并使用公钥解密

19

我找到了几个解决方案,可以使用.Net RSA提供程序使用公钥加密消息,并使用私钥进行解密。

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

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

我该如何实现?


1
你不能这样做。你只能使用公钥加密,使用私钥解密。你的意思是签名和验证,这是一个有效的许可应用程序。你可以获得认证,但没有保密性。如果你想使其交互式,当然可以实现更多。 - Artjom B.
4
非对称加密/解密:任何人都可以使用公钥进行加密,只有主机可以使用私钥进行解密。非对称签名/验证:只有主机可以使用私钥进行签名,任何人都可以使用公钥进行验证。 - barak manos
1
@Zoya 如果你认为那是一篇好文章,那么你刚刚证明了你完全没有理解密码学的整体概念。奇怪的是,你的回答似乎表明相反的意思。 - Maarten Bodewes
1
@Maarten 为什么?我已经阅读并查看了示例代码。对我来说很清晰,我能理解它的工作原理。但如果您能稍微解释一下为什么这段代码在密码学方面是错误或不好的,那就太好了。(我必须补充一点,我对密码学一无所知) - STORM
1
RSA的安全证明依赖于所使用的填充方式。这个填充方式使用了一些(太少)字节的填充,而专有方案没有安全证明。 - Maarten Bodewes
显示剩余4条评论
1个回答

15

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

// 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!");
}

你可以从这里寻求更多帮助。


1
我已经删除了术语“签名策略”,因为我从未听说过将签名生成描述为这种方式。 - Maarten Bodewes
7
如果您希望实际加密数据,而不仅仅是使用哈希验证其真实性,该怎么办? - Kraang Prime
@Syeda “生成公钥/可发送给用户”,你能解释一下怎么做吗?我应该如何处理RSAParameters对象?谢谢。 - KevinM
1
链接现已失效。 - Rubens Farias
2
@RubensFarias 我添加了一个存档副本的链接。 - StayOnTarget

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接