diff --git a/hutool-crypto/src/main/java/cn/hutool/crypto/symmetric/ChaCha20.java b/hutool-crypto/src/main/java/cn/hutool/crypto/symmetric/ChaCha20.java new file mode 100644 index 000000000..09e478323 --- /dev/null +++ b/hutool-crypto/src/main/java/cn/hutool/crypto/symmetric/ChaCha20.java @@ -0,0 +1,44 @@ +package cn.hutool.crypto.symmetric; + +import cn.hutool.core.util.RandomUtil; +import cn.hutool.crypto.KeyUtil; + +import javax.crypto.spec.IvParameterSpec; + +/** + * ChaCha20算法实现
+ * ChaCha系列流密码,作为salsa密码的改良版,具有更强的抵抗密码分析攻击的特性,“20”表示该算法有20轮的加密计算。 + * + * @author looly + * @since 5.7.12 + */ +public class ChaCha20 extends SymmetricCrypto { + private static final long serialVersionUID = 1L; + + public static final String ALGORITHM_NAME = "ChaCha20"; + + /** + * 构造 + * + * @param key 密钥 + * @param iv 加盐,12bytes(64bit) + */ + public ChaCha20(byte[] key, byte[] iv) { + super(ALGORITHM_NAME, + KeyUtil.generateKey(ALGORITHM_NAME, key), + generateIvParam(iv)); + } + + /** + * 生成加盐参数 + * + * @param iv 加盐 + * @return {@link IvParameterSpec} + */ + private static IvParameterSpec generateIvParam(byte[] iv) { + if (null == iv) { + iv = RandomUtil.randomBytes(12); + } + return new IvParameterSpec(iv); + } +} diff --git a/hutool-crypto/src/test/java/cn/hutool/crypto/test/symmetric/ChaCha20Test.java b/hutool-crypto/src/test/java/cn/hutool/crypto/test/symmetric/ChaCha20Test.java index 4db1b6a95..a30e28f0b 100644 --- a/hutool-crypto/src/test/java/cn/hutool/crypto/test/symmetric/ChaCha20Test.java +++ b/hutool-crypto/src/test/java/cn/hutool/crypto/test/symmetric/ChaCha20Test.java @@ -2,13 +2,10 @@ package cn.hutool.crypto.test.symmetric; import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.RandomUtil; -import cn.hutool.crypto.KeyUtil; -import cn.hutool.crypto.symmetric.SymmetricCrypto; +import cn.hutool.crypto.symmetric.ChaCha20; import org.junit.Assert; import org.junit.Test; -import javax.crypto.spec.IvParameterSpec; - /** * 见:https://stackoverflow.com/questions/32672241/using-bouncycastles-chacha-for-file-encryption */ @@ -16,18 +13,14 @@ public class ChaCha20Test { @Test public void encryptAndDecryptTest() { - String content = "test中文"; - // 32 for 256 bit key or 16 for 128 bit byte[] key = RandomUtil.randomBytes(32); // 64 bit IV required by ChaCha20 byte[] iv = RandomUtil.randomBytes(12); - final SymmetricCrypto chacha = new SymmetricCrypto("ChaCha20", - KeyUtil.generateKey("ChaCha20", key), - new IvParameterSpec(iv) - ); + final ChaCha20 chacha = new ChaCha20(key, iv); + String content = "test中文"; // 加密为16进制表示 String encryptHex = chacha.encryptHex(content); // 解密为字符串