2017-11-02 822 views
0

DESede/ECB/NoPadding과 키 패턴을 사용하여 Base64로 암호화 된 메시지를 받았습니다. StackOverflow에서 같은 주제에 대해 가능한 모든 솔루션을 사용했지만 아무 것도 작동하지 않았습니다. 문제는 문자열 바이트 변환에 있어야한다고 생각합니다. 그러나 코드에서 찾을 수 없습니다. 나는 실용적인 암호학에 익숙하지 않다는 것을 언급해야한다.DESede/ECB/NoPadding, Base64

다음은 내 코드입니다 :

import java.util.Base64; 
import javax.crypto.Cipher; 
import javax.crypto.SecretKey; 
import javax.crypto.SecretKeyFactory; 
import javax.crypto.spec.DESedeKeySpec; 

public class Main { 

private static final String ALGO_NAME = "DESede/ECB/NoPadding"; 
private static final char[] HEX_DIGIT = { '0', '1', '2', '3', '4', '5', 
     '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; 

public static byte[] hexStringToByteArray(String s) { 
    int len = s.length(); 
    byte[] data = new byte[len/2]; 
    for (int i = 0; i < len; i += 2) { 
     data[i/2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) 
       + Character.digit(s.charAt(i+1), 16)); 
    } 
    return data; 
} 


public static void main(String[] args) throws Exception { 

    String defKey = "CA:FE:BA:BE:FF:FF:FF:FF:XY:XY+1:XY+2:XY+3:XY+4:XY+5:FF:FF:WZ:WZ+1:WZ+2:WZ+3:WZ+4:WZ+5:FF:FF"; 
    String encryptedText = "6t8Z5bKl5ybJL+MiFerNBmiTDS7wlTEUdWNwJJApWmQ="; 
    byte[] input = Base64.getDecoder().decode(encryptedText); 

    for (int i = 0; i < 251; i++) 
     for (int j = 0; j < 251; j++) { 
      String[] split = defKey.split(":"); 
      for (int k = 0; k < 6; k++) { 
       String a = HEX_DIGIT[(i + k)/16] + "" + HEX_DIGIT[(i + k) % 16]; 
       split[8 + k] = a; 
       a = HEX_DIGIT[(j + k)/16] + "" + HEX_DIGIT[(j + k) % 16]; 
       split[16 + k] = a; 
      } 

      String secretKey = ""; 
      for (String q: split) { 
       secretKey += q; 
      } 

      DESedeKeySpec keySpec = new DESedeKeySpec(hexStringToByteArray(secretKey)); 
      SecretKeyFactory factory = SecretKeyFactory.getInstance("DESede"); 
      SecretKey key = factory.generateSecret(keySpec); 


      Cipher cipher = Cipher.getInstance(ALGO_NAME); 
      cipher.init(Cipher.DECRYPT_MODE, key); 

      byte[] plainText = cipher.doFinal(input); 
      String decrypted = new String (plainText); 

      if (decrypted.toLowerCase().contains("the")) 
       System.out.println(decrypted); 
     } 
} 

}

+0

키에 'XY + 1 : XY + 2 : XY + 3 : XY + 4 : XY + 5'가 있어야합니까? – Jens

+0

XY, XY + 1, ..., XY + 5 및 WZ, ..., WZ + 5는 00에서 FF까지 모두 가능합니다. for 루프는 모든 가능한 조합을 생성합니다. – Ferinota

답변

0

문제는 경계했다, 나는 256하고 일 것으로 변경합니다. XY가 FF이면 XY + 1은 00이됩니다.