RSA 解密与 certificat 和 GetRSAPublicKey : 公钥不存在



从我的证书中,我想检索公钥然后解密我的消息。 我使用 X509Certificate2 从我的证书中获取信息,然后从 RSA 类解密,但我有错误:密钥不存在。

我在这里看到从 x509Certificate2 启动 RSACryptoService Provider 的最佳方法?

"从 .NET 4.6 开始,不再建议按照 的建议强制转换为 RSACryptoServiceProvider。现在这甚至是一个更大的问题,因为有多个版本的.NET(例如.NET Core(。

通过以这种方式强制转换为 RSACryptoServiceProvider,您很有可能会得到此强制转换异常(取决于所使用的平台和库(:

Unable to cast object of type 'System.Security.Cryptography.RSACng' to type 'System.Security.Cryptography.RSACryptoServiceProvider'

原因是实际实现可能因每个平台而异,在Windows RSACng上使用。

所以我尝试使用 RSA 类而不是 RSACryptoServiceProvider。

string pemcert;
X509Certificate2 Lcertificate = new X509Certificate2(Encoding.UTF8.GetBytes(pemcert));
//my message
byte[] bytesCypherText = Convert.FromBase64String(b64_crypted_text);
using (RSA LRSApublicKeyProvider = Lcertificate.GetRSAPublicKey())
{
string decrypted = Encoding.UTF8.GetString((LRSApublicKeyProvider.Decrypt(bytesCypherText, RSAEncryptionPadding.Pkcs1)));
return decrypted;
}

我有这个错误:

Certificat: Error => key doesn't exist
/  System.Security.Cryptography.CryptographicException
Certificat. StackTrace :    à System.Security.Cryptography.NCryptNative.DecryptData[T](SafeNCryptKeyHandle key, Byte[] data, T& paddingInfo, AsymmetricPaddingMode paddingMode, NCryptDecryptor`1 decryptor)
à System.Security.Cryptography.NCryptNative.DecryptDataPkcs1(SafeNCryptKeyHandle key, Byte[] data)
à System.Security.Cryptography.RSACng.Decrypt(Byte[] data, RSAEncryptionPadding padding)
à EA_Crocodile.CryptoHelper.RSADecryptJEAM(String b64_crypted_text, String pemcert) 

如果我这样做:

Lcertificate.GetPublicKeyString() I have the key: 3082020A0282020100B39A5....

如果我这样做:

Lcertificate.GetRSAPublicKey().ToString(): System.Security.Cryptography.RSACng

为什么 GetRSAPublicKey(( 似乎没有公钥? 这是最好的解密方法吗?

RSA 公钥只能用于加密或签名验证。

对于解密,您需要私钥(GetRSAPrivateKey,它要求证书知道在哪里可以找到它(。

最新更新