PHP和JAVA AES加解密问题

1.问题

php加密的java不能正常机密,java加密的php不能正常解密

2.前置参数

key 32位

iv 16位

3.问题解决

因为key是32位的,所以参数需要method=AES-256-CBC,options=1

4.PHP代码

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代码

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);
            return
                    Base64.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 = new
                SecretKeySpec(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));
    }

}
相关推荐
南山十一少2 小时前
Spring Security+JWT+Redis实现项目级前后端分离认证授权
java·spring·bootstrap
427724003 小时前
IDEA使用git不提示账号密码登录,而是输入token问题解决
java·git·intellij-idea
chengooooooo4 小时前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
李长渊哦4 小时前
常用的 JVM 参数:配置与优化指南
java·jvm
计算机小白一个4 小时前
蓝桥杯 Java B 组之设计 LRU 缓存
java·算法·蓝桥杯
南宫生7 小时前
力扣每日一题【算法学习day.132】
java·学习·算法·leetcode
计算机毕设定制辅导-无忧学长7 小时前
Maven 基础环境搭建与配置(一)
java·maven
风与沙的较量丶8 小时前
Java中的局部变量和成员变量在内存中的位置
java·开发语言
m0_748251728 小时前
SpringBoot3 升级介绍
java
极客先躯9 小时前
说说高级java每日一道面试题-2025年2月13日-数据库篇-请说说 MySQL 数据库的锁 ?
java·数据库·mysql·数据库的锁·模式分·粒度分·属性分