简体   繁体   English

RSA/ECB/PKCS1Padding C# 解密错误字符串到 PrivateKey

[英]RSA/ECB/PKCS1Padding C# Decyription Error String To PrivateKey

I'm getting an error in Private Key conversion, I can't decrypt.我在私钥转换中遇到错误,我无法解密。 Error: System.InvalidCastException: Could not cast object of type 'Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair' to type 'Org.BouncyCastle.Crypto.AsymmetricKeyParameter'.错误: System.InvalidCastException:无法将“Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair”类型的 object 转换为“Org.BouncyCastle.Crypto.AsymmetricKeyParameter”类型。

When I convert it to AsymmetricCipherKeyPair type, the type does not match in the bottom line.当我将其转换为 AsymmetricCipherKeyPair 类型时,该类型与底线不匹配。 I am waiting for your help.我在等你的帮助。

    static void Main()
        {
            var plainData = "plain_text";
            RSA publicKeyEncryptor = getRSAPublic(@"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlYB5JrwA9fMxZxTRhG0NnKRwJizMZGJNq/xFfFxaEmKp3O6vZgsZMlFTi2kSC++yR/KriGKuGgbIYrgomn7BueoooAw5KLVO9CKKtNyQgg28vdOBbnQqljA+KID0PouAD8MqpDk9opi41zeEQPOSkAUsq5sHMptG7h9cgj0mNr2c4ffNolHAhPsrZVtGYtswhtznDkG463VOKLAmDLDeY9bASUsQXFOY+Em93GHFjStgZSTIEBof6HbUqIQf2rGjuPYCQsB/94BFma58epGz12zUPwKFMuxg89wbLOCjyAkocgS9zDnwKr7DVv08GmCUVVqI6ySzbWpKhiqWQvz4hwIDAQAB");
            var plainBytes = Encoding.ASCII.GetBytes(plainData);
            string encryptedPayload = System.Convert.ToBase64String(publicKeyEncryptor.Encrypt(plainBytes, RSAEncryptionPadding.Pkcs1));
         
            RSA privateKeyDecyrpt = getRSAPrivate();
            var y = privateKeyDecyrpt.Decrypt(Encoding.ASCII.GetBytes(encryptedPayload), RSAEncryptionPadding.Pkcs1);
            Console.WriteLine(encryptedPayload);
        }
        public static RSA getRSAPublic(string publicKey)
        {
            string publicKeyPem = $"-----BEGIN PUBLIC KEY-----\r\n{ publicKey }\r\n-----END PUBLIC KEY-----\r\n";
            var pemReader = new PemReader(new StringReader(publicKeyPem));
            AsymmetricKeyParameter keyPairRaw = (AsymmetricKeyParameter)pemReader.ReadObject();
            RSAParameters rsaParams = DotNetUtilities.ToRSAParameters((RsaKeyParameters)keyPairRaw);
            RSA rsaObj = System.Security.Cryptography.RSA.Create();
            rsaObj.ImportParameters(rsaParams);
            return rsaObj;
        }

        public static RSA getRSAPrivate()
        {
            string privateKeyPem = @"-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAlYB5JrwA9fMxZxTRhG0NnKRwJizMZGJNq/xFfFxaEmKp3O6v
ZgsZMlFTi2kSC++yR/KriGKuGgbIYrgomn7BueoooAw5KLVO9CKKtNyQgg28vdOB
bnQqljA+KID0PouAD8MqpDk9opi41zeEQPOSkAUsq5sHMptG7h9cgj0mNr2c4ffN
olHAhPsrZVtGYtswhtznDkG463VOKLAmDLDeY9bASUsQXFOY+Em93GHFjStgZSTI
EBof6HbUqIQf2rGjuPYCQsB/94BFma58epGz12zUPwKFMuxg89wbLOCjyAkocgS9
zDnwKr7DVv08GmCUVVqI6ySzbWpKhiqWQvz4hwIDAQABAoIBAEJFR+8Gqbpcykpy
bQmxubX1Io2ZkCTzepDBbB/bZEYAHGIGIBQw2UN3z3vd4JUP9Mx14tm7PIfm987i
6YTKqZ97D/UaVgAYlt4brbbMivZLlp3i8t3+ep5G1lboCtzqw6K5Fd7kTNEVt+IX
BvYvwok68flD6GXjdQa7Oiu1ZYofxXOBg84RDWu6E6edDj/XaaX12WOYaQ4p6zDn
jyYNMiYYkKoUI1a884cN50WAAIGs0n3TxgJGXZa0n/Y3CpvuphAoHPQQs7ZyJPlP
k29gaFXdotzv1TDKk0I+eTIlonMl1EyW0wDPvfMuV7EYNNfmtmqrT3OWkOpUU8fO
9eDKhukCgYEA5nlVlTKAx5LsKI3KGRQF3jiWAaQAUKoON68Sx47fSJSv317QyZqM
qbQTLz5vSytbTyHhgIEc2dtdRbl7MYkvvzaizjPDEHEJSwlTmnzt81qGYtjNGC+j
tz6Bx5MGDE8Ax3ls60Lm0uH9TMQyJZWTepZGght5WXP5NpmzJ6zG7D0CgYEApg9S
zZyMN1rNtcz6Pqaqll33hchIQd+vh2LLKkHAoQP93oWtipxyT08yr4tQ5ke3nwjj
onIt6KR0U2aSIv9OUwXw2cSwghCIqTKmtont88WXYh9zRtnZ+U0An9r3x+fr7e8y
wpk7lFPP840pzQQjyEQ2s3woMlssqOiS6SyGMBMCgYB04KVBEypxixWN/1G05A2R
wxp3XIb4YTTykisw3khnU1fZLAkvo9ufl/1+oOfps+QLPkBQXamW5YLogAZ0eYCo
NHndnixW4yv2TJWEK8Sz+31ZFV702/vnSqCf5/RSO6JGhlJxAC10VjyROJHBs5fl
u92nz2z7qy9/u/Q5s4nxdQKBgAx6qFFVS2A5ja302nVs1vL32ssN8wgoRCubbAMf
79bp0uEvEIyTFzAIlpmEka7MgusLovepNvP9r9Q4qBDDOOKaVrA2zMDpdyun58ld
8ijYl3jDPkl7w5qtg7d/oBFAx4UY7aqcE1MhPUZjPFnwzrOVFLtGQEsQePm0iJ3H
P8pLAoGAUCC6KxGF20y0uBnSLS2q3iqAqZNO57ZLnJRAscsViNEhqn4G5OZbcANa
RsyFluCwjuKFg9yW9s6ZKzjPXsAEWTyXpayICSG4gJBRfdzUol5Sjo9JweqMhiVh
5G9uBYx3+kEpYNvJDcYK89HQ3fAcfeZ1o9sXYtwccOulSQ5euAE=
-----END RSA PRIVATE KEY-----";
            var pemReader = new PemReader(new StringReader(privateKeyPem));
            AsymmetricKeyParameter keyPairRaw = (AsymmetricKeyParameter)pemReader.ReadObject();
            RSAParameters rsaParams = DotNetUtilities.ToRSAParameters((RsaKeyParameters)keyPairRaw);
            RSA rsaObj = System.Security.Cryptography.RSA.Create();
            rsaObj.ImportParameters(rsaParams);
            return rsaObj;
        }

