簡體   English   中英

ECDSA 簽名生成 KeyPair Java 到 C# - JcaPEMKeyConverter()

[英]ECDSA signature generation KeyPair Java to C# - JcaPEMKeyConverter()

我一直在使用 Xamarin 將一些代碼從 Java Android 應用程序轉換為 C#,並且在嘗試使用特定的 BouncyCastle 代碼片段生成簽名時遇到了問題。

C# 中是否有代碼行“pair = new JcaPEMKeyConverter().getKeyPair((PEMKeyPair) parsed)”的替換函數;?

這是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;
            }

我設法使用字符串讀取器並使用 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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM