2017-11-02 8 views
0

토큰을 해독하는 데 필요한 토큰과 암호가 있습니다. 나는 내가 무엇을 잘못해서 내가 "불법적 인 열쇠 크기"를 계속 지니고 있는지 확신하지 못한다. 내 키 크기는 44 바이트입니다. BouncyCastleProvider를 정적 블록에 추가하려고합니다. 아래는 내가하려는 일의 작은 스 니펫입니다.DES/CBC/ZeroBytePadding 데이터 암호 해독

SecretKeySpec skeySpec = new SecretKeySpec(keyText.getBytes(), "DES"); 
Cipher des = Cipher.getInstance("DES/CBC/ZeroBytePadding", "BC"); 
des.init(Cipher.DECRYPT_MODE, skeySpec, new IvParameterSpec(new byte[8])); 
byte[] tokenData = des.doFinal(Base64.decodeBase64(token)); 

답변

1

내 생각에 keyText는 Base64로 인코딩되었습니다. 아마 32 바이트의 바이트 []를 얻기 위해 그것을 디코딩해야합니다. Java 8에서 다음과 같이 할 수 있습니다.

byte[] key = java.util.Base64.getDecoder().decode(keyText.getBytes()); 
SecretKeySpec skeySpec = new SecretKeySpec(key, "DES"); 
Cipher des = Cipher.getInstance("DES/CBC/ZeroBytePadding", "BC"); 
des.init(Cipher.DECRYPT_MODE, skeySpec, new IvParameterSpec(new byte[8])); 
byte[] tokenData = des.doFinal(Base64.decodeBase64(token)); 

이 다른 질문에는 Base64에 대한 자세한 정보가 있습니다. Converting Secret Key into a String and Vice Versa

여전히 잘못된 키 크기 오류가 발생한다고 생각합니다. DES 키가 56 비트 (8 패리티 비트 더하기)가 아닌가? 그래서 그 길이는 8 바이트가 아니라 44 나 32 비트가 될 것입니다. Base64를 디코딩하면 얻을 수있을 것 같습니다.

+0

예, DES는 8 바이트 키를 사용합니다. – zaph

+0

doFinal에서 이미 디코딩 중입니다. – Bytekoder

3

DES는 8 바이트에서 56 비트의 키 크기를 가지며, 각 바이트의 lsb는 패리티를 위해 예약되지만 일반적으로 무시됩니다.

"내 키 크기가 44 바이트"이므로 올바르지 않습니다.

다음은 암호 해독에 사용되는 IV가 암호화에 사용 된 것과 동일해야합니다. DES의 블록 크기는 8 바이트이므로 IV는 8 바이트 여야합니다. IV를 처리하는 일반적인 방법 중 하나는 암호화 된 데이터에 접두어를 붙이는 것이므로 IV를 비밀로 할 필요가 없습니다.

마지막으로 제로 패딩은 일반적으로 좋은 해결책이 아니며 0 바이트로 끝나는 바이너리 데이터를 지원하지 않습니다. PKCS # 5는 일반적으로 사용되는 패딩입니다.

+0

대부분의 경우 제로 패딩은 나쁜 생각이지만, (비 트리플) DES는 항상 훨씬 더 나쁜 것입니다. –

+0

3DES를 AES로 건너 뛰는 것이 가장 좋습니다. 현재 표준입니다. – zaph

+0

제로 패딩에 대한 의견에 동의하지만, 레거시 시스템을 보유하고 있으며 더 며칠 동안이 시스템을 사용해야합니다. 따라서 문제는 키와 암호화 된 데이터 모두입니다. – Bytekoder