如何使用 java 实现 Laravel中encrypt和decrypt,之前系统用的PHP,现在想换成java,希望能贴出有效代码

如何使用 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()方法。