对于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"中给出密钥。或者我想要在某个基础上解密的字符串。
答案 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 */
}