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
相关产品推荐
相关产品推荐

