Длина секретного ключа эллиптической кривой Диффи-Хеллмана - PullRequest
2 голосов
/ 23 августа 2011

Я использую рекомендуемые кривые FIPS 186-3 для эллиптических кривых Диффи-Хеллмана.Я пытаюсь определить максимальную длину закрытых ключей, в соответствии с RFC 5915 это должно быть:

потолок (log2 (n) / 8), где n - это порядок кривой

Для кривой P-256 я получаю максимальную длину 32, которая соответствует тому, что я вижу в своем коде (при условии представления без знака).Однако для кривой P-521 я получаю максимальную длину 65, однако в моем коде я получаю закрытые ключи длиной 66.Вот один из примеров 66 байт секретный ключ из кривой Р-521: * 1 005 *

5367794175793176027889969828113014603157344894208126643379049713388781962338446363455749219733919077469072043715066195336337088038146192289964998476049182286

в шестнадцатеричной:

01 90 59 2F 64 1C 73 АВ F8 57 С4 F0 F2A3 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 7F98 6E 4E

Открытый ключ для этого был (без начального 0x04 байта):

01 F0 64 36 14 25 89 F8 7E 0D 5F 0E F9 26 36 D7 5C 4A 45 D7 9C86 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 D9DA 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 D045 67 31 AF 8E 1C 30 87 42 38 9F

Кто-нибудь знает, почему можно получить 6Закрытые ключи длиной 6 байт?В соответствии с FIPS 186-3 документа порядок кривой Р-521:

п = 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005449

Что дает потолок (log2 (п) / 8) = 65. * * тысяча двадцать одна

С уважением, -Мартин Ленслер

Ответы [ 2 ]

3 голосов
/ 23 августа 2011

в соответствии с python (который я, возможно, неправильно использую каким-либо образом), log2 (n) / 8 - 65,125, поэтому потолок этого равен 66.

, а n - 521 битlong (как я полагаю, следовало ожидать - я проверил, распечатав шестнадцатеричное представление, которое начинается с «1» и имеет 131 шестнадцатеричное число).и 521/8 составляет 65,125.

0 голосов
/ 24 августа 2011

Спасибо, Эндрю ... Это была действительно наша функция 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));
}
...