diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/io/IORuntimeException.java b/hutool-core/src/main/java/org/dromara/hutool/core/io/IORuntimeException.java
index b8f8b80b5..1126d4c31 100644
--- a/hutool-core/src/main/java/org/dromara/hutool/core/io/IORuntimeException.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/io/IORuntimeException.java
@@ -12,7 +12,6 @@
package org.dromara.hutool.core.io;
-import org.dromara.hutool.core.exception.ExceptionUtil;
import org.dromara.hutool.core.text.StrUtil;
/**
@@ -23,24 +22,72 @@ import org.dromara.hutool.core.text.StrUtil;
public class IORuntimeException extends RuntimeException {
private static final long serialVersionUID = 8247610319171014183L;
- public IORuntimeException(final Throwable e) {
- super(ExceptionUtil.getMessage(e), e);
+ /**
+ * 构造
+ */
+ public IORuntimeException() {
+ super();
}
+ /**
+ * 构造
+ *
+ * @param e 异常
+ */
+ public IORuntimeException(final Throwable e) {
+ super(e);
+ }
+
+ /**
+ * 构造
+ *
+ * @param message 消息
+ */
public IORuntimeException(final String message) {
super(message);
}
+ /**
+ * 构造
+ *
+ * @param messageTemplate 消息模板
+ * @param params 参数
+ */
public IORuntimeException(final String messageTemplate, final Object... params) {
super(StrUtil.format(messageTemplate, params));
}
- public IORuntimeException(final String message, final Throwable throwable) {
- super(message, throwable);
+ /**
+ * 构造
+ *
+ * @param message 消息
+ * @param cause 被包装的子异常
+ */
+ public IORuntimeException(final String message, final Throwable cause) {
+ super(message, cause);
}
- public IORuntimeException(final Throwable throwable, final String messageTemplate, final Object... params) {
- super(StrUtil.format(messageTemplate, params), throwable);
+ /**
+ * 构造
+ *
+ * @param message 消息
+ * @param cause 被包装的子异常
+ * @param enableSuppression 是否启用抑制
+ * @param writableStackTrace 堆栈跟踪是否应该是可写的
+ */
+ public IORuntimeException(final String message, final Throwable cause, final boolean enableSuppression, final boolean writableStackTrace) {
+ super(message, cause, enableSuppression, writableStackTrace);
+ }
+
+ /**
+ * 构造
+ *
+ * @param cause 被包装的子异常
+ * @param messageTemplate 消息模板
+ * @param params 参数
+ */
+ public IORuntimeException(final Throwable cause, final String messageTemplate, final Object... params) {
+ super(StrUtil.format(messageTemplate, params), cause);
}
/**
diff --git a/hutool-crypto/src/main/java/org/dromara/hutool/crypto/openssl/OpenSSLPBECommon.java b/hutool-crypto/src/main/java/org/dromara/hutool/crypto/openssl/OpenSSLPBECommon.java
deleted file mode 100755
index aab8966c5..000000000
--- a/hutool-crypto/src/main/java/org/dromara/hutool/crypto/openssl/OpenSSLPBECommon.java
+++ /dev/null
@@ -1,43 +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.openssl;
-
-import org.dromara.hutool.crypto.KeyUtil;
-import org.dromara.hutool.crypto.SecureUtil;
-
-import javax.crypto.Cipher;
-import javax.crypto.SecretKey;
-import javax.crypto.spec.PBEKeySpec;
-import javax.crypto.spec.PBEParameterSpec;
-import java.nio.charset.StandardCharsets;
-
-public class OpenSSLPBECommon {
- protected static final int SALT_SIZE_BYTES = 8;
- /**
- * OpenSSL's magic initial bytes.
- */
- protected static final byte[] SALTED_MAGIC = "Salted__".getBytes(StandardCharsets.US_ASCII);
- protected static final String OPENSSL_HEADER_ENCODE = "ASCII";
-
- protected static Cipher initializeCipher(char[] password, byte[] salt, int cipherMode,
- final String algorithm, int iterationCount)
- throws Exception {
-
- final Cipher cipher = SecureUtil.createCipher(algorithm);
-
- final SecretKey key = KeyUtil.generateKey(algorithm, new PBEKeySpec(password));
- cipher.init(cipherMode, key, new PBEParameterSpec(salt, iterationCount));
-
- return cipher;
- }
-}
diff --git a/hutool-crypto/src/main/java/org/dromara/hutool/crypto/openssl/OpenSSLPBEInputStream.java b/hutool-crypto/src/main/java/org/dromara/hutool/crypto/openssl/OpenSSLPBEInputStream.java
index ba9c8eb18..235e1fb6f 100755
--- a/hutool-crypto/src/main/java/org/dromara/hutool/crypto/openssl/OpenSSLPBEInputStream.java
+++ b/hutool-crypto/src/main/java/org/dromara/hutool/crypto/openssl/OpenSSLPBEInputStream.java
@@ -12,97 +12,52 @@
package org.dromara.hutool.crypto.openssl;
-import org.dromara.hutool.core.array.ArrayUtil;
-import org.dromara.hutool.core.text.StrUtil;
+import org.dromara.hutool.crypto.CryptoException;
+import org.dromara.hutool.crypto.KeyUtil;
+import org.dromara.hutool.crypto.SecureUtil;
+import org.dromara.hutool.crypto.SpecUtil;
-import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
-import javax.crypto.IllegalBlockSizeException;
-import java.io.IOException;
+import javax.crypto.CipherInputStream;
import java.io.InputStream;
-import java.util.Arrays;
-/*
-source: http://stackoverflow.com/questions/11783062/how-to-decrypt-an-encrypted-file-in-java-with-openssl-with-aes
-*/
-public class OpenSSLPBEInputStream extends InputStream {
+/**
+ * OpenSSL风格的PBE输入流,用于密文解密
+ * 来自:http://stackoverflow.com/questions/11783062/how-to-decrypt-an-encrypted-file-in-java-with-openssl-with-aes
+ *
+ * @author looly
+ * @since 6.0.0
+ */
+public class OpenSSLPBEInputStream extends CipherInputStream {
- protected final static int READ_BLOCK_SIZE = 64 * 1024;
-
- private final Cipher cipher;
- private final InputStream inStream;
-
- private final byte[] bufferCipher = new byte[READ_BLOCK_SIZE];
- private byte[] bufferClear = null;
-
- private int index = Integer.MAX_VALUE;
- private int maxIndex = 0;
-
- public OpenSSLPBEInputStream(final InputStream streamIn,
+ /**
+ * 构造
+ *
+ * @param in 流
+ * @param algorithm 算法
+ * @param iterationCount 摘要次数
+ * @param password 口令
+ */
+ public OpenSSLPBEInputStream(final InputStream in,
final String algorithm,
final int iterationCount,
- final char[] password) throws IOException {
+ final char[] password) {
- this.inStream = streamIn;
-
- readHeader();
- final byte[] salt = readSalt();
+ super(in, createDecryptCipher(algorithm,
+ SaltMagic.getSalt(in), iterationCount, password));
+ }
+ private static Cipher createDecryptCipher(final String algorithm, final byte[] salt,
+ final int iterationCount,
+ final char[] password) {
+ final Cipher cipher = SecureUtil.createCipher(algorithm);
try {
- this.cipher = OpenSSLPBECommon.initializeCipher(password, salt, Cipher.DECRYPT_MODE, algorithm, iterationCount);
+ cipher.init(Cipher.DECRYPT_MODE,
+ KeyUtil.generatePBEKey(algorithm, password),
+ SpecUtil.createPBEParameterSpec(salt, iterationCount));
} catch (final Exception e) {
- throw new IOException(e);
+ throw new CryptoException(e);
}
- }
-
- @Override
- public int available() throws IOException {
- return inStream.available();
- }
-
- @Override
- public int read() throws IOException {
- if (maxIndex < 0) {
- return -1;
- }
- if (index > maxIndex) {
- index = 0;
- final int read = inStream.read(bufferCipher);
-
- if (read != -1) {
- bufferClear = cipher.update(bufferCipher, 0, read);
- }
-
- if (read == -1 || bufferClear == null || bufferClear.length == 0) {
- try {
- bufferClear = cipher.doFinal();
- } catch (IllegalBlockSizeException | BadPaddingException e) {
- bufferClear = null;
- }
- }
-
- maxIndex = bufferClear == null ? -1 : bufferClear.length - 1;
-
- if (maxIndex < 0) {
- return -1;
- }
- }
-
- return bufferClear[index++] & 0xff;
- }
-
- private void readHeader() throws IOException {
- final byte[] headerBytes = new byte[OpenSSLPBECommon.SALTED_MAGIC.length];
- inStream.read(headerBytes);
-
- if (!Arrays.equals(OpenSSLPBECommon.SALTED_MAGIC, headerBytes)) {
- throw new IOException("unexpected file header " + StrUtil.utf8Str(headerBytes));
- }
- }
-
- private byte[] readSalt() throws IOException {
- final byte[] salt = new byte[OpenSSLPBECommon.SALT_SIZE_BYTES];
- inStream.read(salt);
- return salt;
+ return cipher;
}
}
diff --git a/hutool-crypto/src/main/java/org/dromara/hutool/crypto/openssl/OpenSSLPBEOutputStream.java b/hutool-crypto/src/main/java/org/dromara/hutool/crypto/openssl/OpenSSLPBEOutputStream.java
new file mode 100644
index 000000000..69f2b9ddb
--- /dev/null
+++ b/hutool-crypto/src/main/java/org/dromara/hutool/crypto/openssl/OpenSSLPBEOutputStream.java
@@ -0,0 +1,77 @@
+/*
+ * 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.openssl;
+
+import org.dromara.hutool.core.io.IORuntimeException;
+import org.dromara.hutool.core.util.RandomUtil;
+import org.dromara.hutool.crypto.CryptoException;
+import org.dromara.hutool.crypto.KeyUtil;
+import org.dromara.hutool.crypto.SecureUtil;
+import org.dromara.hutool.crypto.SpecUtil;
+
+import javax.crypto.Cipher;
+import javax.crypto.CipherOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+/**
+ * OpenSSL风格的PBE输出流,用于生成密文
+ * 来自:http://stackoverflow.com/questions/11783062/how-to-decrypt-an-encrypted-file-in-java-with-openssl-with-aes
+ *
+ * @author looly
+ * @since 6.0.0
+ */
+public class OpenSSLPBEOutputStream extends CipherOutputStream {
+ protected static final int WRITE_BLOCK_SIZE = 64 * 1024;
+
+ /**
+ * 构造
+ *
+ * @param out 流
+ * @param algorithm 算法
+ * @param iterationCount 摘要次数
+ * @param password 口令
+ */
+ public OpenSSLPBEOutputStream(final OutputStream out,
+ final String algorithm,
+ final int iterationCount,
+ final char[] password) {
+ super(out, createEncryptCipher(algorithm, writeRandomHeader(out),
+ iterationCount, password));
+ }
+
+ private static byte[] writeRandomHeader(final OutputStream out) throws IORuntimeException {
+ final byte[] salt = RandomUtil.randomBytes(SaltMagic.SALT_LEN);
+ try {
+ out.write(SaltMagic.SALTED_MAGIC);
+ out.write(salt);
+ } catch (final IOException e) {
+ throw new IORuntimeException(e);
+ }
+ return salt;
+ }
+
+ private static Cipher createEncryptCipher(final String algorithm, final byte[] salt,
+ final int iterationCount,
+ final char[] password) {
+ final Cipher cipher = SecureUtil.createCipher(algorithm);
+ try {
+ cipher.init(Cipher.ENCRYPT_MODE,
+ KeyUtil.generatePBEKey(algorithm, password),
+ SpecUtil.createPBEParameterSpec(salt, iterationCount));
+ } catch (final Exception e) {
+ throw new CryptoException(e);
+ }
+ return cipher;
+ }
+}
diff --git a/hutool-crypto/src/main/java/org/dromara/hutool/crypto/symmetric/OpenSSLSaltParser.java b/hutool-crypto/src/main/java/org/dromara/hutool/crypto/openssl/OpenSSLSaltParser.java
old mode 100755
new mode 100644
similarity index 64%
rename from hutool-crypto/src/main/java/org/dromara/hutool/crypto/symmetric/OpenSSLSaltParser.java
rename to hutool-crypto/src/main/java/org/dromara/hutool/crypto/openssl/OpenSSLSaltParser.java
index bdad21076..85e1d720e
--- a/hutool-crypto/src/main/java/org/dromara/hutool/crypto/symmetric/OpenSSLSaltParser.java
+++ b/hutool-crypto/src/main/java/org/dromara/hutool/crypto/openssl/OpenSSLSaltParser.java
@@ -10,15 +10,13 @@
* See the Mulan PSL v2 for more details.
*/
-package org.dromara.hutool.crypto.symmetric;
+package org.dromara.hutool.crypto.openssl;
-import org.dromara.hutool.core.array.ArrayUtil;
import org.dromara.hutool.core.lang.Assert;
import org.dromara.hutool.core.text.StrUtil;
import org.dromara.hutool.core.util.ByteUtil;
import org.dromara.hutool.crypto.digest.MD5;
-import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.Arrays;
@@ -34,74 +32,6 @@ import java.util.Arrays;
* @since 6.0.0
*/
public class OpenSSLSaltParser {
- private final static byte SALT_LEN = 8;
-
- /**
- * OpenSSL's magic initial bytes.
- */
- private static final byte[] SALTED_MAGIC = "Salted__".getBytes(StandardCharsets.US_ASCII);
-
- /**
- * 获取魔术值和随机盐的长度:16(128位)
- */
- public static final int MAGIC_SALT_LENGTH = SALTED_MAGIC.length + SALT_LEN;
-
- /**
- * 获取去除头部盐的加密数据
- *
- * @param encryptedData 密文
- * @return 实际密文
- */
- public static byte[] getData(final byte[] encryptedData) {
- if (ArrayUtil.startWith(encryptedData, SALTED_MAGIC)) {
- return Arrays.copyOfRange(encryptedData, SALTED_MAGIC.length + SALT_LEN, encryptedData.length);
- }
- return encryptedData;
- }
-
- /**
- * 获取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, MAGIC_SALT_LENGTH);
- }
- return null;
- }
-
- /**
- * 为加密后的数据添加Magic头,生成的密文格式为:
- *
- * Salted__[salt][data] - *- * - * @param data 数据 - * @param salt 加盐值,必须8位,{@code null}表示返回原文 - * @return 密文 - */ - public static byte[] addMagic(final byte[] data, final byte[] salt) { - if (null == salt) { - return data; - } - Assert.isTrue(SALT_LEN == salt.length); - return ByteUtil.concat(SALTED_MAGIC, salt, data); - } - - /** - * 获取Magic头,生成的密文格式为: - *
- * Salted__[salt] - *- * - * @param salt 加盐值,必须8位,不能为{@code null} - * @return Magic头 - */ - public static byte[] getSaltedMagic(final byte[] salt) { - return ByteUtil.concat(SALTED_MAGIC, salt); - } /** * 创建MD5 OpenSSLSaltParser @@ -175,7 +105,7 @@ public class OpenSSLSaltParser { keyAndIvResult[0] = pass; return keyAndIvResult; } - Assert.isTrue(SALT_LEN == salt.length); + Assert.isTrue(SaltMagic.SALT_LEN == salt.length); final byte[] passAndSalt = ByteUtil.concat(pass, salt); diff --git a/hutool-crypto/src/main/java/org/dromara/hutool/crypto/openssl/SaltMagic.java b/hutool-crypto/src/main/java/org/dromara/hutool/crypto/openssl/SaltMagic.java new file mode 100644 index 000000000..aba2500b8 --- /dev/null +++ b/hutool-crypto/src/main/java/org/dromara/hutool/crypto/openssl/SaltMagic.java @@ -0,0 +1,133 @@ +/* + * 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.openssl; + +import org.dromara.hutool.core.array.ArrayUtil; +import org.dromara.hutool.core.io.IORuntimeException; +import org.dromara.hutool.core.lang.Assert; +import org.dromara.hutool.core.text.StrUtil; +import org.dromara.hutool.core.util.ByteUtil; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; + +/** + * 加盐值魔数
+ * Salted__[salt][data] + *+ * + * @param data 数据 + * @param salt 加盐值,必须8位,{@code null}表示返回原文 + * @return 密文 + */ + public static byte[] addMagic(final byte[] data, final byte[] salt) { + if (null == salt) { + return data; + } + Assert.isTrue(SALT_LEN == salt.length); + return ByteUtil.concat(SALTED_MAGIC, salt, data); + } + + /** + * 获取Magic头,生成的密文格式为: + *
+ * Salted__[salt] + *+ * + * @param salt 加盐值,必须8位,不能为{@code null} + * @return Magic头 + */ + public static byte[] getSaltedMagic(final byte[] salt) { + return ByteUtil.concat(SALTED_MAGIC, salt); + } +} diff --git a/hutool-crypto/src/main/java/org/dromara/hutool/crypto/openssl/package-info.java b/hutool-crypto/src/main/java/org/dromara/hutool/crypto/openssl/package-info.java new file mode 100644 index 000000000..d78b815ca --- /dev/null +++ b/hutool-crypto/src/main/java/org/dromara/hutool/crypto/openssl/package-info.java @@ -0,0 +1,19 @@ +/* + * 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. + */ + +/** + * OpenSSL相关封装 + * + * @author looly + * @since 6.0.0 + */ +package org.dromara.hutool.crypto.openssl; 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 f9ae4564a..a71829dcb 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 @@ -21,6 +21,8 @@ import org.dromara.hutool.core.lang.Opt; import org.dromara.hutool.core.text.StrUtil; import org.dromara.hutool.core.util.RandomUtil; import org.dromara.hutool.crypto.*; +import org.dromara.hutool.crypto.openssl.OpenSSLSaltParser; +import org.dromara.hutool.crypto.openssl.SaltMagic; import javax.crypto.Cipher; import javax.crypto.CipherInputStream; @@ -311,7 +313,7 @@ public class SymmetricCrypto implements SymmetricEncryptor, SymmetricDecryptor, } finally { lock.unlock(); } - return OpenSSLSaltParser.addMagic(result, salt); + return SaltMagic.addMagic(result, salt); } @Override @@ -358,11 +360,11 @@ public class SymmetricCrypto implements SymmetricEncryptor, SymmetricDecryptor, final byte[] decryptData; lock.lock(); - final byte[] salt = OpenSSLSaltParser.getSalt(bytes); + final byte[] salt = SaltMagic.getSalt(bytes); try { final Cipher cipher = initMode(Cipher.DECRYPT_MODE, salt); blockSize = cipher.getBlockSize(); - decryptData = cipher.doFinal(OpenSSLSaltParser.getData(bytes)); + decryptData = cipher.doFinal(SaltMagic.getData(bytes)); } catch (final Exception e) { throw new CryptoException(e); } finally { diff --git a/hutool-crypto/src/test/java/org/dromara/hutool/crypto/symmetric/SaltUtilTest.java b/hutool-crypto/src/test/java/org/dromara/hutool/crypto/openssl/SaltTest.java old mode 100755 new mode 100644 similarity index 87% rename from hutool-crypto/src/test/java/org/dromara/hutool/crypto/symmetric/SaltUtilTest.java rename to hutool-crypto/src/test/java/org/dromara/hutool/crypto/openssl/SaltTest.java index 40d51e08b..994e7db49 --- a/hutool-crypto/src/test/java/org/dromara/hutool/crypto/symmetric/SaltUtilTest.java +++ b/hutool-crypto/src/test/java/org/dromara/hutool/crypto/openssl/SaltTest.java @@ -10,22 +10,20 @@ * See the Mulan PSL v2 for more details. */ -package org.dromara.hutool.crypto.symmetric; +package org.dromara.hutool.crypto.openssl; import org.dromara.hutool.core.codec.binary.Base64; import org.dromara.hutool.core.io.IoUtil; -import org.dromara.hutool.core.lang.Console; import org.dromara.hutool.crypto.KeyUtil; import org.dromara.hutool.crypto.SecureUtil; -import org.dromara.hutool.crypto.openssl.OpenSSLPBEInputStream; +import org.dromara.hutool.crypto.symmetric.SymmetricCrypto; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import javax.crypto.SecretKey; import java.io.ByteArrayInputStream; -import java.io.IOException; -public class SaltUtilTest { +public class SaltTest { /** * 测试: @@ -35,7 +33,7 @@ public class SaltUtilTest { void rc4Test() { final String encrypted = "U2FsdGVkX19DSROPe0+Ejkw84osqWw=="; - final byte[] salt = OpenSSLSaltParser.getSalt(SecureUtil.decode(encrypted)); + final byte[] salt = SaltMagic.getSalt(SecureUtil.decode(encrypted)); Assertions.assertNotNull(salt); final byte[][] keyAndIV = OpenSSLSaltParser.ofMd5(32, "RC4") @@ -46,7 +44,7 @@ public class SaltUtilTest { final SecretKey rc4Key = KeyUtil.generateKey("RC4", keyAndIV[0]); Assertions.assertNotNull(rc4Key); - final byte[] data = OpenSSLSaltParser.getData(SecureUtil.decode(encrypted)); + final byte[] data = SaltMagic.getData(SecureUtil.decode(encrypted)); final SymmetricCrypto rc4 = new SymmetricCrypto("RC4", rc4Key); final String decrypt = rc4.decryptStr(data); @@ -83,7 +81,7 @@ public class SaltUtilTest { * https://stackoverflow.com/questions/11783062/how-to-decrypt-file-in-java-encrypted-with-openssl-command-using-aes */ @Test - void aesTest2() throws IOException { + void aesUseStreamTest() { final String encrypted = "U2FsdGVkX1+lqsuKAR+OdOeNduvx5wgXf6yEUdDIh3g="; final String pass = "1234567890123456"; final String algorithm = "PBEWITHMD5AND256BITAES-CBC-OPENSSL";