Создать контейнер ключей с помощью aspnet_regiis и подписать сообщение с помощью RSACryptoServiceProvider в.NET

Я изучаю правильный способ подписать сообщение в 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 станет этапом развертывания.

Может кто-нибудь сказать мне, какой шаг я сделал не так? Или моя концепция использования aspnet_regiis с RSACryptoServiceProvider неверна? - Я так говорю, потому что не смог найти примеров, говорящих об использовании обоих вместе. Спасибо.

0 ответов

Другие вопросы по тегам