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

}
相关推荐
ytadpole1 天前
揭秘设计模式:命令模式-告别混乱,打造优雅可扩展的代码
java·设计模式
用户3721574261351 天前
Java 教程:轻松实现 Excel 与 CSV 互转 (含批量转换)
java
叫我阿柒啊1 天前
Java全栈开发实战:从基础到微服务的深度解析
java·微服务·kafka·vue3·springboot·jwt·前端开发
凯尔萨厮1 天前
Java学习笔记三(封装)
java·笔记·学习
霸道流氓气质1 天前
Java开发中常用CollectionUtils方式,以及Spring中CollectionUtils常用方法示例
java·spring
失散131 天前
分布式专题——5 大厂Redis高并发缓存架构实战与性能优化
java·redis·分布式·缓存·架构
通达的K1 天前
Java实战项目演示代码及流的使用
java·开发语言·windows
David爱编程1 天前
深入 Java synchronized 底层:字节码解析与 MonitorEnter 原理全揭秘
java·后端
索迪迈科技1 天前
Protobuf 新版“调试表示为什么有链接?为什么会打码?我该怎么改代码?
java·log4j·apache
a_blue_ice1 天前
JAVA 面试 MySQL
java·mysql·面试