gpt4 book ai didi

使用错误 key 的 Java AES 解密

转载 作者:行者123 更新时间:2023-11-29 07:54:02 25 4
gpt4 key购买 nike

我写了一个简单的Java AES加解密如下(学习用):

//Encryption 
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
SecretKeySpec secretKey = new SecretKeySpec(key, "AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
String encryptedString = Base64.encodeBase64String(cipher.doFinal(strToEncrypt.getBytes()));
return encryptedString;

//Decryption
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
SecretKeySpec secretKey = new SecretKeySpec(key, "AES");
cipher.init(Cipher.DECRYPT_MODE, secretKey);
String decryptedString = new String(cipher.doFinal(Base64.decodeBase64(strToDecrypt)));
return decryptedString;

key 是一个可变长度的字符串,我对字符串进行MD5哈希得到128位的 key 。

我可以使用同一个 key 成功加密和解密数据。但是如果我用错误的 key 解密数据,我会得到以下异常:

javax.crypto.BadPaddingException: Given final block not properly padded

其实我期望的是,wrong-key-decryption产生了一个错误的字节,而不是像上面那样抛出异常,因为如果产生了错误的字节,黑客可能不知道解密是否正确。如果像上面那样抛出异常,那么暴力破解的结果会变得更容易确定。

那么,我的代码怎么了?

编辑:

我想我在这里犯了一个错误。黑客可能不会使用我的程序来解密。所以对于 AES,如果一个人解密失败,他会知道解密失败但不像我认为的那样从解密中得到错误的字节?这太可怕了……

最佳答案

您的代码没有任何问题(尽管您可以通过为字符和字节之间的转换指定编码而不是依赖平台编码来使其更健壮)。填充具有一定的格式,以便在解密后可以将其删除。当您使用错误的 key 解密时,填充也会出现乱码并且无法删除。这会导致异常。

在大多数情况下,攻击者会知道他得到了错误的 key ,而不仅仅是因为填充。数据字节通常也有一些结构(例如某种文件格式),或者在你的情况下,他会检测到不寻常的字符或无效的字符编码。如果以 UTF-8 为例,并非每个二进制字符串都是有效的 UTF-8 编码。

关于使用错误 key 的 Java AES 解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19172479/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com