2011-02-13 5 views
8

DES 암호화를위한 비밀 키로 사용하려는 56 비트 바이너리 문자열이 있습니다. 56 비트 바이너리 문자열에서 DES 키 만들기

나는

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 바이트를 사용하는 JCA의 문서 웹 사이트에서 다음 코드를 발견했다. desKeyData [0]가 최하위 바이트 또는 최상위 바이트에 해당하는지는 명확하지 않습니다. 또한, 56 비트 문자열을 직접 사용하여이 목적으로 사용할 수있는 바이트 배열을 생성 할 수 있습니까? Wikipedia 가입일

+1

8 바이트 입력은 일반적으로 각 바이트의 7 개의 최하위 비트를 사용한다는 것을 의미합니다. –

+0

그리고 어떤 바이트가 가장 중요합니까? 0 번째 또는 7 번째? – AnkurVj

+1

가장 중요한 점은 2011 년에도 전 세계에서 여전히 DES를 사용하고있는 이유는 무엇입니까? ("역 호환성"에 대한 답장은 "You didn-t-my-point-did-you-you?"뱃지를 얻을 것입니다.) – CAFxX

답변

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); 
+0

비트 위치 8,16 등.이 의미가 가장 중요한 비트 대신 각 바이트의 가장 중요한 비트를 의미합니까? – AnkurVj

+0

하나부터 시작하여 패리티 비트는 모든 바이트의 최상위 비트입니다. – vz0

2

중요한 비트가 one 또는 two's complement 숫자의 부호를 변경하는 것입니다. 가장 중요한 또는 최소한 중요한 비트의 아이디어는 바이트에 적용될 수 없습니다.

axtavt 대답에 따르면 시퀀스의 모든 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 바이트 시퀀스로 변환하려면 this code을 사용할 수 있습니다.

+0

당신이 말하는 코드에서 패리티 비트를 설정하면 : result [7-resultIx/8] | = 1;'. 이 경우 패리티 검사에 가장 중요한 비트가 사용됩니다. – axtavt

+0

@axtavt 56 비트 바이너리 문자열을 빅 엔디안 바이트 배열로 분할하면 모든 바이트의 msb가 '1'이되지만 바이트 데이터 형식이 허용하지 않습니다 (해당 범위는 -2^7-1에서 2^7-1). 이것에 올바른 유형의 캐스트가 있습니까? 나는 내가이 바이트를 캐스팅하면 여전히 내가 사용하길 원하는 동일한 키를 사용하고 있다는 것을 알고 싶다. – AnkurVj