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));
    }

}
相关推荐
朴素先生在进步8 分钟前
Memory-Based AI Responder: Principles, Skills, and Workflows
java
攒了一袋星辰32 分钟前
Spring是如何实现scope作用域支持
java·后端·spring
小黑屋说YYDS1 小时前
Spring Validation校验
java·后端·spring
丰锋ff1 小时前
操作系统学习笔记第5章 (竟成)
笔记·学习·php
悟能不能悟1 小时前
Spring Boot多数据源配置的陷阱与终极解决方案
java·数据库·spring boot
努力的搬砖人.2 小时前
Linux在防火墙中添加开放端口
java·linux·docker
源码云商2 小时前
阿博图书馆管理系统 Java+Spring Boot+MySQL 实战项目分享
java·spring boot·mysql
zhou1852 小时前
【最新】MySQL 5.6 保姆级安装详细教程
java·数据库·python·mysql·php
带刺的坐椅2 小时前
100% 自主可控,Java Solon v3.3.1 发布(国产优秀应用开发基座)
java·spring·ai·信创·solon·mcp