2017-03-08 3 views
0

무작위 8 바이트를 암호화하기 위해 이중 길이 3DES 키를 사용하고 암호화 된 값을 사용하여 새 3DES 키를 파생시킬 필요가 있습니다.DESedeKeySpec 잘못된 키 크기

DESedeKeySpec을 encryptedRandomValue로 인스턴스화하려고하면 "잘못된 키 크기"라는 오류 메시지가 나타납니다. 이 문제를 해결하는 방법을 알려 주실 수 있습니까?

DESedeKeySpec myKeySpec = 새 DESedeKeySpec (encryptedRandomValue);

내 모든 비밀 키가 단일 DES 키인 경우이 오류가 발생하지 않도록 할 수 있습니다. 하지만 이중 길이 3DES 키와 ECB 모드를 사용해야합니다.

내 코드는 다음과 같습니다.

// Generate double length 3DES Master Key 
    KeyGenerator masterEncKeyGenerator = KeyGenerator.getInstance("DESede"); 
    masterEncKeyGenerator.init(112); 
    SecretKey masterKey = masterEncKeyGenerator.generateKey(); 

    //Prepare random bytes 
    byte[] randomKeyValue = "rn4yrbdy".getBytes(); 

    // Encrypt random bytes with the 3DES Master key 
    final Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding"); 
    cipher.init(Cipher.ENCRYPT_MODE, masterKey); 
    byte[] encryptedRandomValue = cipher.doFinal(randomKeyValue); 

    // Derive new key 3DES Key 
    SecretKeyFactory mySecretKeyFactory = SecretKeyFactory.getInstance("DESede"); 
    DESedeKeySpec myKeySpec = new DESedeKeySpec(encryptedRandomValue); 
    SecretKey derivedKey = mySecretKeyFactory.generateSecret(myKeySpec); 

왜 나는이 오류가 발생하는지 알고 있습니다. 그것은 DESedeKeySpec이 중요한 자료로 24 바이트를 가져 가야하기 때문에 그렇지만 나는 단지 8을주고 있습니다.하지만 그것이 내가 가지고있는 요구 사항입니다 : 암호화 된 3DES 키를 마스터 3DES 키, 무작위 8 바이트 데이터로 생성하는 것입니다 ...

답변

2

트리플 DES는 다른 키를 사용하여 단 3 개의 연속 단일 DES 작업입니다. 특히 그것은 DES 암호화 다음에 DES 암호 해독 다음에 DES 암호화입니다.

은 DES는 D ncrypt 그것에게 이름을주는 것입니다 ecrypt- 전자 DESede

더블 길이와 삼중 길이 키 betwheen의 차이는 키의 어떤 부분 전자 ncrypt- 입니다 당신 세 가지 DES 작업 각각에서 사용합니다.

이중 길이 키 k1 || k2 다음 DES 작업 줄 것입니다 :

Encrypt(k1) - Decrypt(k2) - Encrypt(k1) 

삼중 길이 키 :

Encrypt(k1) - Decrypt(k2) - Encrypt(k3) 

자바 돈의 표준 구현 : k1 || k2 || k3은 다음과 DES 작업을 줄 것 이중 길이의 3 중 DES 키를 직접 지원하지 만 키의 첫 번째 부분을 세 번째 파트로 반복하여 동일한 효과를 얻을 수 있습니다. k1 || k2 || k1

호기심 때문에 단일 DES 키를 세 번 반복하여 트리플 DES를 통해 단일 DES 암호화를 지원할 수 있습니다 (k1 || k1 || k1). 이렇게하면 예를 들어 하드웨어 구현.

+0

Ebbe, 답장을 보내 주셔서 대단히 감사합니다. 귀하의 응답에서 두 배 길이의 키를 올바르게 작성하지 않는다는 것을 이해합니다. 올바른 길이의 이중 길이 키를 얻으려면 KeyGenerator.getInstance ("DESede")를 사용하여 키를 작성해야합니다. 그 다음에 처음 8 바이트를 취하여 두 번째 8 바이트와 함께 새 바이트 []로 연결 한 다음 처음 8 바이트를 다시 생성하고 새로운 DESede SecretKey를 생성합니다. – Simplyi

+0

예, 처음 16 바이트의 이중 길이 키와 동일한 3DES 키를 만듭니다. –

+0

휴식을 가져 주셔서 감사합니다. 단일 DESede 키가 아니라 두 개의 별도 DES 키 (키와 키 2)를 만든 다음이 두 키를 바이트 배열로 연결하면이 바이트 중 새로운 DESede 키를 생성하려고 시도합니다. 그래도 유효한 이중 길이 3DES 키를 만들 수 있습니까? ....이 3DES 키를 사용하여 임의의 8 바이트 배열을 암호화 한 후에 위에서 예와 같이 새 3DES 키를 파생 시키려고하면 오류가 발생하지 않습니까? ... DESedeKeySpec은 24 바이트 만 사용할 수 있지만 3DES chipper의 출력은 8 바이트 뿐이고 오류가 발생합니다 ... – Simplyi