我正在尝试学习 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
为什么会这样?
该update方法返回加密块。但正如我所见,您仅从doFinal. 您应该使用来自update和来自doFinal完整加密块流的所有块。
注意:您使用的是 ECB 模式,这意味着每个块都是独立加密的,它的安全性较低,只有在您知道自己在做什么时才应该使用。这就是为什么您能够解密最后一个块(AES 为 16 字节)并看到截断的明文。更多信息:http : //en.wikipedia.org/wiki/Block_cipher_mode_of_operation
| 归档时间: |
|
| 查看次数: |
7042 次 |
| 最近记录: |