Diffie-Hellman椭圆曲线私钥长度
我为Diffie-Hellman椭圆曲线使用FIPS 186-3推荐曲线。我试图确定私钥的最大长度,根据RFC 5915应该是:Diffie-Hellman椭圆曲线私钥长度
天花板(LOG2(N)/ 8),其中,n是曲线
的顺序对于P-256曲线我得到的最大长度为32,这对应于我在代码中看到的内容(假设为无符号表示形式)。但是对于P-521曲线,我获得的最大长度为65,但是我在代码中获得了长度为66的私钥。这里是一个例子66个字节从P-521曲线的私钥:
十六进制:
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。
问候, - 马丁兰斯勒
根据蟒蛇(我可能会以某种方式滥用),log2(n)/ 8是65.125所以天花板那是66.
和n是521位长(因为我认为会预期 - 我通过打印出十六进制表示检查,它以“1”开头,并有131个十六进制数字)检查。 521/8是65.125。
感谢安德鲁...这确实是我们的log2函数(在标准Java中缺少),它被错误地实现了,我们使用BigInteger而不是BigDecimal,这会在分割过程中导致丢失或精度。
正确的log 2的代码看起来像(题外话,但可能是其他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));
}