如何在MAUI Android中使用PEM公钥加密数据(替代RSACng方案)
.NET 8 MAUI Android 下PEM格式RSA公钥加密解决方案
问题分析
- 方法1依赖
RSACng类,该类仅Windows平台支持,无法在MAUI Android运行 - 方法2完全错误:提供的公钥是RSA类型,却误用椭圆曲线签名算法
ECDsa,且SignData是签名方法而非加密方法,自然报错
可行方案
方案1:使用.NET内置跨平台RSA实现(无需第三方库)
.NET 5+(含.NET 8)的RSA类原生支持跨平台,且提供ImportFromPem方法直接导入带标记的PEM公钥字符串,替代Windows专属的RSACng。
public string EncryptData(string stringToBeEncrypted, string publicKeyPem) { try { using var rsa = RSA.Create(); // 直接导入完整的PEM格式公钥(包含头尾标记) rsa.ImportFromPem(publicKeyPem); byte[] rawData = Encoding.UTF8.GetBytes(stringToBeEncrypted); byte[] encryptedData = rsa.Encrypt(rawData, RSAEncryptionPadding.OaepSHA256); return Convert.ToBase64String(encryptedData); } catch (Exception ex) { // 可根据需求添加异常日志逻辑 return "error"; } }
方案2:结合BouncyCastle解析公钥(兼容旧场景)
如果需要保留BouncyCastle解析PEM的逻辑,只需将RSACng替换为跨平台的RSA.Create()实例即可:
首先安装NuGet包BouncyCastle.Cryptography,然后使用以下代码:
using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Security; public string EncryptData(string stringToBeEncrypted, string publicKey) { try { // 清理PEM字符串,去除头尾标记和换行符 string cleanedKey = publicKey .Replace("-----BEGIN PUBLIC KEY-----", "") .Replace("-----END PUBLIC KEY-----", "") .Replace("\r", "") .Replace("\n", ""); RsaKeyParameters bcParams = (RsaKeyParameters)PublicKeyFactory.CreateKey(Convert.FromBase64String(cleanedKey)); RSAParameters dotNetParams = new RSAParameters { Modulus = bcParams.Modulus.ToByteArrayUnsigned(), Exponent = bcParams.Exponent.ToByteArrayUnsigned() }; using var rsa = RSA.Create(); rsa.ImportParameters(dotNetParams); byte[] rawData = Encoding.UTF8.GetBytes(stringToBeEncrypted); byte[] encryptedData = rsa.Encrypt(rawData, RSAEncryptionPadding.OaepSHA256); return Convert.ToBase64String(encryptedData); } catch (Exception ex) { return "error"; } }
关键注意事项
- 确保使用的是跨平台的
RSA.Create()实例,而非Windows专属的RSACng - 你的公钥是RSA类型,切勿混淆使用椭圆曲线(ECDsa)等其他算法
- 加密填充方式保持与原方法一致(
OaepSHA256),保证加密结果兼容
内容的提问来源于stack exchange,提问作者Mehdi Agazadeh
相关产品推荐
相关产品推荐

