Java转C#(Xamarin):ECDSA签名JcaPEMKeyConverter替代方案问询
Xamarin中BouncyCastle ECDSA签名适配C#解决方案
针对你遇到的两个核心问题,直接给出落地的代码实现和思路:
1. 从PEM私钥转换为IPrivateKey
C#的BouncyCastle没有直接对应Java JcaPEMKeyConverter的类,但可以通过PemReader读取密钥对后,用DotNetUtilities完成转换。EC密钥的转换代码如下:
using Org.BouncyCastle.Crypto; using Org.BouncyCastle.OpenSsl; using Org.BouncyCastle.Security; using Org.BouncyCastle.Crypto.Parameters; // 假设privateKeyPem是你的PEM格式私钥字符串 using var pemReader = new PemReader(new StringReader(privateKeyPem)); var keyPair = (AsymmetricCipherKeyPair)pemReader.ReadObject(); // 将BouncyCastle的EC私钥参数转换为Android的IPrivateKey var androidPrivateKey = DotNetUtilities.GetECPrivateKey((ECPrivateKeyParameters)keyPair.Private);
2. 支持多次添加数据的签名生成
分两种场景实现,按需选择:
场景一:用Android原生Signature类(和Java逻辑对齐)
Android的Signature类本身支持多次调用Update方法,和Java代码的调用方式完全一致:
using Android.Security; // 初始化签名实例,算法要和原Java代码一致(比如SHA256withECDSA) var signature = Signature.GetInstance("SHA256withECDSA"); signature.InitSign(androidPrivateKey); // 多次添加待签名数据 signature.Update(firstDataBytes); signature.Update(secondDataBytes); signature.Update(thirdDataBytes); // 生成最终签名 byte[] finalSignature = signature.Sign();
场景二:用BouncyCastle原生ISigner接口
如果不想依赖Android原生API,直接用BouncyCastle的签名器,同样支持多次添加数据:
using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Security; // 获取对应算法的签名器,注意算法名称格式(SHA-256withECDSA) ISigner signer = SignerUtilities.GetSigner("SHA-256withECDSA"); // 用BouncyCastle的私钥参数直接初始化,无需转换为Android的IPrivateKey signer.Init(true, keyPair.Private); // 多次添加数据,每次传入字节数组、起始索引和长度 signer.BlockUpdate(firstDataBytes, 0, firstDataBytes.Length); signer.BlockUpdate(secondDataBytes, 0, secondDataBytes.Length); // 生成签名 byte[] finalSignature = signer.GenerateSignature();
注意事项
- 确保安装了正确的BouncyCastle NuGet包:Xamarin项目建议安装
BouncyCastle-PCL或Org.BouncyCastle - 算法名称要和原Java代码完全一致,避免因名称格式差异导致签名不匹配
- 如果原Java代码用的是BouncyCastle的签名逻辑,优先选择场景二的实现,减少转换成本
内容的提问来源于stack exchange,提问作者kran
相关产品推荐
相关产品推荐

