add chacha20

This commit is contained in:
Looly 2021-09-09 18:13:29 +08:00
parent 6ddf2a19d9
commit 6b8adc8a90
2 changed files with 47 additions and 10 deletions

View File

@ -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算法实现<br>
* 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 加盐12bytes64bit
*/
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);
}
}

View File

@ -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);
// 解密为字符串