Java密码更新方法

Mik*_*eke 0 java encryption

我正在尝试学习 Java 编码并坚持使用 Cipher.update() 方法。它是否具有可以更新的最大数据长度?这是我所说的一个例子(我把“String s”值只是为了加快进程,这个值经过加密和解密过程):

public class AES {
    public static String s = "long string";

    public byte [] encryptAES(byte[] data, byte[] keyPass) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, UnsupportedEncodingException {

        Cipher ciph = Cipher.getInstance("AES");

        SecretKeySpec AESkeySpec = new SecretKeySpec(keyPass, "AES");
        ciph.init(ENCRYPT_MODE,AESkeySpec);

        ciph.update(s.getBytes());
        byte[] encryptedData = ciph.doFinal();

        return encryptedData;
    }
}
Run Code Online (Sandbox Code Playgroud)

解密后输出: long string

如果我改变价值

public static String s = "long long long long long long long long long long long string";
Run Code Online (Sandbox Code Playgroud)

解码后的输出将是: g long string

如果在我取出.update()方法并执行加密之后

Cipher ciph = Cipher.getInstance("AES");

SecretKeySpec AESkeySpec = new SecretKeySpec(keyPass, "AES");
ciph.init(ENCRYPT_MODE,AESkeySpec);
//ciph.update(s.getBytes());

byte[] encryptedData = ciph.doFinal(s.getBytes());
return encryptedData;
Run Code Online (Sandbox Code Playgroud)

我会得到预期的输出,如: long long long long long long long long long long long string

为什么会这样?

kan*_*kan 5

update方法返回加密块。但正如我所见,您仅从doFinal. 您应该使用来自update和来自doFinal完整加密块流的所有块。

注意:您使用的是 ECB 模式,这意味着每个块都是独立加密的,它的安全性较低,只有在您知道自己在做什么时才应该使用。这就是为什么您能够解密最后一个块(AES 为 16 字节)并看到截断的明文。更多信息:http : //en.wikipedia.org/wiki/Block_cipher_mode_of_operation