2017-10-27 8 views
0

일부 암호화 된 데이터의 암호 해독을 수행하고 있습니다. 데이터가 매우 밀접한 정보라고 가정 해보십시오. 정보는 tripledes_cbc 알고리즘으로 암호화됩니다. 정보를 암호화하는 데 사용되는 비밀 키는 rsa 알고리즘으로 암호화됩니다.NoPadding 스키마로 tripledes_cbc 암호화 후 가비지 가져 오기

그러나 DESede/CBC/NoPadding 알고리즘으로 정보의 암호를 해독하려고하면 앞면과 뒷면에 패딩 된 일부 가비지 문자가있는 원본 데이터가 나타납니다.

DESede/CBC/NoPadding 대신 DES/CBC/PKCS5Padding을 사용하려고하면 예외적으로 '최종 블록이 제대로 채워지지 않습니다.'라는 예외가 발생합니다.

다음은 코드 스 니펫입니다. 여분의 패딩이없는 정확한 텍스트를 얻으려면 어떻게해야하는지 알려주세요.

 KeyStore ks = KeyStore.getInstance("jks"); 
     FileInputStream fis = new FileInputStream(ksFile); 
     ks.load(fis, "testing".toCharArray()); 

     PrivateKey privateKey = (PrivateKey) ks.getKey("keys", "1234".toCharArray()); 

     Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 
     cipher.init(Cipher.DECRYPT_MODE, privateKey); 
     byte[] kekBytes = cipher.doFinal(Base64.decodeBase64(encKey.getBytes("UTF-8"))); 

     SecureRandom random = new SecureRandom(); 
     byte[] iv = new byte[8]; 
     random.nextBytes(iv); 

     SecretKey key = new SecretKeySpec(kekBytes, "DESede"); 
     Cipher cipher1 = Cipher.getInstance("DESede/CBC/NoPadding"); 
     cipher1.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv)); 
     byte[] out = cipher1.doFinal(Base64.decodeBase64(data.getBytes("UTF-8"))); 

     System.out.println("Data Length: " + out.length); 
     String result = new String(out, "UTF-8"); 
+1

1. 새 작업에는 3DES를 사용하면 안되며, AES는 현재 사용할 대칭 방법입니다. 하지만 제 생각에 이것은 학교 프로젝트이며 학교는 현실 세계의 10 년 정도 뒤입니다. 2. 예상 데이터와 해독 된 데이터의 예 **를 16 진수 형식으로 제공하십시오 **. – zaph

+2

분명히 암호화 측에서 사용 된 패딩을 알아야합니다. 또한 DES 또는 DESede를 사용하고 있습니까? 왜냐하면'DES/CBC/PKCS5Padding'은'DESede/CBC/NoPadding'에 대한 합리적인 대안이 아니기 때문입니다. 아마도 당신은'DESede/CBC/PKCS5Padding'을 의미했을까요? –

답변

0

가운데 부분이 맞으면 키가 정확합니다. 처음에는 블록이 암호문 앞에 접두사가 붙은 IV 일 것입니다. 해독하려고하면 쓰레기가 나옵니다. 그 후 IV 자체는 다음 블록의 벡터로 간주되므로 CBC 암호는 자체를 수정하고 올바르게 계속 처리합니다. 이론적으로 : CBC는 오류 전파을 제한했습니다.

마지막 부분은 사용 된 패딩 방식입니다. 시도해보십시오 "DESede/CBC/PKCS5Padding". 그래도 작동하지 않으면 바이너리 값 (실제로는 16 진수로 인코딩 됨)을 살펴보고 데이터 패딩을 수행 할 수 있도록 사용되는 패딩 구성표를 찾아야합니다.

Java 용 표준 암호화 공급자에는 패딩 방식이 많지 않습니다. 따라서 귀하는 예를 들어 다음을 제공하는 제공 업체를 찾아야합니다. 비트 패딩 또는 "NoPadding"을 사용하고 패딩을 직접 수행 할 수 있습니다.

온라인 프로토콜의 경우 패딩 오라클 공격, 실제로 AES/GCM 및 RSA/OAEP와 같은 최신 프로토콜에 대해 알아야 할 때가 있습니다.

+0

해독 된 메시지의 16 진수 표현에서 패딩 문자를 어떻게 식별합니까? 16 진수 결과는 다음과 같습니다 (여기서는 첫 번째 및 마지막 몇 글자 만 사용). "5368f1b5beaa10ec3c6e73313a5061796d656e7443616c6c6261636b496e707574 ..................... 7443616c6c6261636b496e7075743ec9de7dc99f437f08" –

+0

@ K.Nath 실수로 위의 16 진수로 인코딩 된 데이터의 보이지 않는 문자는 8 바이트의 프리앰블 다음에 ASCII 인코딩 된 텍스트와 8 바이트의 데이터가 뒤 따른다. 왜 이것이 틀렸다고 생각하니? – zaph

+0

@zaph - 출력이 잘못되었음을 의미하지는 않습니다. 방금 패딩 된 쓰레기를 제외하고 텍스트를 추출하려고했습니다. 위의 주석 ('5368f1b5beaa10ec')에서 처음 16자를 제거하여 출력 문자열 앞에 패딩 된 쓰레기를 극복 할 수 있습니다. Java 코드를 실행할 때마다 처음 16자를 항상 다릅니다. 하지만 난 처음 16자를 제외하고 출력 문자열의 끝에 쓰레기를 제거 할 수 없습니다, 다른 모든 문자는 자바 코드를 실행할 때마다 동일하게 유지됩니다. –