3 Stimmen

Java: Warum liefert ein 512-Bit RSA KeyPairGenerator 65 Byte lange Schlüssel?

Dies ist wahrscheinlich eine Frage für Neulinge. Ich generiere Schlüsselpaare mit Java:

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN");
keyGen.initialize(512, random);

KeyPair keyPair = keyGen.genKeyPair();

RSAPrivateKey privateKey = (RSAPrivateKey)keyPair.getPrivate();

Ich dachte immer, dass privateKey.getModulus() und privateKey.getPrivateExponent() den "privaten Schlüssel" bilden und dass sie so groß sind wie die dem Schlüsselgenerator übergebene Schlüsselgröße (512 Bit).

Allerdings liefert privateKey.getPrivateExponent().toByteArray() manchmal ein 64-Byte-Array (wie erwartet), manchmal ein 65-Byte-Array.

Warum manchmal 65 Bytes? Übersehe ich hier etwas?

10voto

jarnbjo Punkte 33136

GetPrivateExponent() gibt einen BigInteger zurück, und die Methode toByteArray() gibt ein Byte-Array zurück, das immer ein Vorzeichenbit enthält. Wenn das höchstwertige Bit im 512-Bit-Exponenten gesetzt ist, fügt BigInteger ein zusätzliches 513. 0-Bit hinzu, um anzugeben, dass die Zahl positiv ist und nicht eine 511-Bit-negative Zahl, bei der das 512. Bit auf 1 gesetzt ist. Für 513 Bits werden 65 Bytes für die Kodierung benötigt.

Wenn Sie sich den Inhalt des zurückgegebenen Byte-Arrays ansehen, wird das erste Byte immer 0 sein, wenn Sie ein Array mit 65 Elementen erhalten.

2voto

Abel Punkte 53946

Hier eine kleine Geschichte über RSA die erklärt, dass die Schlüssellänge nicht immer das ist, was Sie denken, d.h. sie wird vom höchstwertigen Bit an berechnet. Sie sollte jedoch 512 Bit nicht überschreiten, denn das ist die maximale Länge des Schlüssels. Es geht um die wahrgenommene Schlüssellänge, nicht unbedingt um die Schlüssellänge in den Implementierungen.

getPrivateExponent gibt eine BigInteger . getPrivateExponent().toByteArray() gibt die Zweierkomplement-Darstellung der BigInteger . A BigInteger unterzeichnet ist. Die 512 Bits (64 Bytes) sind nicht signiert. Das bedeutet: Wenn das höchstwertige Bit gesetzt wird (das Vorzeichenbit), um es vorzeichenlos zu machen, wird die BigInteger muss um ein Byte aufgefüllt werden, damit sie konform ist. Wenn Sie sich die Bytes ansehen, werden Sie feststellen, dass das hinzugefügte Byte immer Null ist.

-1voto

Vincent B. Punkte 524

8 * 64 = 512 ?

Edit: Mein Fehler, ich habe den Unterschied zwischen 64 und 65 nicht gesehen, in der Tat, gute Frage.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X