You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 03:16:10