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

Xamarin端RSA加密适配Symfony解密问题求助

解决Xamarin RSA加密与Symfony解密不兼容的问题

核心问题出在公钥的错误导入方式,以及没有匹配好RSA加密的关键参数,我来一步步帮你修复:

问题根源分析

你之前的Xamarin代码直接把公钥字符串转成字节数组赋值给RSAKeyInfo.Modulus——这完全不对。标准PEM格式的公钥包含Modulus、Exponent等多个参数,还有-----BEGIN PUBLIC KEY-----这类头部尾部标识,不能直接当作Modulus使用。哪怕你指定了Encrypt(..., false)(对应PKCS#1 v1.5填充,和Symfony端phpseclib默认填充一致),密钥解析错误也会导致加密出的内容完全不符合解密端的预期。

解决方案:用BouncyCastle解析标准PEM公钥

在Xamarin中处理RSA密钥,推荐用BouncyCastle库来解析标准PEM格式,避免手动拆解密钥的麻烦。

步骤1:安装BouncyCastle NuGet包

在你的Xamarin项目中,根据项目框架安装对应包:

  • 若用.NET 6+/MAUI:安装BouncyCastle.NetCore
  • 若用旧版Xamarin.Forms:安装Portable.BouncyCastle

步骤2:修改Xamarin加密代码

替换你原来的加密逻辑,用BouncyCastle正确解析公钥并执行加密:

using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.OpenSsl;
using Org.BouncyCastle.Security;
using System.IO;
using System.Text;

public partial class ConnexionPage : ContentPage {
    private void Connexion(object sender, EventArgs e) {
        // 替换成你的完整PEM格式公钥(包含头部和尾部)
        string publicKeyPem = @"-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...(你的公钥内容)
-----END PUBLIC KEY-----";

        // 解析PEM格式公钥
        AsymmetricKeyParameter publicKey;
        using (var reader = new StringReader(publicKeyPem)) {
            publicKey = (AsymmetricKeyParameter)new PemReader(reader).ReadObject();
        }

        // 转换为.NET兼容的RSA参数
        var rsaParams = DotNetUtilities.ToRSAParameters((RsaKeyParameters)publicKey);

        // 初始化加密器并执行加密
        using (var rsa = new RSACryptoServiceProvider()) {
            rsa.ImportParameters(rsaParams);
            
            // 要加密的密码(统一用UTF-8编码)
            byte[] passwordBytes = Encoding.UTF8.GetBytes("test");
            
            // 用PKCS#1 v1.5加密(和Symfony端phpseclib默认填充匹配)
            byte[] encryptedBytes = rsa.Encrypt(passwordBytes, false);
            
            // 转为Base64字符串,用于在请求头中发送
            string encryptedBase64 = Convert.ToBase64String(encryptedBytes);
            
            // 后续将encryptedBase64放入请求头的x-password字段发送给Symfony即可
        }
    }
}

步骤3:Symfony端小优化(可选)

看你的Symfony代码,当前返回的是加密后的$passwordEncrypted序列化结果,应该改成返回解密后的$password才符合业务逻辑:

$data = $this->get('jms_serializer')->serialize($password, 'json');

另外确保private.key是和Xamarin端公钥配对的私钥,避免密钥不匹配的问题。

为什么原来的代码失效?

RSA公钥需要同时包含Modulus和Exponent两个核心参数,你之前只设置了Modulus,缺少Exponent(一般是AQAB)会导致加密逻辑完全错误,生成的密文自然无法被正确解密。

内容的提问来源于stack exchange,提问作者A. Lepage

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:22:34