通过aspnet_regiis创建密钥容器,并通过.NET中的RSACryptoServiceProvider创建签名消息

时间:2017-02-24 10:41:59

标签: .net digital-signature rsacryptoserviceprovider aspnet-regiis.exe

我正在研究在Windows和.NET中签名消息的正确方法。

我计划使用aspnet_regiis在服务器的机器密钥容器中创建密钥对,导出公钥并将其导入客户机的密钥容器中。我在自己的电脑上测试了服务器和客户端。

C:\Windows\Microsoft.NET\Framework64\v4.0.30319>aspnet_regiis -pc MyKeys -exp
C:\Windows\Microsoft.NET\Framework64\v4.0.30319>aspnet_regiis -pa MyKeys "MyUserAccount"
C:\Windows\Microsoft.NET\Framework64\v4.0.30319>aspnet_regiis -px MyKeys D:\temp\myPublicKey.xml
C:\Windows\Microsoft.NET\Framework64\v4.0.30319>aspnet_regiis -pi MyPublicKey D:\temp\myPublicKey.xml -exp
C:\Windows\Microsoft.NET\Framework64\v4.0.30319>aspnet_regiis -pa MyPublicKey "MyUserAccount"

在我的控制台应用程序中,我使用RSACryptoServiceProvider对邮件进行签名并验证。

string message = "This is the message!";
byte[] data = Encoding.UTF8.GetBytes(message);


// Sign message (server)

var rsaPrivate = new RSACryptoServiceProvider(new CspParameters
{
    KeyContainerName = "MyKeys",
    KeyNumber = 2,    // tried to comment this line, same false result
    Flags = CspProviderFlags.UseMachineKeyStore
});

byte[] signedData = rsaPrivate.SignData(data, new SHA512CryptoServiceProvider());
string signedMessage = Convert.ToBase64String(signedData);


//... Server sends message + signedMessage to client

// Verify message (client)

var rsaPublic = new RSACryptoServiceProvider(new CspParameters
{
    KeyContainerName = "MyPublicKey",
    KeyNumber = 2,    // tried to comment this line, same false result
    Flags = CspProviderFlags.UseMachineKeyStore
});

byte[] clientData = Encoding.UTF8.GetBytes(message);
byte[] clientSignedData = Convert.FromBase64String(signedMessage);
bool verify = rsaPublic.VerifyData(clientData, new SHA512CryptoServiceProvider(), clientSignedData);
// verify = false

如果成功,下一步我将硬编码的密钥容器名称移动到.config文件。 aspnet_regiis将成为部署步骤。

愿任何人告诉我,我做错了哪一步?或者我在RSACryptoServiceProvider中使用aspnet_regiis的整个概念是错误的? - 我之所以这么说,是因为我找不到将两者结合使用的例子。谢谢。

0 个答案:

没有答案