2010-05-27 2 views

Antwort

22

Sie konnten dieses versuchen:

key.getModulus().bitLength(); 
4

Die Größe eines RSA-Schlüssel ist die Anzahl der Bits in seinem Modul, so dass Sie myRSAKey.getModulus().bitLength() wollen.

4

(EDIT: Ich schrieb diese Antwort, bevor ich die Einschränkungen verstanden habe, die auf die Ganzzahlen gesetzt wurden, die für einen RSA-Schlüssel generiert werden. Ich glaube jetzt, dass jeder gute Schlüsselgenerator sicherstellen sollte, dass der Modul zwischen 2^(n-) 1) und 2^n-1: Die minimale Zweierkomplement-Darstellung des Modulus hat also immer genau die Anzahl der Bits, die zum Zeitpunkt der Schlüsselerstellung für die Schlüssellänge angegeben wurden, also zB wenn Sie ein 2048-Bit-Schlüssel, dann key.getModulus(). BitLength() wird immer 2048 zurückgeben.)

Verzeihung, aber nicht key.getModulus().bitLength() geben Sie einen falschen Wert zurück, wenn das höchstwertige Bit des Moduls eine 0 ist? Wenn beispielsweise für einen 2048-Bit-Schlüssel das höchstwertige Bit des Moduls 0 ist, gibt key.getModulus().bitLength() 2047 zurück (oder weniger, wenn mehr Bits 0 sind). Ich würde denken, das gewünschte Ergebnis in einem solchen Fall tatsächlich 2048.

Die Dokumentation für BigInteger.bitLength() liest wäre wie folgt:

Gibt die Anzahl der Bits in der minimal Zweierkomplement-Darstellung dieses BigInteger, ohne ein Vorzeichen. Für positive BigIntegers entspricht dies der Anzahl der Bits in der gewöhnlichen Binärdarstellung. (? Berechnet (ceil (log2 (diese < 0 -Diese. Diese + 1))))

Ich fürchte, dass man einige Annahmen darüber treffen muss, welche Größen der Schlüssel sein könnte. Sie werden annehmen müssen, zum Beispiel, dass Sie immer nur 1024, 2048 oder 4096-Bit-Schlüssel sehen und dann etwas tun:

int keySize; 
int bitLength = key.getModulus().bitLength(); 
if (bitLength <= 512) { 
    throw new IllegalArgumentException(...) 
} 
else if (bitLength <= 1024) { 
    keySize = 1024; 
} 
else if (bitLength <= 2048) { 
    keySize = 2048; 
} 
else if (bitLength <= 4096) { 
    keySize = 4096; 
} 
else { 
    throw new IllegalArgumentException(...) 
} 
return keySize; 

Dieser Code immer noch falsch sein kann, auf dem (sehr selten) Zum Beispiel, wenn die ersten 1048 Bits eines 2048-Bit-Schlüssels alle 0 sind. Ich denke, das ist jedoch keine Sorge.

+0

Dieser Code ist bei jeder Gelegenheit falsch. 'key.getModulus(). bitLength()' IST der Wert, der durch die Begriffe "Schlüsselgröße" oder "Schlüssellänge" definiert wird. Ersetzen Sie es durch willkürlich gewählte Werte ist einfach falsch. –

+0

Oleg, du hast natürlich Recht. Ich fügte das EDIT hinzu, um mein Missverständnis über Einschränkungen der Primfaktoren zu erklären, die in die Schlüsselgenerierung eingehen. –

+0

Wenn noch paranoid über lausige Schlüsselgeneratoren, kann man aufrunden: keySize = ((bitLength + 127)/128) * 128. Besser als raten. Und die Wahrscheinlichkeit, dass hohe 128 Bits nur Nullen sind, liegt nun in der Größenordnung von 1 in 2^128. –