The code essentially contains casting-related bugs that are most easily identified during debugging by determining the object types:该代码本质上包含与转换相关的错误,这些错误在调试期间通过确定 object 类型最容易识别:

I'm getting an error in Private Key conversion, I can't decrypt.我在私钥转换中遇到错误,我无法解密。 Error: System.InvalidCastException: Could not cast object of type 'Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair' to type 'Org.BouncyCastle.Crypto.AsymmetricKeyParameter'.错误:System.InvalidCastException:无法将“Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair”类型的 object 转换为“Org.BouncyCastle.Crypto.AsymmetricKeyParameter”类型。

You can't import the private key 1:1 like the public key, because both have different formats.您不能像公钥那样 1:1 导入私钥,因为两者的格式不同。 The PemReader returns a different object type in the case of the private key, namely AsymmetricCipherKeyPair , which you cannot cast into an AsymmetricKeyParameter . PemReader在私钥的情况下返回不同的 object 类型,即AsymmetricCipherKeyPair ,您不能将其转换为AsymmetricKeyParameter This is what the error message says.这就是错误消息所说的。 So it must be:所以它必须是:

AsymmetricCipherKeyPair keyPairRaw = (AsymmetricCipherKeyPair)pemReader.ReadObject();

When I convert it to AsymmetricCipherKeyPair type, the type does not match in the bottom line.当我将其转换为 AsymmetricCipherKeyPair 类型时,该类型与底线不匹配。

You need to modify this line as well.您还需要修改此行。 Here you have to pass a keyPairRaw.Private that must be cast to RsaPrivateCrtKeyParameters :在这里,您必须传递一个必须强制转换为keyPairRaw.PrivateRsaPrivateCrtKeyParameters

RSAParameters rsaParams = DotNetUtilities.ToRSAParameters((RsaPrivateCrtKeyParameters)keyPairRaw.Private);

With these changes the import of the private key works.通过这些更改,私钥的导入工作。


Another bug is in the decryption.另一个错误是在解密中。 The ciphertext is Base64 encoded during encryption, therefore it must be Base64 decoded during decryption and not ASCII encoded, ie correct is:密文在加密时是 Base64 编码的,因此在解密时它必须是 Base64 解码而不是 ASCII 编码,即正确的是:

var decrypted = privateKeyDecyrpt.Decrypt(Convert.FromBase64String(encryptedPayload), RSAEncryptionPadding.Pkcs1);

Keep in mind that the options for importing keys in .NET are highly dependent on the version.请记住,在 .NET 中导入密钥的选项高度依赖于版本。 There are versions where you can import PEM keys out-of-the-box (eg as of .NET 5), so that BouncyCastle is not needed.在某些版本中,您可以直接导入 PEM 密钥(例如,从 .NET 5 开始),因此不需要 BouncyCastle。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM