Вы можете открыть PFX в .NET, как следующее:
var path = <YOUR PFX FILE PATH>;
var password = <YOUR PASSWORD>;
var collection = new X509Certificate2Collection();
collection.Import(path, password, X509KeyStorageFlags.PersistKeySet);
Затем перечислить через X509Certificate2Collection
. Если у вас есть сертификат (при условии что один сертификат), а затем:
var certificate = collection[0];
Для шифрования данных, вы можете использовать:
var publicKey = certificate.PublicKey.Key as RSACryptoServiceProvider;
var encryptedData = publicKey.Encrypt(<yourdata>, false);
Здесь я не использовал OAEP
для шифрования, но вы можете использовать его, установив fOAEP
на true
для второго параметра.
Для расшифровки данных, вы можете использовать:
var privateKey = certificate.PrivateKey as RSACryptoServiceProvider;
var data = privateKey.Decrypt(encryptedData, false);
сертификат в PFX не может иметь соответствующий закрытый ключ, так что вы можете использовать следующее свойство, чтобы проверить, если закрытый ключ существует до получения доступа к PrivateKey
недвижимость
if (!certificate.HasPrivateKey)
throw new Exception("The certificate does not have a private key");
Если вы зашифровали с OAEP
, то вы должны расшифровать с fOAEP
набор для true
.
Для регистрации данных, вы можете использовать:
var signature = privateKey.SignData(<yourdata>, "SHA1");
Для проверки подписи, вы можете использовать:
var isValid = publicKey.VerifyData(<yourdata>, "SHA1", signature);
Здесь я использовал SHA1
которая не считается сильным. Вы можете использовать другие алгоритмы хеширования, такие как SHA256
, которые сильнее.
И, наконец, если вы являетесь маленькой строкой, то предыдущая процедура прекрасна. Однако, если вы шифруете большие данные, я предлагаю использовать симметричное шифрование и затем шифровать симметричный ключ с помощью открытого ключа. (См. X509Certificate2 Class для полного примера)
Спасибо! Но у меня также есть следующая проблема.Я подписываю сообщение с закрытым ключом сертификата. У меня также есть много других сертификатов. Я получаю подписанное сообщение, и мне нужно знать, какой открытый ключ мне нужно проверить это сообщение. Могу ли я получить эту информацию из сообщения или предоставить дополнительные данные с сообщением? – Aluminium
Это зависит от формата сообщения, который у вас есть, и содержит ли он идентификатор сертификата, который его подписал. В противном случае вы должны предоставить дополнительные данные с сообщением. –
Какой формат я могу использовать для передачи сообщения и идентификатора сертификата вместе? Предоставляет ли System.Security.Cryptography это? – Aluminium