【问题标题】:How to specify private key for ECDSA Signing Key for Xml如何为 Xml 的 ECDSA 签名密钥指定私钥
【发布时间】:2022-09-25 20:14:49
【问题描述】:

我正在使用 .net 6 中的特定私钥实现用于签署 xml 文档的代码
使用算法 ECDSA 曲线 secp256k1 我的 .net6 代码 :

  ECDsaCng key = new ECDsaCng();
            key.ImportECPrivateKey(Convert.FromBase64String(privatKey), out _);
SignedXml signer = new SignedXml(doc);
            signer.SigningKey = key;
            signer.KeyInfo = new KeyInfo();
            KeyInfoX509Data keydata = new KeyInfoX509Data(signingCertificate);
            signer.KeyInfo.AddClause(keydata);

它适用于我

但问题是我需要使用 4.7 .net 框架做同样的实现,我试过了

            ECParameters p = new ECParameters {
                Curve = ECCurve.NamedCurves.nistP256,
                D = Convert.FromBase64String(privatKey),
                Q = new ECPoint() {
                     X= z.Skip(1).Take(32).ToArray(),
                     Y = z.Skip(33).ToArray()
                }
            };
            ECDsaCng key = (ECDsaCng)ECDsaCng.Create(p);
SignedXml signer = new SignedXml(doc);
            signer.SigningKey = key;
            signer.KeyInfo = new KeyInfo();
            KeyInfoX509Data keydata = new KeyInfoX509Data(signingCertificate);
            signer.KeyInfo.AddClause(keydata);

现在我面临几个问题

1- 我在命名曲线中找不到 secp256k1

2- 它抛出错误,因为 Q.x,Q.y,D 的长度不同

3-我使用的证书包括我的公钥

注意我的 privateKey 存储为 base64 字符串

那么有没有办法让它工作? 我在正确的道路上吗?

是否有任何将此键字符串附加到 X509Certificate2 对象并使用

       signer.SigningKey = X509Cetrifcate2.Privatekey; 

代替

        signer.SigningKey = key;

它会起作用吗?

请告诉我

  • 尝试框架 4.7.2,它修复了 4.7 的一些加密问题。

标签: c# xml key ecdsa .net-4.7


【解决方案1】:

嗨,我找到了我的问题的解决方案,它是 2 个解决方案的混合 第一(找不到原链接请参考) 就是这个代码 sn-p 用于导入我的私钥并生成签名(使用 Bouncy Castle)

        string pkcs8 = @"-----BEGIN EC PRIVATE KEY-----
           "+privatKey+@"
            -----END EC PRIVATE KEY-----";
        TextReader privateKeyTextReader = new StringReader(pkcs8);
        AsymmetricCipherKeyPair privateKeyParams = (AsymmetricCipherKeyPair)new PemReader(privateKeyTextReader).ReadObject();
        byte[] message = Encoding.UTF8.GetBytes(doc);
        ISigner signer = SignerUtilities.GetSigner("SHA-256withECDSA"); // ASN.1/DER format
        signer.Init(true, privateKeyParams.Private);
        signer.BlockUpdate(message, 0, message.Length);
        byte[] signature = signer.GenerateSignature();
        signatureValue = Convert.ToBase64String(signature);

这部分用于在规范化后生成 xml 摘要

加载我的 xml 并应用规范化并将输出作为字节获取:

        XmlDocument invoice = new XmlDocument();
        invoice.LoadXml(doc);
        XmlDsigC14NTransform t = new XmlDsigC14NTransform();
        t.LoadInput(invoice);
        Stream invoiceStream = (Stream)t.GetOutput(typeof(Stream));

最后得到我的发票摘要

SHA256Cng sHA256 = new SHA256Cng();
        byte[] hash = sHA256.ComputeHash(invoiceStream);
        invoiceDigestValue = Convert.ToBase64String(hash);

【讨论】:

    猜你喜欢
    • 2016-08-26
    • 2018-07-19
    • 2018-11-14
    • 2021-11-07
    • 2022-01-07
    • 2019-05-13
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多