如何使用 java 实现 Laravel中encrypt和decrypt,之前系统用的PHP,现在想换成java,希望能贴出有效代码谢谢
'cipher' => 'AES-256-CBC',
密文:eyJpdiI6ImdtbmJZZlwvZW81UEFvbm9aWE5RYU13PT0iLCJ2YWx1ZSI6IjZqS2xQQzBQYjdoRUlhRDVmemNuUHNTaFUxd0M1VHI1Ylg3MVcrUndWZDQ9IiwibWFjIjoiY2NjZmQ2MGFkYjAyMGU4MTQxYTlmZWY1ZjYyZjFmODI2ZmY1MDdlNTFkNWJmOWQ4OTAzNTAxNmUzNTg4ZjBjZSJ9
APP_KEY=base64:+90gHlNsoj6J0G9OepRfOkW/9IJHiK+bGS1Lt+wzn+M=
该回答引用ChatGPT
有疑问可以回复我
Java 中实现 Laravel 中的加密和解密功能,您可以使用 Java Cryptography Extension (JCE) 提供的 API。下面是一个示例代码:
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class LaravelEncryption {
private static final String CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding";
private static final String SECRET_KEY_ALGORITHM = "AES";
private static final String KEY = "base64:+90gHlNsoj6J0G9OepRfOkW/9IJHiK+bGS1Lt+wzn+M=";
private static final String IV = "0000000000000000";
public static String encrypt(String plainText) throws Exception {
byte[] keyBytes = Base64.getDecoder().decode(KEY.split(":")[1]);
SecretKeySpec secretKey = new SecretKeySpec(keyBytes, SECRET_KEY_ALGORITHM);
IvParameterSpec iv = new IvParameterSpec(IV.getBytes());
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
return Base64.getEncoder().encodeToString(encryptedBytes);
}
public static String decrypt(String cipherText) throws Exception {
byte[] keyBytes = Base64.getDecoder().decode(KEY.split(":")[1]);
SecretKeySpec secretKey = new SecretKeySpec(keyBytes, SECRET_KEY_ALGORITHM);
IvParameterSpec iv = new IvParameterSpec(IV.getBytes());
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
byte[] cipherBytes = Base64.getDecoder().decode(cipherText);
byte[] decryptedBytes = cipher.doFinal(cipherBytes);
return new String(decryptedBytes);
}
public static void main(String[] args) {
String plainText = "hello, world!";
try {
String cipherText = encrypt(plainText);
System.out.println("Cipher text: " + cipherText);
String decryptedText = decrypt(cipherText);
System.out.println("Decrypted text: " + decryptedText);
} catch (Exception e) {
e.printStackTrace();
}
}
}
在Java中实现Laravel的encrypt和decrypt可以使用javax.crypto包中的类来进行AES加密和解密。以下是我写的Java实现示例:
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
public class LaravelEncryption {
private static final String CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding";
private static final String CHARSET = "UTF-8";
public static String encrypt(String value, String key, String iv) throws Exception {
SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), "AES");
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes());
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParameterSpec);
byte[] encrypted = cipher.doFinal(value.getBytes(StandardCharsets.UTF_8));
return Base64.getEncoder().encodeToString(encrypted);
}
public static String decrypt(String encryptedValue, String key, String iv) throws Exception {
SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), "AES");
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes());
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec);
byte[] decodedValue = Base64.getDecoder().decode(encryptedValue);
byte[] decrypted = cipher.doFinal(decodedValue);
return new String(decrypted, StandardCharsets.UTF_8);
}
public static void main(String[] args) throws Exception {
String key = "base64:+90gHlNsoj6J0G9OepRfOkW/9IJHiK+bGS1Lt+wzn+M=";
String iv = "gmnBY\\eo5PAonNZXNaMw==";
String value = "hello world";
String encrypted = encrypt(value, key, iv);
String decrypted = decrypt(encrypted, key, iv);
System.out.println("Encrypted: " + encrypted);
System.out.println("Decrypted: " + decrypted);
}
}
需要注意的是,Laravel在加密时使用了base64编码的key和iv,因此需要先对其进行解码才能使用。同时,在Java中需要将iv的字符串反斜杠进行转义,以便正确解析。
该回答引用ChatGPT 和 个人抒写
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
public class Encryptor {
public static String encrypt(String raw, String keyStr) throws Exception {
// Decode key string to get secret key
byte[] key = Base64.getDecoder().decode(keyStr);
SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
// Get Cipher instance
Cipher cipher = Cipher.getInstance("AES-256-CBC");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
// Encrypt and encode bytes
byte[] encodedBytes = cipher.doFinal(raw.getBytes());
byte[] base64Bytes = Base64.getEncoder().encode(encodedBytes);
// Return encrypted string
return new String(base64Bytes);
}
public static String decrypt(String cipherText, String keyStr) throws Exception {
// Decode the base64 encoded string and get secret key
byte[] key = Base64.getDecoder().decode(keyStr);
SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
// Get Cipher instance
Cipher cipher = Cipher.getInstance("AES-256-CBC");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
// Decode the base64 encoded string
byte[] base64Bytes = Base64.getDecoder().decode(cipherText);
// Decrypt and return bytes
byte[] decryptedBytes = cipher.doFinal(base64Bytes);
return new String(decryptedBytes);
}
public static void main(String[] args) throws Exception {
// Sample Input
String raw = "Hello, World!";
String key = "base64: 90gHlNsoj6J0G9OepRfOkW/9IJHiKbGS1Lt wznM=";
// Sample Output
String encrypted = encrypt(raw, key);
System.out.println("Encrypted Text = " + encrypted);
String decrypted = decrypt(encrypted, key);
System.out.println("Decrypted Text = " + decrypted);
}
}
以下答案基于ChatGPT与GISer Liu编写:
在Java中使用Laravel中的AES-256-CBC加密算法可以使用javax.crypto包中的Cipher类。以下是一个Java方法,可以使用Laravel中的APP_KEY来加密和解密数据:
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class LaravelEncryptor {
private static final String ENCRYPTION_ALGORITHM = "AES/CBC/PKCS5Padding";
private static final String ENCODING = "UTF-8";
private static final String IV = "0000000000000000";
public static String encrypt(String data, String key) throws Exception {
byte[] encrypted = null;
byte[] iv = IV.getBytes(ENCODING);
SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(ENCODING), "AES");
IvParameterSpec ivspec = new IvParameterSpec(iv);
Cipher cipher = Cipher.getInstance(ENCRYPTION_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivspec);
encrypted = cipher.doFinal(data.getBytes(ENCODING));
return new String(Base64.getEncoder().encode(encrypted));
}
public static String decrypt(String data, String key) throws Exception {
byte[] decrypted = null;
byte[] iv = IV.getBytes(ENCODING);
SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(ENCODING), "AES");
IvParameterSpec ivspec = new IvParameterSpec(iv);
Cipher cipher = Cipher.getInstance(ENCRYPTION_ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivspec);
decrypted = cipher.doFinal(Base64.getDecoder().decode(data.getBytes(ENCODING)));
return new String(decrypted, ENCODING);
}
}
在这个示例中,encrypt()和decrypt()方法采用字符串数据和APP_KEY作为输入参数,并使用AES-256-CBC加密算法进行加密和解密。在加密和解密过程中,使用了与Laravel中相同的IV值“0000000000000000”。在调用这些方法时,请确保输入参数的编码与'ENCODENCODING常量一致。
要使用此代码,您可以使用以下方式调用该代码:
String appKey = "+90gHlNsoj6J0G9OepRfOkW/9IJHiK+bGS1Lt+wzn+M=";
String plaintext = "密码";
String encrypted = LaravelEncryptor.encrypt(plaintext, appKey);
String decrypted = LaravelEncryptor.decrypt(encrypted, appKey);
System.out.println("Encrypted: " + encrypted);
System.out.println("Decrypted: " + decrypted);
请注意,此代码中使用的'APP_KEYencrypt()和decrypt()方法。