CryptoJs解密函数的加密函数
Encrypt function for CryptoJs decrypt function
我有从正确答案中复制的下一个代码 :
public static String decrypt(String cipherText) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidAlgorithmParameterException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
byte[] cipherData = Base64.getDecoder().decode(cipherText);
byte[] saltData = Arrays.copyOfRange(cipherData, 8, 16);
MessageDigest md5 = MessageDigest.getInstance("MD5");
final byte[][] keyAndIV = generateKeyAndIV(32, 16, 1, saltData, secret.getBytes(StandardCharsets.UTF_8), md5);
SecretKeySpec key = new SecretKeySpec(keyAndIV[0], "AES");
IvParameterSpec iv = new IvParameterSpec(keyAndIV[1]);
byte[] encrypted = Arrays.copyOfRange(cipherData, 16, cipherData.length);
Cipher aesCBC = Cipher.getInstance("AES/CBC/PKCS5Padding");
aesCBC.init(Cipher.DECRYPT_MODE, key, iv);
byte[] decryptedData = aesCBC.doFinal(encrypted);
String decryptedText = new String(decryptedData, StandardCharsets.UTF_8);
return decryptedText;
}
如何在 Java 中为此编写 加密函数 ?我尝试过类似的方法,但它不起作用:
public static String encrypt(String plainText) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidAlgorithmParameterException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, UnsupportedEncodingException {
MessageDigest md5 = MessageDigest.getInstance("MD5");
final byte[][] keyAndIV = generateKeyAndIV(32, 16, 1, getNextSalt(), secret.getBytes(StandardCharsets.UTF_8), md5);
SecretKeySpec skeySpec = new SecretKeySpec(keyAndIV[0], "AES");
IvParameterSpec iv = new IvParameterSpec(keyAndIV[1]);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
byte[] encrypted = cipher.doFinal(plainText.getBytes());
return Base64.getEncoder().encodeToString(encrypted);
}
public static byte[] getNextSalt() {
byte[] salt = new byte[8];
RANDOM.nextBytes(salt);
return salt;
}
encrypt
-方法必须returnOpenSSL格式的数据,由Salted__的ASCII编码组成,后跟随机生成的 8 个字节的盐和实际的密文,其中数据在连接后采用 Base64 编码。
但是请注意,用于 OpenSSL 格式的密钥派生函数是不安全的并且不是标准,here。 encrypt
方法的可能扩展可以是:
public static String encrypt(String plainText) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidAlgorithmParameterException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, UnsupportedEncodingException {
byte[] salt = getNextSalt();
MessageDigest md5 = MessageDigest.getInstance("MD5");
final byte[][] keyAndIV = generateKeyAndIV(32, 16, 1, salt, secret.getBytes(StandardCharsets.UTF_8), md5);
SecretKeySpec skeySpec = new SecretKeySpec(keyAndIV[0], "AES");
IvParameterSpec iv = new IvParameterSpec(keyAndIV[1]);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
byte[] encrypted = cipher.doFinal(plainText.getBytes());
byte[] prefix = "Salted__".getBytes(StandardCharsets.US_ASCII);
byte[] prefixSaltEncrypted = new byte[prefix.length + salt.length + encrypted.length];
System.arraycopy(prefix, 0, prefixSaltEncrypted, 0, prefix.length);
System.arraycopy(salt, 0, prefixSaltEncrypted, prefix.length, salt.length);
System.arraycopy(encrypted, 0, prefixSaltEncrypted, prefix.length + salt.length, encrypted.length);
return Base64.getEncoder().encodeToString(prefixSaltEncrypted);
}
我有从正确答案中复制的下一个代码
public static String decrypt(String cipherText) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidAlgorithmParameterException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
byte[] cipherData = Base64.getDecoder().decode(cipherText);
byte[] saltData = Arrays.copyOfRange(cipherData, 8, 16);
MessageDigest md5 = MessageDigest.getInstance("MD5");
final byte[][] keyAndIV = generateKeyAndIV(32, 16, 1, saltData, secret.getBytes(StandardCharsets.UTF_8), md5);
SecretKeySpec key = new SecretKeySpec(keyAndIV[0], "AES");
IvParameterSpec iv = new IvParameterSpec(keyAndIV[1]);
byte[] encrypted = Arrays.copyOfRange(cipherData, 16, cipherData.length);
Cipher aesCBC = Cipher.getInstance("AES/CBC/PKCS5Padding");
aesCBC.init(Cipher.DECRYPT_MODE, key, iv);
byte[] decryptedData = aesCBC.doFinal(encrypted);
String decryptedText = new String(decryptedData, StandardCharsets.UTF_8);
return decryptedText;
}
如何在 Java 中为此编写 加密函数 ?我尝试过类似的方法,但它不起作用:
public static String encrypt(String plainText) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidAlgorithmParameterException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, UnsupportedEncodingException {
MessageDigest md5 = MessageDigest.getInstance("MD5");
final byte[][] keyAndIV = generateKeyAndIV(32, 16, 1, getNextSalt(), secret.getBytes(StandardCharsets.UTF_8), md5);
SecretKeySpec skeySpec = new SecretKeySpec(keyAndIV[0], "AES");
IvParameterSpec iv = new IvParameterSpec(keyAndIV[1]);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
byte[] encrypted = cipher.doFinal(plainText.getBytes());
return Base64.getEncoder().encodeToString(encrypted);
}
public static byte[] getNextSalt() {
byte[] salt = new byte[8];
RANDOM.nextBytes(salt);
return salt;
}
encrypt
-方法必须returnOpenSSL格式的数据,由Salted__的ASCII编码组成,后跟随机生成的 8 个字节的盐和实际的密文,其中数据在连接后采用 Base64 编码。
但是请注意,用于 OpenSSL 格式的密钥派生函数是不安全的并且不是标准,here。 encrypt
方法的可能扩展可以是:
public static String encrypt(String plainText) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidAlgorithmParameterException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, UnsupportedEncodingException {
byte[] salt = getNextSalt();
MessageDigest md5 = MessageDigest.getInstance("MD5");
final byte[][] keyAndIV = generateKeyAndIV(32, 16, 1, salt, secret.getBytes(StandardCharsets.UTF_8), md5);
SecretKeySpec skeySpec = new SecretKeySpec(keyAndIV[0], "AES");
IvParameterSpec iv = new IvParameterSpec(keyAndIV[1]);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
byte[] encrypted = cipher.doFinal(plainText.getBytes());
byte[] prefix = "Salted__".getBytes(StandardCharsets.US_ASCII);
byte[] prefixSaltEncrypted = new byte[prefix.length + salt.length + encrypted.length];
System.arraycopy(prefix, 0, prefixSaltEncrypted, 0, prefix.length);
System.arraycopy(salt, 0, prefixSaltEncrypted, prefix.length, salt.length);
System.arraycopy(encrypted, 0, prefixSaltEncrypted, prefix.length + salt.length, encrypted.length);
return Base64.getEncoder().encodeToString(prefixSaltEncrypted);
}