gpt4 book ai didi

java - Rijndael 128/256解密

转载 作者:行者123 更新时间:2023-11-30 03:29:55 27 4
gpt4 key购买 nike

我尝试了来自SO和整个网络的许多答案,但仍然没有成功。

我使用以下tool进行加密。

text to encrypt: tom
key: exo123exo1exo123
input (textfield or selected file above) is: text/binary
Convert output to: [i leave this unselected]
Mode: CTR
Ciphers: Rijndael-128 and Rijndael-256

得到结果后我移动here:

并用base64对其进行编码。

然后我复制字符串并将其作为参数发送到我的函数:

public String authenticate(String base64EncodedData){

byte[] input = Base64.decodeBase64(base64EncodedData);
byte[] ivBytes = "1234567812345678".getBytes();


Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding");

cipher.init(
Cipher.DECRYPT_MODE,
new SecretKeySpec("exo123exo1exo123".getBytes(), "AES"),
new IvParameterSpec(ivBytes)
);

byte[] plainText = new byte[cipher.getOutputSize(input.length)];
int plainTextLength = cipher.update(input, 0, input.length, plainText, 0);
plainTextLength += cipher.doFinal(plainText, plainTextLength);

return new String(plainText);
}

我得到的结果总是与此类似(无论我使用 Rijndael-128 还是 256 加密字符串):

.�v�Y�

当我尝试返回输入值时 - 我得到加密的字符串。所以base64 工作得很好。我做错了什么?我在这里慢慢生气。谢谢。

最佳答案

您的假设和代码存在一些问题:

  1. 第一个工具的输出已经经过 Base 64 编码。 RIJNDAEL-128:r0GR 和 RIJNDAEL-256:yAVy。不需要进行第二次编码。它会自动选择此选项,因为无法打印二进制数据。

  2. Java 中没有原生的 Rijndael-256,您必须使用 BouncyCaSTLe。 Rijndael-128 应该是 AES,这意味着两者的 block 大小都是 128 位。

  3. IV 几乎肯定需要由零字节组成。例如:

    byte[] ivBytes = new byte[16];
    Arrays.fill(ivBytes, (byte)0); // might not be necessary

    请注意,CTR 模式不使用 IV,而是使用随机数。

  4. 检索字节时始终指定编码:"exo123exo1exo123".getBytes("UTF-8")。最好在任何地方都使用 UTF-8。如果跨使用不同系统编码的系统发送数据,将会导致很难发现问题。

<小时/>

再一看,这个在线工具没有任何用处,因为尚不清楚它是如何工作的。我发现了什么:

  • 无论大小如何,任何 key 都会生成密文,这表明您输入的“ key ”实际上是经过哈希处理的,并且存在一百万种可以完成的方法。我可以用上面的方法解密它,所以 key 实际上是按原样使用而不进行哈希处理。这表明 key 被 0x00 字节填充,直到达到有效的 key 大小。当 key 太大时,它可能会被截断。

  • 16 个字符的明文加密为 16 个字节的密文(编码为 24),17 个字符的明文加密为 32 个字节的密文(编码为 44)。这意味着没有使用可识别的填充,而实际上可能是零填充。

这是交易破坏者:

  • 每次加密某些内容时,您都会得到不同的密文。在CBC模式下,这意味着在加密之前生成随机IV。问题是这个 IV 没有显示。所以没有办法完全解密。因此,如果您加密的字符超过 16 个字符,则当您按照我在本答案第一部分中描述的方式解密时,可以恢复除前 16 个字符之外的所有字符。
<小时/>

您不应该让您的系统依赖于闭源在线工具。编写自己的加密工具。一些一般性建议:

  • IV 应在每次加密内容时随机生成。它不是 secret 的,但应该是唯一的。只需将其添加到加密后的密文中,并在解密前将其切掉即可。

  • 尽可能使用 CCM 或 GCM 等身份验证模式。自己进行身份验证加密比较困难,但另一种方法是使用“先加密后MAC”范例。

关于java - Rijndael 128/256解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29306758/

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