【发布时间】:2022-12-15 17:11:53
【问题描述】:
我一直在使用 Xamarin 将一些代码从 Java Android 应用程序转换为 C#,并且在尝试使用 BouncyCastle 代码的某个 sn-p 生成签名时遇到了问题。
C#中是否有代码行的替换函数 “对 = 新的 JcaPEMKeyConverter().getKeyPair((PEMKeyPair) 已解析);” ??
这是Java代码:
// Generating the signature
Signature signature = Signature.getInstance("SHA256withECDSA");
Reader rdr = new StringReader("privatekeygoeshere");
Object parsed = new PEMParser(rdr).readObject();
KeyPair pair;
pair = new JcaPEMKeyConverter().getKeyPair((PEMKeyPair) parsed);
PrivateKey signingKey = pair.getPrivate();
signature.initSign(signingKey);
signature.update(nonceData1);
signature.update(nonceData2);
signature.update(collectorID);
signature.update(publicKeyCompressed);
byte[] signedData = signature.sign();
我找到了另一种读取私钥并创建 KeyPair 的方法。但是,私钥存储为 AsymmetricCipherKeyPair,我无法将其添加到 signature.InitSign() 函数中,因为这需要 IPrivateKey。
我尝试创建签名的不同方法不允许我将其他字节数组数据更新为签名生成,如 Java 代码,这对我不起作用,所以我真的被卡住了。 我也对签名生成的任何想法持开放态度。
这里的例子:
AsymmetricKeyParameter signingKey;
AsymmetricCipherKeyPair keyPair = null;
using (var textReader = new System.IO.StringReader("privatekeygoeshere"))
{
// Only a private key
Org.BouncyCastle.OpenSsl.PemReader pemReader = new Org.BouncyCastle.OpenSsl.PemReader(textReader);
keyPair = pemReader.ReadObject() as AsymmetricCipherKeyPair;
signingKey = keyPair.Private;
}
【问题讨论】:
-
我不知道 Xamarin,但使用 C#/BouncyCastle 实际上应该可以做类似的事情:
var signer = Org.BouncyCastle.Security.SignerUtilities.GetSigner("SHA256withECDSA")whoseInit()method acceptssigningKey:signer.Init(true, signingKey)。 -
不幸的是我已经尝试过了,我认为它对某些用例很有用,但是如果我想用多个额外的字节数组进行更新,它似乎不起作用:/除非我遗漏了一些东西
-
...它似乎不起作用:/除非我遗漏了什么...要检查这一点,您必须发布您的代码。
标签: java c# xamarin.android bouncycastle