2011-08-23 80 views
2

我为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。

问候, - 马丁兰斯勒

回答

3

根据蟒蛇(我可能会以某种方式滥用),log2(n)/ 8是65.125所以天花板那是66.

和n是521位长(因为我认为会预期 - 我通过打印出十六进制表示检查,它以“1”开头,并有131个十六进制数字)检查。 521/8是65.125。

0

感谢安德鲁...这确实是我们的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)); 
}