用NoPadding解密DESede密码

时间:2017-10-13 22:10:45

标签: java des 3des

对于Crypto类,我们使用ECB给出了DESede密文,没有填充=> " 6t8Z5bKl5ybJL + MiFerNBmiTDS7wlTEUdWNwJJApWmQ =="这是base64形式。 我们得到了关于密钥的线索,因此我构造了所有可能的密钥(所有密钥都是ASCII格式)。

            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时,我应该在某个" base"中给出密钥。或者我想要在某个基础上解密的字符串。

1 个答案:

答案 0 :(得分: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 */
}