3

これはおそらく初心者の質問です。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();

今、私は常に、privateKey.getModulus() と privateKey.getPrivateExponent() が「秘密鍵」を形成し、キー ジェネレーターに渡されるキーサイズ (512 ビット) と同じ大きさであると考えていました。

ただし、privateKey.getPrivateExponent().toByteArray() は、64 バイト (予想どおり) を返すこともあれば、65 バイト配列を返すこともあります。

なぜ時々65バイトなのですか?ここで何か不足していますか?

4

3 に答える 3

10

getPrivateExponent() は BigInteger を返し、toByteArray() メソッドは常に符号ビットを含むバイト配列を返します。512 ビット指数の最上位ビットが設定されている場合、BigInteger は 513 番目の 0 ビットを追加して、512 番目のビットが 1 に設定された 511 ビットの負の数ではなく、その数が正であることを指定します。513 ビットの場合、65 バイトはエンコードに必要です。

返されたバイト配列の内容を調べると、65 要素の配列を取得すると、最初のバイトは常に 0 になります。

于 2009-10-15T12:37:24.287 に答える
2

ここで RSA に関するちょっとした話で、キーの長さは常にあなたが考えているものとは限らないことを説明しています。ただし、キーの最大長であるため、512 ビットを超えることはできません。この話は、認識されるキーの長さに関するものであり、必ずしも実装におけるキーの長さではありません。

getPrivateExponentを返しますBigIntegergetPrivateExponent().toByteArray()の 2 の補数表現を返しますBigInteger。ABigIntegerは署名されています。512 ビット (64 バイト) は署名されていません。つまり、符号なしにするために最上位ビット (符号ビット) が設定されているBigInteger場合、適合させるには 1 バイトを埋め込む必要があります。バイトを見ると、追加されたバイトが常にゼロであることがわかります。

于 2009-10-15T12:39:21.787 に答える
-1

8 * 64 = 512?

編集:私の悪い、64と65の間の取引を見ていませんでした、確かに、良い質問です。

于 2009-10-15T12:25:50.560 に答える