我在SO和整个Web上尝试了许多答案,但仍然没有成功。

我使用以下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�


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

最佳答案

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


第一个工具的输出已经被Base 64编码。 RIJNDAEL-128:r0GR和RIJNDAEL-256:yAVy。不需要第二次编码。由于不能打印二进制数据,它会自动选择此选项。
Java没有本地的Rijndael-256,您必须为此使用BouncyCastle。 Rijndael-128应该是AES,这意味着它们的块大小均为128位。
IV几乎肯定需要包含零字节。例如:

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


请注意,点击率模式不使用IV,而是使用随机数。
检索字节时,始终指定编码:"exo123exo1exo123".getBytes("UTF-8")。最好在任何地方都使用UTF-8。如果跨使用不同系统编码的系统发送数据,将导致难以发现问题。




再看一遍在线工具并不能用于任何东西,因为目前尚不清楚它是如何工作的。我发现:


无论大小如何,任何密钥都会生成密文,这表明您输入的“密钥”实际上是散列的,并且存在一百万种可以完成的方式。我可以使用上述方法对其进行解密,因此密钥实际上按原样使用而没有哈希。这表明密钥填充为0x00字节,直到有效密钥大小为止。当密钥太大时,它可能会被截断。
16个字符的明文加密为16个字节的密文(编码为24),而17个字符的明文加密为32个字节的密文(编码为44)。这意味着没有使用可能实际上是零填充的可识别填充。


这是交易破坏者:


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




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


每次加密内容时,都应随机生成IV。它不是秘密的,但应该是唯一的。只需在加密后将其添加到密文中,然后在解密之前将其切成片即可。
尽可能使用CCM或GCM之类的身份验证模式。自己进行认证加密比较困难,但是另一种方法是使用加密-然后-mac范例。

08-07 05:38