【问题标题】:How to sign a message using ECDSA with an ECDiffieHellman instance in .net framework 4.7.1?如何在 .net 框架 4.7.1 中使用带有 ECDiffieHellman 实例的 ECDSA 签署消息?
【发布时间】:2017-11-18 06:42:09
【问题描述】:

假设 ECDiffieHellman 实例也可用于签名。

如果我有有效的 ECDiffieHellman (ECDH) 实例,如何在 .net 框架中使用 ECDH 实例使用 ECDSA 创建签名?

我想我可以通过以下方式验证签名:

        ECDiffieHellman ecdh;   //Already have this instance
        var verifyKey = CngKey.Import(ecdh.PublicKey.ToByteArray(), CngKeyBlobFormat.EccPublicBlob);
        var ecDsa = new ECDsaCng(verifyKey);
        var dataBytes = ASCIIEncoding.ASCII.GetBytes("Hello!");
        var verifyResult = ecDsa.VerifyData(dataBytes, signatureBytesToCheck, HashAlgorithmName.SHA256);

我尝试为私钥(用于签名)遵循 CngKey 的类似模型。我无法使用私钥字节创建 CngKey。

        ECDiffieHellman ecdh;   //Already have this instance
        var ecdhParams = ecdhCasd.ExportParameters(true);
        var ecdhPrivateKeyBytes = ecdhParams.D;
        var signingKey = CngKey.Import(ecdhPrivateKeyBytes, CngKeyBlobFormat.EccPrivateBlob);

我尝试使用 GenericPrivateBlob、EccFullPrivateBlob 作为格式。仍然没有任何效果。

我在正确的道路上吗?如果是这样,我做错了什么?

【问题讨论】:

  • 查看tools.ietf.org/html/rfc5915后,我也尝试了以下操作:a) [私钥版本:0x01 0x00 0x00 0x00][私钥:32 字节][曲线名称 P-256:字节为“ 1.2.840.10045.3.1.7"] 然后 b) [私钥版本:0x01 0x00 0x00 0x00][私钥:32 字节][曲线名称 P-256:“1.2.840.10045.3.1.7”的字节][公钥 X 32 字节][公钥 Y 32 字节]。都没有用。

标签: c# .net cryptography signature elliptic-curve


【解决方案1】:

我比我想象的要近得多。我终于想到我只需要使用 Create 方法而不是 Import 方法,如下所示:

    ECDiffieHellman ecdh;   //Already have this instance
    var ecdhParams = ecdhCasd.ExportParameters(true);
    var signer = ECDsa.Create(ecFullParams);
    var signedBytes = ecDsa.SignData(dataBytes, HashAlgorithmName.SHA256);

如果我只有公钥要验证:

    ECDiffieHellmanPublicKey ecdhPk; //Compute this with public key bytes
    var ecPkParams = ecdhPk.ExportParameters();
    var verifier = ECDsa.Create(ecPkParams);
    var verifyResult = verifier.VerifyData(bytesToBeVerified, signatureBytesToCheck, HashAlgorithmName.SHA256);

【讨论】:

    【解决方案2】:

    除了导出密钥属性之外,您还应该能够使用不可导出的密钥:

    ECDiffieHellmanCng ecdhChg = ecdh as ECDiffieHellmanCng;
    
    // Export is required.
    if (ecdhCng == null)
        return null;
    
    return new ECDsa(ecdhCng.Key);
    

    这是因为在 Windows CNG 上,“ECDSA”键只允许执行 ECDSA;但是“ECDH”密钥可以同时执行 ECDSA 和 ECDH。至少,软件私钥是这样的。

    .NET 开始允许在 .NET 4.6.2 中通过 ECDH 密钥创建 ECDsaCng,因此如果您有可用的 ECC ExportParameters 方法,这应该已经适合您了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-21
      • 1970-01-01
      • 2019-05-13
      • 1970-01-01
      相关资源
      最近更新 更多