我正在尝试制作解密逻辑并知道加密字符串已经使用: 键:8d6ea4d3e6f8c4f8641516baa5e42b85 转型:AES / CBC / ISO10126PADDING 盐:1c4dd21d7ba43bdd 迭代次数:0 加密字符串:JO0blEp + nEl5nNhgUqoZRJNecogM1XHIXUCatPOJycs =
这里给出了密钥和盐样本。重点是显示我拥有此数据的格式。加密方法基于JDK(SunJCE)的默认JCE提供程序。
现在基于我上面提到的这种信息,我正在尝试构建解密逻辑。几个疑惑: 1.使用AES-265时,它可以有128位密钥和64位盐值吗?或者我错误地解释了这些信息。 2.看到加密的字符串,它看起来像是Base64编码的值,我们需要在解密时对其进行解码。我的理解是否正确? 3.下面是我正在编写的解密逻辑,它给出了错误:“javax.crypto.BadPaddingException:给定最终块未正确填充”当我调用doFinal()函数时。 从最近三天开始我就被打到了这里:(。你能指出或给我一些确切的代码,用于在这里用信息进行解密:
public static void main(String[] args) throws Exception
{
String encstring = "JO0blEp+nEl5nNhgUqoZRJNecogM1XHIXUCatPOJycs=";
String salt1 = "1c4dd21d7ba43bdd";
String keyStr = "8d6ea4d3e6f8c4f8641516baa5e42b85";
byte[] keyBytes = Hex.decodeHex(keyStr.toCharArray());
SecretKey secret2 = new SecretKeySpec(keyBytes, "AES");
byte[] iv = new byte[]{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
AlgorithmParameterSpec params = new IvParameterSpec(iv);
Cipher cipher2 = Cipher.getInstance("AES/CBC/ISO10126PADDING", "SunJCE");
cipher2.init(Cipher.DECRYPT_MODE, secret2, params);
byte[] encryptedString = Base64.decodeBase64(encstring.getBytes());
byte[] plaintext1 = cipher2.doFinal(encryptedString);
System.out.println(new String(plaintext));
}
}
答案 0 :(得分:-1)
首先观察几点:
你说它是 AES256 (使用 256位键),但你的密钥看起来可能是32位十六进制数字,它提供 128位< / strong>关键数据。
您说您有 salt 但AES不使用盐。而你实际上并没有在你的代码中使用salt。
您谈论 0次迭代,但迭代不是您为AES指定的,并且它不会为0.
我的猜测是你的密钥实际上是用来生成密钥的密码。 Somethig喜欢:
SecretKeyFactory factory = SecretKeyFactory.getInstance(algorithm);
KeySpec spec = new PBEKeySpec(password, salt, iterations, keyLength);
SecretKey theKey = factory.generateSecret(spec);