从我的证书中,我想检索公钥然后解密我的消息。 我使用 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,它要求证书知道在哪里可以找到它(。