2

Diffie-Hellman Elliptic Curves に FIPS 186-3 推奨曲線を使用しています。RFC 5915 によると、秘密鍵の最大長を決定しようとしています。

上限 (log2(n)/8) 、n は曲線の次数

P-256 曲線の場合、コードで見ているものに対応する最大長 32 を取得します (符号なし表現を想定)。ただし、P-521 曲線の場合、最大長は 65 ですが、コードで長さ 66 の秘密鍵を取得しています。P-521 曲線からの 66 バイトの秘密鍵の例を次に示します。

5367794175793176027889969828113014603157344894208126643379049713388781962338446363455749219733919077469072043715066195336337088038146192289964998476049182286

16 進数:

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 BFE2 80 DF 9F 2A 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

4

2 に答える 2

0

ありがとう、Andrew... 実際、正しく実装されていなかったのは log2 関数 (標準 Java では欠落) でした。除算中に損失または精度を引き起こす BigDecimal の代わりに BigInteger を使用していました。

正しい 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));
}
于 2011-08-24T08:01:17.297 に答える