首页 > 解决方案 > 生成的 ECDsaCng 密钥长于预期的 32 字节

问题描述

我正在玩 ECDsaCng,我意识到密钥大小似乎不正确。例如,从下面的代码中,privateKey 变量是一个 104 长的字节数组,而我没想到它会大于 32。

我究竟做错了什么?

        ECDsaCng dsa = new ECDsaCng(256);
        dsa.HashAlgorithm = CngAlgorithm.Sha256;
        dsa.GenerateKey(ECCurve.NamedCurves.nistP256);
        var privateKey = dsa.Key.Export(CngKeyBlobFormat.EccPrivateBlob);
        var publicKey = dsa.Key.Export(CngKeyBlobFormat.EccPublicBlob);

先感谢您。

标签: c#ecdsa

解决方案


私钥d是 中的一个随机整数[1, n - 1],其中n是基点的阶数G。公钥是曲线点(x, y) = d * G这里。对于NIST P-256( secp256r1) dx并且y被编码为 32 字节(值不能更大)。

MS 以此处描述的特定格式存储这两个密钥。公钥的格式有一个 8 字节的头部,后跟 32 字节的x值和 32 字节的y值,因此总长度为 72 字节。私钥的格式有一个(不同的)8字节头,后跟32字节x值、32字节y值和32字节d值,因此总长度为104字节,按照你找到的价值。可以在此处找到标题的详细说明。


推荐阅读