php,python aes加密反解

1. python版本

python 复制代码
import base64
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad

class AESUtilCBC:
    def __init__(self, key, iv):
        self.key = key.encode('utf-8')
        self.iv = iv.encode('utf-8')
        self.pad_length = AES.block_size

    def encrypt(self, data):
        try:
            data = data.encode('utf-8')
            cipher = AES.new(self.key, AES.MODE_CBC, self.iv)
            padded_data = pad(data, self.pad_length, style='pkcs7')
            encrypted_data = cipher.encrypt(padded_data)
            encoded_data = base64.b64encode(encrypted_data).decode('utf-8')
            return encoded_data
        except Exception as e:
            raise Exception(f"Encryption failed: {str(e)}")

    def decrypt(self, encrypted_data):
        try:
            encrypted_bytes = base64.b64decode(encrypted_data)
            cipher = AES.new(self.key, AES.MODE_CBC, self.iv)
            decrypted_data = cipher.decrypt(encrypted_bytes)
            unpadded_data = unpad(decrypted_data, self.pad_length, style='pkcs7')
            return unpadded_data.decode('utf-8')
        except Exception as e:
            raise Exception(f"Decryption failed: {str(e)}")

# 示例使用 AESUtilCBC 类进行加密和解密
# 定义密钥和初始向量(IV)
key = 'Nhic0EAJqsIdMBfs'  # 16字节的密钥
iv = 'Nhic0EAJqsIdMBfs'   # 16字节的初始向量

# 创建 AESUtilCBC 类的实例
aes_util = AESUtilCBC(key, iv)

# 要加密的数据
data = '123456'

# 调用加密方法
encrypted_data = aes_util.encrypt(data)
print(f"加密后的数据: {encrypted_data}")

# 调用解密方法
decrypted_data = aes_util.decrypt(encrypted_data)
print(f"解密后的数据: {decrypted_data}")

执行以后是

加密后的数据: Qun8LbhlewyVvRQDzrNCIQ==

解密后的数据: 123456

2. php代码

php 复制代码
<?php

use Exception;

class AESUtilCBC
{
    private $key = 'Nhic0EAJqsIdMBfs';
    private $iv = 'Nhic0EAJqsIdMBfs';
    private $algo = 'AES-128-CBC';
    private $options = OPENSSL_RAW_DATA;

    public function __construct($key = null, $iv = null, $algo = null, $options = null)
    {
        if ($key) {
            $this->key = $key;
        }
        if ($iv) {
            $this->iv = $iv;
        }
        if ($algo) {
            $this->algo = $algo;
        }
        if ($options) {
            $this->options = $options;
        }
    }

    /**
     * 加密
     *
     * @param $data
     * @return false|string
     */
    public function encrypt($data)
    {
        try {
            $encryptedData = openssl_encrypt($data, $this->algo, $this->key, $this->options, $this->iv);
            return base64_encode($encryptedData);
        } catch (Exception $e) {
            return false;
        }
    }

    /**
     * 解密
     *
     * @param $encryptedData
     * @return false|string
     */
    public function decrypt($encryptedData)
    {
        try {
            $decodedData = base64_decode($encryptedData);
            return openssl_decrypt($decodedData, $this->algo, $this->key, $this->options, $this->iv);
        } catch (Exception $e) {
            return false;
        }
    }
}

$encrypted_data = (new AESUtilCBC())->encrypt('123456');
print("加密后的数据: {$encrypted_data}<br>");

$decrypted_data = (new AESUtilCBC())->decrypt($encrypted_data);
print("解密后的数据: {$decrypted_data}");

执行以后是

加密后的数据: Qun8LbhlewyVvRQDzrNCIQ==

解密后的数据: 123456

3. 其他

1. 在线测试
复制代码
可以在一些在线网站来进行测试是否加密一致
例如  https://www.ssleye.com/ssltool/aes_cipher.html
2. 128 256 php和python如何修改
复制代码
php: $algo可以设置为 AES-128-CBC,AES-256-CBC
python:根据 key 的长度而变化,16位为128, 32位为256
3. iv长度
复制代码
iv长度必须为16位,key和iv允许一致
4. 加密不一致
复制代码
如果key的长度不足16或者32位,在php或python代码中进行补全空位,如果补全长度的字符不一致,则会导致加密的不一致
5. php 修改模式
复制代码
修改 AES-128-CBC 的 CBC 为 ECB 等
相关推荐
学习路上_write2 分钟前
FREERTOS_互斥量_创建和使用
c语言·开发语言·c++·stm32·单片机·嵌入式硬件
一起养小猫2 分钟前
《Java数据结构与算法》第三篇(下)队列全解析:从基础概念到高级应用
java·开发语言·数据结构
vx_vxbs669 分钟前
【SSM电动车智能充电服务平台】(免费领源码+演示录像)|可做计算机毕设Java、Python、PHP、小程序APP、C#、爬虫大数据、单片机、文案
java·spring boot·mysql·spring cloud·小程序·php·idea
pale_moonlight23 分钟前
十、 Scala 应用实践 (上)
大数据·开发语言·scala
6***v41740 分钟前
搭建Golang gRPC环境:protoc、protoc-gen-go 和 protoc-gen-go-grpc 工具安装教程
开发语言·后端·golang
1***s63241 分钟前
Rust在WebAssembly中的应用实践
开发语言·rust·wasm
水痕0142 分钟前
go使用cobra来启动项目
开发语言·后端·golang
银河邮差1 小时前
python实战-用海外代理IP抓LinkedIn热门岗位数据
后端·python
j***57681 小时前
电脑可以连接wifi,但是连接后仍然显示没有网络
网络·电脑·php
scixing1 小时前
函数式编程 第八讲 循环者,递归也
开发语言·c#