首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >RSA/ECB/ Error 1向C#填充PrivateKey分解错误字符串

RSA/ECB/ Error 1向C#填充PrivateKey分解错误字符串
EN

Stack Overflow用户
提问于 2022-08-03 10:30:25
回答 1查看 117关注 0票数 0

我的私钥转换出了一个错误,我无法解密。'Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair‘错误: System.InvalidCastException:无法将类型为的对象强制转换为'Org.BouncyCastle.Crypto.AsymmetricKeyParameter'.

当我将其转换为AsymmetricCipherKeyPair类型时,该类型在底线中不匹配。我在等你的帮助。

代码语言:javascript
运行
复制
    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;
        }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-03 12:17:08

代码本质上包含与转换相关的bug,这些bug在调试过程中最容易通过确定对象类型来识别:

我在私钥转换中得到一个错误,我无法解密。错误:无法将'Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair‘类型的对象转换为'Org.BouncyCastle.Crypto.AsymmetricKeyParameter'.类型

您不能像公钥一样导入私钥1:1,因为这两种密钥都有不同的格式。在私钥的情况下,PemReader返回一个不同的对象类型,即AsymmetricCipherKeyPair,您不能将其转换为AsymmetricKeyParameter。错误信息就是这样说的。因此,必须是:

代码语言:javascript
运行
复制
AsymmetricCipherKeyPair keyPairRaw = (AsymmetricCipherKeyPair)pemReader.ReadObject();

将其转换为AsymmetricCipherKeyPair类型时,该类型在底线中不匹配。

您也需要修改这一行。在这里,您必须传递一个必须转换为keyPairRaw.PrivateRsaPrivateCrtKeyParameters

代码语言:javascript
运行
复制
RSAParameters rsaParams = DotNetUtilities.ToRSAParameters((RsaPrivateCrtKeyParameters)keyPairRaw.Private);

通过这些更改,导入私钥工作。

另一个漏洞在解密中。密文在加密过程中是Base64编码的,因此它必须在解密期间被Base64解码,而不是ASCII编码,即正确的是:

代码语言:javascript
运行
复制
var decrypted = privateKeyDecyrpt.Decrypt(Convert.FromBase64String(encryptedPayload), RSAEncryptionPadding.Pkcs1);

请记住,在.NET中导入密钥的选项高度依赖于版本。在某些版本中,您可以直接导入PEM密钥(例如,从.NET 5开始),这样就不需要BouncyCastle了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73220203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档