C#基于BouncyCastle实现PEM格式RSA加密报非RSA密钥异常问题
这个异常确实是公钥读取逻辑和传入的公钥格式不匹配导致的:
你代码里用的PemReader仅支持读取带标准PEM头尾标识的密钥内容,要求输入文本必须以-----BEGIN PUBLIC KEY-----开头、-----END PUBLIC KEY-----结尾。而你传入的是去掉了PEM头尾的纯Base64编码公钥内容,还插入了多处换行空格,PemReader无法从输入中解析出合法的RSA密钥参数,就会抛出Not an RSA key异常。
二选一即可:
- 方案1:将公钥补全为标准PEM格式,适配现有
PemReader逻辑
先把你现有公钥字符串里的所有空格、换行符全部删除,再补上PEM标准头尾,示例:string publicKey = @"-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlUCQZso6P43gKqw0CfTlwYb3N+m4v6IME4nPA3WXe52wFpDM/JCFWSdXa7BewlwzDYjblgwL4u59CPxNTPTh7LTD4xXOaGDJHjX5+YgqK4fb9rsImjMpIACrND/LAdrq5mctWWzw3UtW3F+o+sNwIZM8n65ysS+Vhq9IypFlfuQbWrKjAcWZ3u1iLtplzyf/pjhOEyyZiBUnh6D219+pMiE9nhCpc4xkH1gnlGszIDBqZMMULtGJvFXydA1vv5HxxCYJ2ydEzmAKYxVgA9BGXPEGE89dQbeJsieTj+FSsp9oTm+4vi345opRvH8DWhmZc4OPSwBEL8pwgS7cUnKPtwIDAQAB
-----END PUBLIC KEY-----";
用这个格式的公钥传入原有方法即可正常加密。 - 方案2:调整公钥读取逻辑,直接解析纯Base64格式公钥 如果你不想修改公钥字符串格式,可以去掉`PemReader`相关逻辑,先把公钥中的空白字符清理后转成字节数组,用`PublicKeyFactory`直接解析密钥参数,修改后的完整方法如下: ```csharp using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Encodings; using Org.BouncyCastle.Crypto.Engines; using Org.BouncyCastle.Security; using System; using System.Text; public string RsaEncryptWithPublic(string clearText, string publicKey) { byte[] clearBytes = Encoding.UTF8.GetBytes(clearText); Pkcs1Encoding encCipher = new Pkcs1Encoding(new RsaEngine()); // 清理公钥字符串中多余的空白字符 string cleanKey = publicKey.Replace(" ", "").Replace("\r", "").Replace("\n", ""); byte[] keyBytes = Convert.FromBase64String(cleanKey); AsymmetricKeyParameter pubKeyParam = PublicKeyFactory.CreateKey(keyBytes); encCipher.Init(true, pubKeyParam); return Convert.ToBase64String(encCipher.ProcessBlock(clearBytes, 0, clearBytes.Length)); }
注意:无论选哪种方案,都必须先把公钥Base64内容里插入的空格、换行全部删除,否则后续Base64解码环节也会抛出格式异常。
内容的提问来源于stack exchange,提问作者ddb20

