diff --git a/hutool-crypto/src/main/java/cn/hutool/crypto/symmetric/SymmetricCrypto.java b/hutool-crypto/src/main/java/cn/hutool/crypto/symmetric/SymmetricCrypto.java index 68431759c..a353cb72d 100644 --- a/hutool-crypto/src/main/java/cn/hutool/crypto/symmetric/SymmetricCrypto.java +++ b/hutool-crypto/src/main/java/cn/hutool/crypto/symmetric/SymmetricCrypto.java @@ -218,6 +218,34 @@ public class SymmetricCrypto implements Serializable { } } + /** + * 更新数据,分组加密中间结果可以当作随机数 + * + * @param data 被加密的bytes + * @return update之后的bytes + */ + public byte[] update(byte[] data) { + lock.lock(); + try { + final Cipher cipher = initCipher(Cipher.ENCRYPT_MODE); + return cipher.update(paddingDataWithZero(data, cipher.getBlockSize())); + } catch (Exception e) { + throw new CryptoException(e); + } finally { + lock.unlock(); + } + } + + /** + * 更新数据,分组加密中间结果可以当作随机数 + * + * @param data 被加密的bytes + * @return update之后的hex数据 + */ + public String updateHex(byte[] data) { + return HexUtil.encodeHexStr(update(data)); + } + /** * 加密,针对大数据量,可选结束后是否关闭流 * diff --git a/hutool-crypto/src/test/java/cn/hutool/crypto/test/symmetric/SymmetricTest.java b/hutool-crypto/src/test/java/cn/hutool/crypto/test/symmetric/SymmetricTest.java index 5cee56197..adfe4fa8a 100644 --- a/hutool-crypto/src/test/java/cn/hutool/crypto/test/symmetric/SymmetricTest.java +++ b/hutool-crypto/src/test/java/cn/hutool/crypto/test/symmetric/SymmetricTest.java @@ -14,6 +14,7 @@ import cn.hutool.crypto.symmetric.DESede; import cn.hutool.crypto.symmetric.SymmetricAlgorithm; import cn.hutool.crypto.symmetric.SymmetricCrypto; import cn.hutool.crypto.symmetric.Vigenere; +import java.nio.charset.StandardCharsets; import org.junit.Assert; import org.junit.Test; @@ -108,6 +109,19 @@ public class SymmetricTest { Assert.assertEquals("cd0e3a249eaf0ed80c330338508898c4bddcfd665a1b414622164a273ca5daf7b4ebd2c00aaa66b84dd0a237708dac8e", encryptHex); } + @Test + public void aesUpdateTest() { + String content = "4321c9a2db2e6b08987c3b903d8d11ff"; + AES aes = new AES(Mode.CBC, Padding.PKCS5Padding, "0123456789ABHAEQ".getBytes(), "DYgjCEIMVrj2W9xN".getBytes()); + + // 加密为16进制表示 + String randomData = aes.updateHex(content.getBytes(StandardCharsets.UTF_8)); + String randomData2 = aes.updateHex(content.getBytes(StandardCharsets.UTF_8)); + Assert.assertEquals(randomData2, randomData); + Assert.assertEquals(randomData, "cd0e3a249eaf0ed80c330338508898c4"); + } + + @Test public void aesZeroPaddingTest() { String content = RandomUtil.randomString(RandomUtil.randomInt(200));