From c2d419ffdc2acc4834010502501bf725b9bf0b72 Mon Sep 17 00:00:00 2001 From: Looly Date: Wed, 26 Apr 2023 13:49:23 +0800 Subject: [PATCH] fix code --- .../hutool/crypto/CryptoException.java | 56 +++- .../org/dromara/hutool/crypto/KeyUtil.java | 2 +- .../org/dromara/hutool/crypto/SecureUtil.java | 15 +- .../provider/GlobalProviderFactory.java | 5 +- .../dromara/hutool/crypto/symmetric/RC4.java | 281 ------------------ .../hutool/crypto/symmetric/SaltUtil.java | 86 ++++++ .../crypto/symmetric/SymmetricAlgorithm.java | 4 + .../crypto/symmetric/SymmetricCrypto.java | 7 +- .../hutool/crypto/symmetric/AESTest.java | 1 + .../hutool/crypto/symmetric/RC4Test.java | 54 ++-- 10 files changed, 182 insertions(+), 329 deletions(-) delete mode 100644 hutool-crypto/src/main/java/org/dromara/hutool/crypto/symmetric/RC4.java create mode 100755 hutool-crypto/src/main/java/org/dromara/hutool/crypto/symmetric/SaltUtil.java diff --git a/hutool-crypto/src/main/java/org/dromara/hutool/crypto/CryptoException.java b/hutool-crypto/src/main/java/org/dromara/hutool/crypto/CryptoException.java index 39e4aa31c..cb6c0171e 100644 --- a/hutool-crypto/src/main/java/org/dromara/hutool/crypto/CryptoException.java +++ b/hutool-crypto/src/main/java/org/dromara/hutool/crypto/CryptoException.java @@ -13,6 +13,7 @@ package org.dromara.hutool.crypto; import org.dromara.hutool.core.exception.ExceptionUtil; +import org.dromara.hutool.core.exception.HutoolException; import org.dromara.hutool.core.text.StrUtil; /** @@ -20,30 +21,67 @@ import org.dromara.hutool.core.text.StrUtil; * @author Looly * */ -public class CryptoException extends RuntimeException { +public class CryptoException extends HutoolException { private static final long serialVersionUID = 8068509879445395353L; + /** + * 构造 + * + * @param e 异常 + */ public CryptoException(final Throwable e) { - super(ExceptionUtil.getMessage(e), e); + super(e); } + /** + * 构造 + * + * @param message 消息 + */ public CryptoException(final String message) { super(message); } + /** + * 构造 + * + * @param messageTemplate 消息模板 + * @param params 参数 + */ public CryptoException(final String messageTemplate, final Object... params) { - super(StrUtil.format(messageTemplate, params)); + super(messageTemplate, params); } - public CryptoException(final String message, final Throwable throwable) { - super(message, throwable); + /** + * 构造 + * + * @param message 消息 + * @param cause 被包装的子异常 + */ + public CryptoException(final String message, final Throwable cause) { + super(message, cause); } - public CryptoException(final String message, final Throwable throwable, final boolean enableSuppression, final boolean writableStackTrace) { - super(message, throwable, enableSuppression, writableStackTrace); + /** + * 构造 + * + * @param message 消息 + * @param cause 被包装的子异常 + * @param enableSuppression 是否启用抑制 + * @param writableStackTrace 堆栈跟踪是否应该是可写的 + */ + public CryptoException(final String message, final Throwable cause, final boolean enableSuppression, final boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); } - public CryptoException(final Throwable throwable, final String messageTemplate, final Object... params) { - super(StrUtil.format(messageTemplate, params), throwable); + /** + * 构造 + * + * @param cause 被包装的子异常 + * @param messageTemplate 消息模板 + * @param params 参数 + */ + public CryptoException(final Throwable cause, final String messageTemplate, final Object... params) { + super(cause, messageTemplate, params); } } diff --git a/hutool-crypto/src/main/java/org/dromara/hutool/crypto/KeyUtil.java b/hutool-crypto/src/main/java/org/dromara/hutool/crypto/KeyUtil.java index 1425a6c63..10225050c 100644 --- a/hutool-crypto/src/main/java/org/dromara/hutool/crypto/KeyUtil.java +++ b/hutool-crypto/src/main/java/org/dromara/hutool/crypto/KeyUtil.java @@ -17,6 +17,7 @@ import org.dromara.hutool.core.io.file.FileUtil; import org.dromara.hutool.core.io.IoUtil; import org.dromara.hutool.core.lang.Assert; import org.dromara.hutool.core.array.ArrayUtil; +import org.dromara.hutool.core.lang.Console; import org.dromara.hutool.core.text.CharUtil; import org.dromara.hutool.core.util.RandomUtil; import org.dromara.hutool.core.text.StrUtil; @@ -620,7 +621,6 @@ public class KeyUtil { */ public static KeyGenerator getKeyGenerator(final String algorithm) { final Provider provider = GlobalProviderFactory.getProvider(); - final KeyGenerator generator; try { generator = (null == provider) // diff --git a/hutool-crypto/src/main/java/org/dromara/hutool/crypto/SecureUtil.java b/hutool-crypto/src/main/java/org/dromara/hutool/crypto/SecureUtil.java index 3f021ad8e..371dfe698 100644 --- a/hutool-crypto/src/main/java/org/dromara/hutool/crypto/SecureUtil.java +++ b/hutool-crypto/src/main/java/org/dromara/hutool/crypto/SecureUtil.java @@ -25,14 +25,7 @@ import org.dromara.hutool.crypto.digest.HMac; import org.dromara.hutool.crypto.digest.HmacAlgorithm; import org.dromara.hutool.crypto.digest.MD5; import org.dromara.hutool.crypto.provider.GlobalProviderFactory; -import org.dromara.hutool.crypto.symmetric.AES; -import org.dromara.hutool.crypto.symmetric.DES; -import org.dromara.hutool.crypto.symmetric.DESede; -import org.dromara.hutool.crypto.symmetric.PBKDF2; -import org.dromara.hutool.crypto.symmetric.RC4; -import org.dromara.hutool.crypto.symmetric.SymmetricCrypto; -import org.dromara.hutool.crypto.symmetric.ZUC; -import org.dromara.hutool.crypto.symmetric.FPE; +import org.dromara.hutool.crypto.symmetric.*; import org.bouncycastle.crypto.AlphabetMapper; import javax.crypto.Cipher; @@ -593,10 +586,10 @@ public class SecureUtil { * RC4算法 * * @param key 密钥 - * @return {@link RC4} + * @return {@link SymmetricCrypto} */ - public static RC4 rc4(final String key) { - return new RC4(key); + public static SymmetricCrypto rc4(final byte[] key) { + return new SymmetricCrypto(SymmetricAlgorithm.RC4, key); } /** diff --git a/hutool-crypto/src/main/java/org/dromara/hutool/crypto/provider/GlobalProviderFactory.java b/hutool-crypto/src/main/java/org/dromara/hutool/crypto/provider/GlobalProviderFactory.java index 5c0c76ac1..f39ffe409 100644 --- a/hutool-crypto/src/main/java/org/dromara/hutool/crypto/provider/GlobalProviderFactory.java +++ b/hutool-crypto/src/main/java/org/dromara/hutool/crypto/provider/GlobalProviderFactory.java @@ -30,9 +30,9 @@ public class GlobalProviderFactory { private static final Provider provider = _createProvider(); /** - * 获取{@link Provider} + * 获取{@link Provider},无提供方,返回{@code null}表示使用JDK默认 * - * @return {@link Provider} + * @return {@link Provider} or {@code null} */ public static Provider getProvider() { return useCustomProvider ? provider : null; @@ -56,6 +56,7 @@ public class GlobalProviderFactory { private static Provider _createProvider() { final ProviderFactory factory = SpiUtil.loadFirstAvailable(ProviderFactory.class); if (null == factory) { + // 默认JCE return null; } diff --git a/hutool-crypto/src/main/java/org/dromara/hutool/crypto/symmetric/RC4.java b/hutool-crypto/src/main/java/org/dromara/hutool/crypto/symmetric/RC4.java deleted file mode 100644 index cfee25186..000000000 --- a/hutool-crypto/src/main/java/org/dromara/hutool/crypto/symmetric/RC4.java +++ /dev/null @@ -1,281 +0,0 @@ -/* - * Copyright (c) 2023 looly(loolly@aliyun.com) - * Hutool is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * http://license.coscl.org.cn/MulanPSL2 - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, - * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, - * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ - -package org.dromara.hutool.crypto.symmetric; - -import org.dromara.hutool.core.codec.HexUtil; -import org.dromara.hutool.core.codec.binary.Base64; -import org.dromara.hutool.core.text.StrUtil; -import org.dromara.hutool.core.util.ByteUtil; -import org.dromara.hutool.core.util.CharsetUtil; -import org.dromara.hutool.crypto.CryptoException; -import org.dromara.hutool.crypto.SecureUtil; - -import java.io.Serializable; -import java.nio.charset.Charset; -import java.util.concurrent.locks.ReentrantReadWriteLock; -import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock; -import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock; - -/** - * RC4加密解密算法实现
- * 注意:由于安全问题,已经基本不在HTTPS中使用了
- * 来自:https://github.com/xSAVIKx/RC4-cipher/blob/master/src/main/java/com/github/xsavikx/rc4/RC4.java - * - * @author Iurii Sergiichuk,Looly - */ -public class RC4 implements Serializable { - private static final long serialVersionUID = 1L; - - private static final int SBOX_LENGTH = 256; - /** 密钥最小长度 */ - private static final int KEY_MIN_LENGTH = 5; - - /** Sbox */ - private int[] sbox; - - private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); - - /** - * 构造 - * - * @param key 密钥 - * @throws CryptoException key长度小于5或者大于255抛出此异常 - */ - public RC4(final String key) throws CryptoException { - setKey(key); - } - - /** - * 加密 - * - * @param message 消息 - * @param charset 编码 - * @return 密文 - * @throws CryptoException key长度小于5或者大于255抛出此异常 - */ - public byte[] encrypt(final String message, final Charset charset) throws CryptoException { - return crypt(ByteUtil.toBytes(message, charset)); - } - - /** - * 加密,使用默认编码:UTF-8 - * - * @param message 消息 - * @return 密文 - * @throws CryptoException key长度小于5或者大于255抛出此异常 - */ - public byte[] encrypt(final String message) throws CryptoException { - return encrypt(message, CharsetUtil.UTF_8); - } - - /** - * 加密 - * - * @param data 数据 - * @return 加密后的Hex - * @since 4.5.12 - */ - public String encryptHex(final byte[] data) { - return HexUtil.encodeHexStr(crypt(data)); - } - - /** - * 加密 - * - * @param data 数据 - * @return 加密后的Base64 - * @since 4.5.12 - */ - public String encryptBase64(final byte[] data) { - return Base64.encode(crypt(data)); - } - - /** - * 加密 - * - * @param data 被加密的字符串 - * @param charset 编码 - * @return 加密后的Hex - * @since 4.5.12 - */ - public String encryptHex(final String data, final Charset charset) { - return HexUtil.encodeHexStr(encrypt(data, charset)); - } - - /** - * 加密,使用UTF-8编码 - * - * @param data 被加密的字符串 - * @return 加密后的Hex - * @since 5.4.4 - */ - public String encryptHex(final String data) { - return HexUtil.encodeHexStr(encrypt(data)); - } - - /** - * 加密 - * - * @param data 被加密的字符串 - * @param charset 编码 - * @return 加密后的Base64 - * @since 4.5.12 - */ - public String encryptBase64(final String data, final Charset charset) { - return Base64.encode(encrypt(data, charset)); - } - - - /** - * 加密,使用UTF-8编码 - * - * @param data 被加密的字符串 - * @return 加密后的Base64 - * @since 5.4.4 - */ - public String encryptBase64(final String data) { - return Base64.encode(encrypt(data)); - } - - /** - * 解密 - * - * @param message 消息 - * @param charset 编码 - * @return 明文 - * @throws CryptoException key长度小于5或者大于255抛出此异常 - */ - public String decrypt(final byte[] message, final Charset charset) throws CryptoException { - return StrUtil.str(crypt(message), charset); - } - - /** - * 解密,使用默认编码UTF-8 - * - * @param message 消息 - * @return 明文 - * @throws CryptoException key长度小于5或者大于255抛出此异常 - */ - public String decrypt(final byte[] message) throws CryptoException { - return decrypt(message, CharsetUtil.UTF_8); - } - - /** - * 解密Hex(16进制)或Base64表示的字符串,使用默认编码UTF-8 - * - * @param message 消息 - * @return 明文 - * @since 5.4.4 - */ - public String decrypt(final String message) { - return decrypt(SecureUtil.decode(message)); - } - - /** - * 解密Hex(16进制)或Base64表示的字符串 - * - * @param message 明文 - * @param charset 解密后的charset - * @return 明文 - * @since 5.4.4 - */ - public String decrypt(final String message, final Charset charset) { - return StrUtil.str(decrypt(message), charset); - } - - - /** - * 加密或解密指定值,调用此方法前需初始化密钥 - * - * @param msg 要加密或解密的消息 - * @return 加密或解密后的值 - */ - public byte[] crypt(final byte[] msg) { - final ReadLock readLock = this.lock.readLock(); - byte[] code; - readLock.lock(); - try { - final int[] sbox = this.sbox.clone(); - code = new byte[msg.length]; - int i = 0; - int j = 0; - for (int n = 0; n < msg.length; n++) { - i = (i + 1) % SBOX_LENGTH; - j = (j + sbox[i]) % SBOX_LENGTH; - swap(i, j, sbox); - final int rand = sbox[(sbox[i] + sbox[j]) % SBOX_LENGTH]; - code[n] = (byte) (rand ^ msg[n]); - } - } finally { - readLock.unlock(); - } - return code; - } - - /** - * 设置密钥 - * - * @param key 密钥 - * @throws CryptoException key长度小于5或者大于255抛出此异常 - */ - public void setKey(final String key) throws CryptoException { - final int length = key.length(); - if (length < KEY_MIN_LENGTH || length >= SBOX_LENGTH) { - throw new CryptoException("Key length has to be between {} and {}", KEY_MIN_LENGTH, (SBOX_LENGTH - 1)); - } - - final WriteLock writeLock = this.lock.writeLock(); - writeLock.lock(); - try { - this.sbox = initSBox(ByteUtil.toUtf8Bytes(key)); - } finally { - writeLock.unlock(); - } - } - - //----------------------------------------------------------------------------------------------------------------------- Private method start - /** - * 初始化Sbox - * - * @param key 密钥 - * @return sbox - */ - private int[] initSBox(final byte[] key) { - final int[] sbox = new int[SBOX_LENGTH]; - int j = 0; - - for (int i = 0; i < SBOX_LENGTH; i++) { - sbox[i] = i; - } - - for (int i = 0; i < SBOX_LENGTH; i++) { - j = (j + sbox[i] + (key[i % key.length]) & 0xFF) % SBOX_LENGTH; - swap(i, j, sbox); - } - return sbox; - } - - /** - * 交换指定两个位置的值 - * - * @param i 位置1 - * @param j 位置2 - * @param sbox 数组 - */ - private void swap(final int i, final int j, final int[] sbox) { - final int temp = sbox[i]; - sbox[i] = sbox[j]; - sbox[j] = temp; - } - //----------------------------------------------------------------------------------------------------------------------- Private method end -} diff --git a/hutool-crypto/src/main/java/org/dromara/hutool/crypto/symmetric/SaltUtil.java b/hutool-crypto/src/main/java/org/dromara/hutool/crypto/symmetric/SaltUtil.java new file mode 100755 index 000000000..efe3f6e94 --- /dev/null +++ b/hutool-crypto/src/main/java/org/dromara/hutool/crypto/symmetric/SaltUtil.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2023 looly(loolly@aliyun.com) + * Hutool is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +package org.dromara.hutool.crypto.symmetric; + +import org.dromara.hutool.core.array.ArrayUtil; +import org.dromara.hutool.crypto.digest.DigestUtil; + +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.util.Arrays; + +/** + * OpenSSL风格前缀和加盐相关工具类
+ * 参考:https://stackoverflow.com/questions/32508961/java-equivalent-of-an-openssl-aes-cbc-encryption + * + * @author looly + * @since 6.0.0 + */ +public class SaltUtil { + + private final static byte SALT_LEN = 8; + private final static byte IV_LEN = 16; + private final static byte KEY_LEN = 32; + + /** + * OpenSSL's magic initial bytes. + */ + private static final byte[] SALTED_MAGIC = "Salted__".getBytes(StandardCharsets.US_ASCII); + + /** + * 获取8位salt随机数
+ * + * @param encryptedData 密文 + * @return salt随机数 + */ + public static byte[] getSalt(final byte[] encryptedData) { + if (ArrayUtil.startWith(encryptedData, SALTED_MAGIC)) { + return Arrays.copyOfRange(encryptedData, SALTED_MAGIC.length, SALTED_MAGIC.length + SALT_LEN); + } + return null; + } + + /** + * 通过密钥和salt值,获取实际的密钥 + * + * @param pass 密钥 + * @param salt 加盐值 + * @return 实际密钥 + */ + public static byte[] getKey(final byte[] pass, final byte[] salt) { + if (null == salt) { + return pass; + } + final byte[] passAndSalt = arrayConcat(pass, salt); + + byte[] hash = new byte[0]; + byte[] keyAndIv = new byte[0]; + for (int i = 0; i < 3 && keyAndIv.length < 48; i++) { + final byte[] hashData = arrayConcat(hash, passAndSalt); + hash = DigestUtil.md5(hashData); + keyAndIv = arrayConcat(keyAndIv, hash); + } + + return Arrays.copyOfRange(keyAndIv, 0, KEY_LEN); + } + + private static byte[] arrayConcat(final byte[] a, final byte[] b) { + if (ArrayUtil.isEmpty(a)) { + return b; + } + final byte[] c = new byte[a.length + b.length]; + System.arraycopy(a, 0, c, 0, a.length); + System.arraycopy(b, 0, c, a.length, b.length); + return c; + } +} diff --git a/hutool-crypto/src/main/java/org/dromara/hutool/crypto/symmetric/SymmetricAlgorithm.java b/hutool-crypto/src/main/java/org/dromara/hutool/crypto/symmetric/SymmetricAlgorithm.java index ad102fba2..d73039909 100644 --- a/hutool-crypto/src/main/java/org/dromara/hutool/crypto/symmetric/SymmetricAlgorithm.java +++ b/hutool-crypto/src/main/java/org/dromara/hutool/crypto/symmetric/SymmetricAlgorithm.java @@ -43,6 +43,10 @@ public enum SymmetricAlgorithm { * RC2 */ RC2("RC2"), + /** + * RC4 + */ + RC4("RC4"), /** *PBEWithMD5AndDES */ diff --git a/hutool-crypto/src/main/java/org/dromara/hutool/crypto/symmetric/SymmetricCrypto.java b/hutool-crypto/src/main/java/org/dromara/hutool/crypto/symmetric/SymmetricCrypto.java index ccb6c081b..ec3121512 100644 --- a/hutool-crypto/src/main/java/org/dromara/hutool/crypto/symmetric/SymmetricCrypto.java +++ b/hutool-crypto/src/main/java/org/dromara/hutool/crypto/symmetric/SymmetricCrypto.java @@ -219,7 +219,7 @@ public class SymmetricCrypto implements SymmetricEncryptor, SymmetricDecryptor, * @return this * @since 5.7.17 */ - public SymmetricCrypto setRandom(final SecureRandom random){ + public SymmetricCrypto setRandom(final SecureRandom random) { this.cipherWrapper.setRandom(random); return this; } @@ -233,7 +233,7 @@ public class SymmetricCrypto implements SymmetricEncryptor, SymmetricDecryptor, * @return this * @since 5.7.12 */ - public SymmetricCrypto setMode(final CipherMode mode){ + public SymmetricCrypto setMode(final CipherMode mode) { lock.lock(); try { initMode(mode.getValue()); @@ -335,6 +335,7 @@ public class SymmetricCrypto implements SymmetricEncryptor, SymmetricDecryptor, final byte[] decryptData; lock.lock(); + try { final Cipher cipher = initMode(Cipher.DECRYPT_MODE); blockSize = cipher.getBlockSize(); @@ -395,7 +396,7 @@ public class SymmetricCrypto implements SymmetricEncryptor, SymmetricDecryptor, private SymmetricCrypto initParams(final String algorithm, AlgorithmParameterSpec paramsSpec) { if (null == paramsSpec) { byte[] iv = Opt.ofNullable(cipherWrapper) - .map(CipherWrapper::getRaw).map(Cipher::getIV).get(); + .map(CipherWrapper::getRaw).map(Cipher::getIV).get(); // 随机IV if (StrUtil.startWithIgnoreCase(algorithm, "PBE")) { diff --git a/hutool-crypto/src/test/java/org/dromara/hutool/crypto/symmetric/AESTest.java b/hutool-crypto/src/test/java/org/dromara/hutool/crypto/symmetric/AESTest.java index d84b736e0..145898ebd 100644 --- a/hutool-crypto/src/test/java/org/dromara/hutool/crypto/symmetric/AESTest.java +++ b/hutool-crypto/src/test/java/org/dromara/hutool/crypto/symmetric/AESTest.java @@ -2,6 +2,7 @@ package org.dromara.hutool.crypto.symmetric; import org.dromara.hutool.core.codec.binary.Base64; import org.dromara.hutool.core.codec.HexUtil; +import org.dromara.hutool.core.lang.Console; import org.dromara.hutool.core.util.RandomUtil; import org.dromara.hutool.crypto.KeyUtil; import org.dromara.hutool.crypto.Mode; diff --git a/hutool-crypto/src/test/java/org/dromara/hutool/crypto/symmetric/RC4Test.java b/hutool-crypto/src/test/java/org/dromara/hutool/crypto/symmetric/RC4Test.java index 59ebcdfc9..921125ff6 100644 --- a/hutool-crypto/src/test/java/org/dromara/hutool/crypto/symmetric/RC4Test.java +++ b/hutool-crypto/src/test/java/org/dromara/hutool/crypto/symmetric/RC4Test.java @@ -1,38 +1,41 @@ package org.dromara.hutool.crypto.symmetric; import org.dromara.hutool.core.util.CharsetUtil; +import org.dromara.hutool.crypto.provider.GlobalProviderFactory; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import java.nio.charset.StandardCharsets; + public class RC4Test { @Test public void testCryptMessage() { - final String key = "This is pretty long key"; - final RC4 rc4 = new RC4(key); + final byte[] key = "This is pretty long key".getBytes(); + final SymmetricCrypto SymmetricCrypto = new SymmetricCrypto("RC4", key); final String message = "Hello, World!"; - final byte[] crypt = rc4.encrypt(message); - final String msg = rc4.decrypt(crypt); + final byte[] crypt = SymmetricCrypto.encrypt(message); + final String msg = SymmetricCrypto.decryptStr(crypt); Assertions.assertEquals(message, msg); final String message2 = "Hello, World, this is megssage 2"; - final byte[] crypt2 = rc4.encrypt(message2); - final String msg2 = rc4.decrypt(crypt2); + final byte[] crypt2 = SymmetricCrypto.encrypt(message2); + final String msg2 = SymmetricCrypto.decryptStr(crypt2); Assertions.assertEquals(message2, msg2); } @Test public void testCryptWithChineseCharacters() { final String message = "这是一个中文消息!"; - final String key = "我是一个文件密钥"; - final RC4 rc4 = new RC4(key); - final byte[] crypt = rc4.encrypt(message); - final String msg = rc4.decrypt(crypt); + final byte[] key = "我是一个文件密钥".getBytes(StandardCharsets.UTF_8); + final SymmetricCrypto SymmetricCrypto = new SymmetricCrypto("RC4", key); + final byte[] crypt = SymmetricCrypto.encrypt(message); + final String msg = SymmetricCrypto.decryptStr(crypt); Assertions.assertEquals(message, msg); final String message2 = "这是第二个中文消息!"; - final byte[] crypt2 = rc4.encrypt(message2); - final String msg2 = rc4.decrypt(crypt2); + final byte[] crypt2 = SymmetricCrypto.encrypt(message2); + final String msg2 = SymmetricCrypto.decryptStr(crypt2); Assertions.assertEquals(message2, msg2); } @@ -40,14 +43,14 @@ public class RC4Test { public void testDecryptWithHexMessage() { final String message = "这是第一个用来测试密文为十六进制字符串的消息!"; final String key = "生成一个密钥"; - final RC4 rc4 = new RC4(key); - final String encryptHex = rc4.encryptHex(message, CharsetUtil.UTF_8); - final String msg = rc4.decrypt(encryptHex); + final SymmetricCrypto SymmetricCrypto = new SymmetricCrypto("RC4", key.getBytes(StandardCharsets.UTF_8)); + final String encryptHex = SymmetricCrypto.encryptHex(message, CharsetUtil.UTF_8); + final String msg = SymmetricCrypto.decryptStr(encryptHex); Assertions.assertEquals(message, msg); final String message2 = "这是第二个用来测试密文为十六进制字符串的消息!"; - final String encryptHex2 = rc4.encryptHex(message2); - final String msg2 = rc4.decrypt(encryptHex2); + final String encryptHex2 = SymmetricCrypto.encryptHex(message2); + final String msg2 = SymmetricCrypto.decryptStr(encryptHex2); Assertions.assertEquals(message2, msg2); } @@ -56,14 +59,21 @@ public class RC4Test { public void testDecryptWithBase64Message() { final String message = "这是第一个用来测试密文为Base64编码的消息!"; final String key = "生成一个密钥"; - final RC4 rc4 = new RC4(key); - final String encryptHex = rc4.encryptBase64(message, CharsetUtil.UTF_8); - final String msg = rc4.decrypt(encryptHex); + final SymmetricCrypto SymmetricCrypto = new SymmetricCrypto("RC4", key.getBytes(StandardCharsets.UTF_8)); + final String encryptHex = SymmetricCrypto.encryptBase64(message, CharsetUtil.UTF_8); + final String msg = SymmetricCrypto.decryptStr(encryptHex); Assertions.assertEquals(message, msg); final String message2 = "这是第一个用来测试密文为Base64编码的消息!"; - final String encryptHex2 = rc4.encryptBase64(message2); - final String msg2 = rc4.decrypt(encryptHex2); + final String encryptHex2 = SymmetricCrypto.encryptBase64(message2); + final String msg2 = SymmetricCrypto.decryptStr(encryptHex2); Assertions.assertEquals(message2, msg2); } + + @Test + void decryptTest() { + GlobalProviderFactory.setUseCustomProvider(false); + final String key16 = "1234567890123456"; + final SymmetricCrypto aes = new SymmetricCrypto("SymmetricCrypto", key16.getBytes()); + } }