8

DES 暗号化の秘密鍵として使用したい 56 ビットのバイナリ文字列があります。

JCAドキュメントのWebサイトで次のコードを見つけました

byte[] desKeyData = { (byte)0x01, (byte)0x02, (byte)0x03, 
(byte)0x04, (byte)0x05, (byte)0x06, (byte)0x07, (byte)0x08 };
DESKeySpec desKeySpec = new DESKeySpec(desKeyData);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey secretKey = keyFactory.generateSecret(desKeySpec);

ただし、これはキーに (7 ではなく) 8 バイトを使用します。desKeyData[0] が最下位バイトまたは最上位バイトに対応するかどうかは明確ではありません。また、56 ビット文字列を直接使用して、この目的に使用できるバイト配列を生成することは可能ですか?

4

2 に答える 2

7

ウィキペディアから:

キーは表向きは 64 ビットで構成されています。ただし、これらのうち実際にアルゴリズムで使用されるのは 56 個だけです。8 ビットはパリティ チェックのみに使用され、その後は破棄されます。したがって、有効な鍵の長さは 56 ビットであり、そのように引用されることはありません。選択したキーの 8 ビットごとに破棄されます。つまり、位置 8、16、24、32、40、48、56、64 が 64 ビット キーから削除され、56 ビット キーのみが残ります。

したがって、最下位ビット (つまり 0 番目のビット) はキーの構築には使用されませんDESKeySpec.isParityAdjusted()

編集:最下位ビットが無視されることを示す簡単なテスト:

SecretKeyFactory sf = SecretKeyFactory.getInstance("DES");
byte[] in = "test".getBytes("UTF-8");

Cipher c1 = Cipher.getInstance("DES");
c1.init(Cipher.ENCRYPT_MODE, sf.generateSecret(new DESKeySpec(
   new byte[] {0x10,0x20,0x30,0x40,0x50,0x60,0x70,(byte) 0x80})));
byte[] r1 = c1.doFinal(in);

Cipher c2 = Cipher.getInstance("DES");
c2.init(Cipher.ENCRYPT_MODE, sf.generateSecret(new DESKeySpec(
    new byte[] {0x11,0x21,0x31,0x41,0x51,0x61,0x71,(byte) 0x81})));
byte[] r2 = c2.doFinal(in);

assertArrayEquals(r1, r2);  
于 2011-02-13T17:55:52.473 に答える
1

有効ビットは、1または2 の補数の符号を変更するビットです。最上位ビットまたは最下位ビットの考え方は、バイトには適用できません。

axtavt answer が言うように、シーケンスの 64 ビットすべてから、範囲内のビットのみが(1..7), (9..15), (17..23), (25..31), (33..39), (41..47), (49..55), (57..63)実際のキーとして使用されます。たとえば、1 になったシーケンスの関連する 56 ビットは次のとおりです。0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f最上位ビットはパリティ チェックとして 0 のままです。

実際に 7 バイト、56 ビットのシーケンスを 8 バイトのシーケンスに変換するには、このコードを使用できます。

于 2011-02-13T23:18:11.253 に答える