ECDSA签名生成密钥对Java到c# - JcaPEMKeyConverter()



我一直在使用Xamarin将一些代码从Java Android应用程序转换为c#,并且在尝试使用BouncyCastle代码的某个片段生成签名时遇到了一个问题。

这行代码在c#中有替代函数吗"pair = new 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();

我已经找到了另一种方法来读取私钥并创建一个密钥对。然而,私钥被存储为一个非对称密码对,我不能将其添加到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;
}

我设法为我的问题提出了一个解决方案,使用字符串读取器并使用Update()命令循环遍历每个数组。这对我来说很好,但是,如果有人能找到更好的方法来做到这一点……请在下方评论。

AsymmetricKeyParameter signingKey;
using (var textReader = new System.IO.StringReader(LONG_TERM_PRIVATE_KEY))
{
// Only a private key
Org.BouncyCastle.OpenSsl.PemReader pemReader = new Org.BouncyCastle.OpenSsl.PemReader(textReader);
keyPair = pemReader.ReadObject() as AsymmetricCipherKeyPair;
signingKey = keyPair.Private;
}
var signer = SignerUtilities.GetSigner("SHA256withECDSA");
signer.Init(true, signingKey);
foreach (byte b in terminalNonce)
{
signer.Update(b);
}
foreach (byte b in mobileDeviceNonce)
{
signer.Update(b);
}
foreach (byte b in COLLECTOR_ID)
{
signer.Update(b);
}
foreach (byte b in terminalEphemeralPublicKeyCompressed)
{
signer.Update(b);
}
var signed = signer.GenerateSignature();

相关内容

  • 没有找到相关文章

最新更新