【问题标题】:ECDSA signature generation KeyPair Java to C# - JcaPEMKeyConverter()ECDSA 签名生成 KeyPair Java 到 C# - JcaPEMKeyConverter()
【发布时间】: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") whose Init() method accepts signingKey: signer.Init(true, signingKey)
  • 不幸的是我已经尝试过了,我认为它对某些用例很有用,但是如果我想用多个额外的字节数组进行更新,它似乎不起作用:/除非我遗漏了一些东西
  • ...它似乎不起作用:/除非我遗漏了什么...要检查这一点,您必须发布您的代码。

标签: java c# xamarin.android bouncycastle


【解决方案1】:

我设法使用字符串读取器并使用 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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-01
    • 2017-01-16
    • 2020-03-23
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多