簡體   English   中英

RSA/ECB/PKCS1Padding C# 解密錯誤字符串到 PrivateKey

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

我在私鑰轉換中遇到錯誤,我無法解密。 錯誤: System.InvalidCastException:無法將“Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair”類型的 object 轉換為“Org.BouncyCastle.Crypto.AsymmetricKeyParameter”類型。

當我將其轉換為 AsymmetricCipherKeyPair 類型時,該類型與底線不匹配。 我在等你的幫助。

    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;
        }

該代碼本質上包含與轉換相關的錯誤,這些錯誤在調試期間通過確定 object 類型最容易識別:

我在私鑰轉換中遇到錯誤,我無法解密。 錯誤:System.InvalidCastException:無法將“Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair”類型的 object 轉換為“Org.BouncyCastle.Crypto.AsymmetricKeyParameter”類型。

您不能像公鑰那樣 1:1 導入私鑰,因為兩者的格式不同。 PemReader在私鑰的情況下返回不同的 object 類型,即AsymmetricCipherKeyPair ,您不能將其轉換為AsymmetricKeyParameter 這就是錯誤消息所說的。 所以它必須是:

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

當我將其轉換為 AsymmetricCipherKeyPair 類型時,該類型與底線不匹配。

您還需要修改此行。 在這里,您必須傳遞一個必須強制轉換為keyPairRaw.PrivateRsaPrivateCrtKeyParameters

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

通過這些更改,私鑰的導入工作。


另一個錯誤是在解密中。 密文在加密時是 Base64 編碼的,因此在解密時它必須是 Base64 解碼而不是 ASCII 編碼,即正確的是:

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

請記住,在 .NET 中導入密鑰的選項高度依賴於版本。 在某些版本中,您可以直接導入 PEM 密鑰(例如,從 .NET 5 開始),因此不需要 BouncyCastle。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM