2011-08-23 2 views
2

Diffie-Hellman 타원 곡선에 대한 FIPS 186-3 권장 곡선을 사용하고 있습니다. n은 들어 곡선Diffie-Hellman 타원 곡선 길이 개인 키

의 순서입니다

천장 (LOG2 (N)/8) : 나는 그것이 있어야 RFC 5915에 따르면, 개인 키의 최대 길이를 결정하기 위해 노력하고있어 P-256 curve 나는 최대 길이 32를 얻었는데, 이는 내 코드에서 볼 수있는 것과 일치한다 (부호없는 표현으로 가정). 그러나 P-521 커브의 경우 최대 길이는 65이지만 코드에서 길이가 66 개인 키가 생깁니다. 여기서 일 예 66 바이트 P-521 곡선으로부터 개인 키 헥스

5367794175793176027889969828113014603157344894208126643379049713388781962338446363455749219733919077469072043715066195336337088038146192289964998476049182286

:

01 90 59 2 층 (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

답변

3

파이썬에 따르면 (어떤 이유로 잘못 사용될 수도 있습니다.) log2 (n)/8은 65.125이므로 그 중 천장은 66입니다.

이고 n은 521 비트입니다. 예상 한대로 - "1"로 시작하고 131 자리 16 진수가있는 16 진수 표현을 인쇄하여 확인합니다. 521/8은 65.125입니다.

0

감사합니다 앤드류 ... 실제로 우리의 log2 함수 (표준 Java에 빠졌습니다)가 잘못 구현되었으므로 분할하는 동안 손실 또는 정밀도를 초래하는 BigDecimal 대신 BigInteger를 사용하고있었습니다.

올바른 LOG2 코드처럼 보이는 (주제에서 벗어난 있지만, 다른 자바 개발자를위한 관심을 가질 수) :

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)); 
}