1.问题
php加密的java不能正常机密,java加密的php不能正常解密
2.前置参数
key 32位
iv 16位
3.问题解决
因为key是32位的,所以参数需要$method=AES-256-CBC,$options=1
4.PHP代码
<?php
/**** Created by PhpStorm* User: Noah* Date: 2023/10/10* Time: 16:35*/namespace app\Service;use support\Log;class Aes
{/*** var string $method 加解密方法,可通过openssl_get_cipher_methods()获得*/protected $method;/*** var string $secret_key 加解密的密钥*/protected $secret_key;/*** var string $iv 加解密的向量,有些方法需要设置比如CBC*/protected $iv;/*** var string $options (不知道怎么解释,目前设置为0没什么问题)*/protected $options;/*** 构造函数** @param string $key 密钥* @param string $method 加密方式* @param string $iv iv向量* @param mixed $options 还不是很清楚**/public function __construct($key, $iv = '', $method = 'AES-256-CBC', $options = 1){// key是必须要设置的$this->secret_key = isset($key) ? $key : 'morefun';$this->method = $method;$this->iv = $iv;$this->options = $options;}/*** 加密方法,对数据进行加密,返回加密后的数据** @param string $data 要加密的数据** @return string**/public function encrypt($data){$result = openssl_encrypt($data, $this->method, $this->secret_key, $this->options, $this->iv);$result = base64_encode($result);return $result;}/*** 解密方法,对数据进行解密,返回解密后的数据** @param string $data 要解密的数据** @return string**/public function decrypt($data){return openssl_decrypt(base64_decode($data), $this->method, $this->secret_key, $this->options, $this->iv);}
}
5.java代码
package com.xxx.cn.utils;import org.apache.commons.codec.binary.Base64;import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;public class Test {public static String encrypt(String secretKey, String iv, String strToEncrypt) {if (strToEncrypt == null || strToEncrypt.isEmpty()) {return strToEncrypt;}try {Cipher cipher = getCipher(secretKey, iv, Cipher.ENCRYPT_MODE);returnBase64.encodeBase64String(cipher.doFinal(strToEncrypt.getBytes(StandardCharsets.UTF_8)));} catch (Exception exp) {exp.printStackTrace();return "";}}private static Cipher getCipher(String secretKey, String iv, int cipherMode)throws Exception {IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes(StandardCharsets.UTF_8));SecretKeySpec secretKeySpec = newSecretKeySpec(secretKey.getBytes(StandardCharsets.UTF_8), "AES");Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");cipher.init(cipherMode, secretKeySpec, ivSpec);return cipher;}public static void main(String[] args) {String s = "xxxx";System.out.println(encrypt("95D03jGYjs1wTpg0PfKWgyvL2WfLXQ1y", "GETwRqKWgqtRO8Ew", s));}}