Java中的AES解密不返回与明文相同的字符串



我试图在java中创建一个程序,其中一部分使用AES加密来加密我在编码类中的最终项目数据。以下是我用于加密的代码:

static String symmetric(String info, String key, String mode) {
try {
Cipher c = Cipher.getInstance("AES/ECB/PKCS5Padding");
byte [] bytes = Base64.getDecoder().decode(Crypto.sha256(key));
byte [] information = Base64.getDecoder().decode(info);
Key k = new SecretKeySpec(bytes, "AES");
if (mode.equals("ENCRYPT")) {
c.init(Cipher.ENCRYPT_MODE, k);
} else if (mode.equals("DECRYPT")) {
c.init(Cipher.DECRYPT_MODE, k);
}

return (Base64.getEncoder().encodeToString(c.doFinal(information)).trim());

} catch (Exception e) {
JOptionPane.showMessageDialog(null, e.getMessage());
}
return (null);
}

当我使用String ciphterText = symmetric("message", "key", "ENCRYPT")加密我的数据并使用symmetric(cipherText, "key", "DECRYPT")解密密文时,它返回的字符串是"messagc="。我担心填充很奇怪,但我不知道如何修复它。

供参考:Crypto.sha256(String input)是我创建的一个方法,它返回info的sha256哈希值作为base 64字符串。下面是它的代码,如果有帮助的话:

public static String sha256(String input) {
try {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte [] tempHash = digest.digest(input.getBytes(StandardCharsets.UTF_8));
return (Base64.getEncoder().encodeToString(tempHash));
} catch (NoSuchAlgorithmException e) {
JOptionPane.showMessageDialog(null, e.getMessage());
}
return (null);
}

我知道ECB与使用初始化向量的其他方法相比是不安全的,但这是一个小项目,我没有足够的时间这样做,这也是我不加盐哈希的原因。有什么我能做的吗?

这是您使用base-64编码方式的问题。

当您加密时,您正在处理"消息"。作为base-64编码字节。最后一个块是&;age&;。严格的解码器会拒绝该输入,因为它缺少填充,并且有一些额外的位溢出到第三个字节中。但允许的解码器忽略了这一点,并将数组解码为{ 0x99, 0xeb, 0x2c, 0x6a, 0x07 }

{ 0x99, 0xeb, 0x2c, 0x6a, 0x07 }正确的base64编码为"messagc="

要使其正确工作,方法中的每个语句应该根据模式标志而有所不同。将加密和解密方法分开会更清楚和干净。

最新更新