gpt4 book ai didi

java - Java 中给定 key 的 AES 加密

转载 作者:行者123 更新时间:2023-12-02 11:42:35 26 4
gpt4 key购买 nike

我正在尝试用 Java 进行 AES 加密。我有以下功能:

public static String encrypt(String plainText, String key) throws Exception {
if (plainText == null || plainText.length() == 0) {
return plainText;
}

// get aes key
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");

// encrypt
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
byte[] bytes = cipher.doFinal(plainText.getBytes("UTF-8"));

//encode
String encoded = Base64.encodeToString(bytes, Base64.NO_PADDING | Base64.NO_WRAP);

return encoded;
}

我的目标是每次都能够使用给定 key 以相同的方式加密某些文本。也就是说,如果我多次使用相同的两个参数调用此函数,我希望每次调用时都返回相同的字符串。我会提前说,我知道这不是密码学应该如何完成的,但我的项目需要此功能。

不幸的是,事实并非如此。第 7 行生成的 key 似乎每次都以不同的方式加密我的字符串。我认为该库的较低级别上发生了某种额外的随机自动加盐,从而阻止了我实现我的目标。

有谁知道Java中的一种方法,如何每次使用给定的 key 将给定的字符串加密为相同的值?谢谢。

更新/澄清:这不是为了安全。这是为了对数据进行加密,以便对可能接触到应用程序本身工作的某些人进行混淆。该信息不是高度敏感的,但我确实希望对其进行加密,然后使用相同的 key 进行解密。我还有其他人与我一起使用各自语言的库来解决这个问题,例如Ruby 及其库允许他们每次都使用给定 key 以相同的方式加密值。我们都希望使用相同的加密算法的相同参数: key 长度:128 位运作方式:CBC初始化 vector :无(全零)

如果不设置初始化 vector ,是否可能是随机分配的?我得检查一下。

最佳答案

是的,Java - 或者更确切地说,在 CBC 模式实现中提供 AES 的安全提供程序 - 可能会默认为随机 IV(然后您必须在之后检索该 IV 并将其包含在密文中),如果您没有明确指定它,您会得到安全、随机的密文。

如果您想使用零 IV,则必须明确指定它:

cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, new IvParameterSpec(new byte[cipher.getBlockSize()]);

这仅比 ECB 模式稍微安全一些,因为初始密文 block 中不同消息的任何重复都会立即被攻击者看到。

如果您想要一种更安全的模式,无需随机 IV(CBC 模式需要随机 IV 才能获得 CPA 安全性),那么您可以查看合成 IV (SIV) 模式或 GCM-SIV。对于这些模式,整个消息需要与之前的消息相同才能将信息泄露给攻击者。然而它很慢,不包含在标准 VM 中,并且密文可能比 AES/CBC 更大(包含 IV/标签与填充要求)。

关于java - Java 中给定 key 的 AES 加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48439278/

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