Diffie-Hellman椭圆曲线私钥的长度

时间:2011-08-23 14:14:00

标签: cryptography elliptic-curve diffie-hellman

我正在使用FIPS 186-3推荐的Diffie-Hellman椭圆曲线曲线。我正在尝试确定私钥的最大长度,根据RFC 5915它应该是:

ceiling(log2(n)/ 8),其中n是曲线的顺序

对于P-256曲线,我得到最大长度32,这对应于我在代码中看到的(假设无符号表示)。然而,对于P-521曲线,我得到最大长度65,但是我的代码中得到长度为66的私钥。以下是P-521曲线中的一个66字节私钥示例:

5367794175793176027889969828113014603157344894208126643379049713388781962338446363455749219733919077469072043715066195336337088038146192289964998476049182286

in hex:

01 90 59 2F 64 1C 73 AB F8 57 C4 F0 F2 A3 17 DD 5E 5F 64 B1 3C 61 15 8F E2 AC 34 DD 3F FC 6F 9B F1 38 9B 66 0F 27 34 60 75 E3 32 B0 B2 80 DF 9F 2A FE AC FF 82 BE 36 00 77 7A 92 B1 CB F7 7F 98 6E 4E

这个的公钥是(没有前导0x04字节):

01 F0 64 36 14 25 89 F8 7E 0D 5F 0E F9 26 36 D7 5C 4A 45 D7 9C 86 BD F8 C5 B9 A7 AA C4 C2 EB 56 52 DD BD BE E1 A0 5B DD A1 1F D8 79 D8 BA 2A 18 68 56 C0 D7 0A 4D D6 2B AB BD 8E D9 33 7F B1 FF E5 18 00 B2 06 21 D9 DA C1 BA A2 E7 43 69 06 FF 03 2F 05 FC 0E 44 74 A1 A3 3B 2E 7E B1 68 01 B2 7F B9 94 EB 8C C7 47 D7 02 A5 46 4E 88 32 59 DD 27 DE 72 C2 6D 8D B4 3B D0 45 67 31 AF 8E 1C 30 87 42 38 9F

有人知道为什么可以获得66字节长度的私钥吗?根据FIPS 186-3文件,P-521曲线的顺序为:

n = 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005449

给出上限(log2(n)/ 8)= 65。

此致 -Martin Lansler

2 个答案:

答案 0 :(得分:3)

根据python(我可能在某种程度上滥用),log2(n)/ 8是65.125所以上限是66。

和n是521位长(正如我假设的那样 - 我通过打印出十六进制表示来检查,它以“1”开头并具有131个十六进制数字)。和521/8是65.125。

答案 1 :(得分:0)

感谢Andrew ...确实我们的log2函数(在标准Java中缺失)被错误地实现了,我们使用的是BigInteger而不是BigDecimal,这会导致在分割期间丢失或精确。

正确的log2代码看起来像(偏离主题,但可能对其他Java开发人员感兴趣):

private static final double LOG_2 = Math.log(2);
private static final BigDecimal BI_1024 = new BigDecimal("1024");

public static double log2(double num) {
    return (Math.log(num) / LOG_2);
}

private static double log2(BigDecimal value) {
    if (value.compareTo(BI_1024) < 0) {
        return log2(value.doubleValue());
    }
    return 10 + log2(value.divide(BI_1024));
}