From b3a191bf908f050222705cbc855994bcc173fac6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A3=98=E8=BE=B0?= Date: Wed, 9 Jun 2021 16:13:30 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=B9=E7=A7=B0=E5=AF=86=E7=A0=81=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0update=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../crypto/symmetric/SymmetricCrypto.java | 28 +++++++++++++++++++ .../crypto/test/symmetric/SymmetricTest.java | 14 ++++++++++ 2 files changed, 42 insertions(+) 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 d077a8dd6..e5719100d 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));