2017-10-13 153 views
-1

對於Crypto類,我們已經使用ECB提供DESede密文,沒有填充=>「6t8Z5bKl5ybJL + MiFerNBmiTDS7wlTEUdWNwJJApWmQ ==」,它是以base64形式。 我們得到了有關密鑰的線索,因此我構建了所有可能的密鑰(所有密鑰都是ASCII格式)。用NoPadding解密DESede密碼

  String strToDecrypt="6t8Z5bKl5ybJL+MiFerNBmiTDS7wlTEUdWNwJJApWmQ=="; 
      byte[] input = strToDecrypt.getBytes(); 

      //Decrypt 
      Cipher b = Cipher.getInstance("DESede/ECB/NoPadding"); 
      b.init(Cipher.DECRYPT_MODE, keySpec); 
      byte output[] = b.doFinal(input); 
      String out = new String(output); 
      System.out.println(new String(out)); 

當我用我的鑰匙運行這段代碼,我得到一個IllegalBlockSizeException因爲我的投入是不是8個字節的整數倍。 我很困惑要使用哪個「基地」。正如我上面所說的那樣,密文是在base64中,所以當運行Cipher.DECRYPT時,我應該給某個「基礎」中的鍵或者我想在某個基礎上解密的字符串。

+3

'的getBytes()'不知道你的字符串應該是Base64編碼。你需要[將字符串解碼爲Base64](https://stackoverflow.com/questions/469695/decode-base64-data-in-java),而不是隻調用'getBytes()'。 – Blorgbeard

+2

更明確地說,'byte [] input = Base64.getDecoder()。decode(strToDecrypt);' – erickson

+0

@erickson謝謝你。這給了我一個錯誤,但使用getMimeDecoder()。decode(strToDecrypt)代替。我所有的輸出都像「9 f8 uK = # g9S33」。沒有明文在任何位置。我所有的鑰匙都是ASCII形式,「Êþº¾ÿÿÿÿÊþº¾ÿÿÿÿÊþº¾ÿÿÿÿ」。任何建議我做錯了什麼? –

回答

1

不要讓密鑰生成比需要更難。你想爲可變部分的第一個字節嘗試每個可能的值。但是如果這個值是0xFB呢?後續的值將是0xFC,0xFD,0xFE和0xFF。但是最後的價值呢?你可以假設他們環繞到0x00。

如果是這樣的話,這樣的事情應該努力找到正確的鑰匙:

static byte[] search(byte[] ciphertext) throws GeneralSecurityException { 
    byte[] key = template(); /* Initialize the fixed bytes of "key" */ 
    Cipher nopadding = ... ; /* Create the correct cipher */ 
    for (long xy = 0; xy < 256; ++xy) { /* Iterate over possible values */ 
    for (long wz = 0; wz < 256; ++wz) { /* Is there another range? */ 
     for (int off = 0; off < 6; ++off) { 
     key[8 + off] = (byte) (xy + off); /* Set the first range */ 
     } 
     for (int off = 0; off < 6; ++off) { 
     key[16 + off] = (byte) (wz + off); /* Set the second range */ 
     } 
     nopadding.init(/* Initialize the cipher with your key */); 
     byte[] plaintext = nopadding.doFinal(ciphertext); 
     String str = new String(plaintext, StandardCharsets.US_ASCII); 
     /* Return the key if it produced valid text */ 
     if (str.indexOf('\uFFFD') < 0) return key; 
    } 
    } 
    throw new IllegalArgumentException(); /* No key found */ 
}