PHP、Python、JavaScript实现AES加密解密

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: PHP、Python、JavaScript实现AES加密解密

先说需求:

需要后端和前端通信需要将数据加密后传输


前端 <-> 加密数据 <-> 后端

总的来说PHP的使用时最简单的,坑最少,当之无愧世界上最好的语言


以下是代码实现

以下代码实现统一使用参数


AES加密算法
32位秘钥key (通过给定秘钥取md5值获得) 123456
16位初始向量iv 秘钥key的md5值前16位
加密数据 "123456789"

1、PHP实现AES加密解密

使用函数 openssl_encrypt 和 openssl_decrypt


<?php
class AESCipher
{
    private $method;
    private $key;
    private $iv;
    /**
     * AESCipher constructor.
     * @param string $method
     * @param string $key 采用32位长度,正好是一个md5值
     * @param string $iv CBC模式,需要16位长度
     */
    public function __construct($method, $key, $iv = "")
    {
        $this->key = $key;
        $this->method = $method;
        $this->iv = $iv;
    }
    // 加密数据
    public function encrypt($plain_text)
    {
        return openssl_encrypt($plain_text, $this->method, $this->key, 0, $this->iv);
    }
    // 解密数据
    public function decrypt($cipher_text)
    {
        return openssl_decrypt($cipher_text, $this->method, $this->key, 0, $this->iv);
    }
}
/**
 * 以下是测试代码
 */
// ECB 模式
function test_ecb($key, $data)
{
    $aes = new AESCipher("AES-256-ECB", $key);
    $cipher_text = $aes->encrypt($data);
    echo $cipher_text . PHP_EOL;
    // 7J0VfbEYF0XdLnLuA1b4Fw==
    $plain_text = $aes->decrypt($cipher_text);
    echo $plain_text . PHP_EOL;
    // 123456789
}
// CBC 模式
function test_cbc($key, $data, $iv)
{
    $aes = new AESCipher("AES-256-CBC", $key, $iv);
    $cipher_text = $aes->encrypt($data);
    echo $cipher_text . PHP_EOL;
    // sfH6iGxc01TkIaOUN77hQQ==
    $plain_text = $aes->decrypt($cipher_text);
    echo $plain_text . PHP_EOL;
    // 123456789
}
$key = "123456";
$md5_key = md5($key);
$iv = substr($md5_key, 0, 16);
$data = "123456789";
test_ecb($md5_key, $data);
test_cbc($md5_key, $data, $iv);

参考

https://www.php.net/manual/zh/function.openssl-encrypt.php


2、Python3实现AES加密解密

安装模块


pip3 install md5util
pip3 install pycryptodome
import base64
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
from md5util import md5
class AESCipher(object):
    def __init__(self, key, mode, **kwargs):
        """
        :param key:
            16 (AES-128)
            24 (AES-192)
            32 (AES-256)
        :param mode: 模式
        :param kwargs:
            iv 初始向量 MODE_CBC 模式使用 必须是16字节
        """
        self.key = key
        self.mode = mode
        self.kwargs = kwargs
    def _get_aes(self):
        """TypeError: decrypt() cannot be called after encrypt()"""
        return AES.new(self.key.encode('utf-8'), self.mode, **self.kwargs)
    def encrypt(self, plain_text):
        # 选择pkcs7补全
        pad_pkcs7 = pad(plain_text.encode('utf-8'), AES.block_size)
        encrypt_data = self._get_aes().encrypt(pad_pkcs7)
        return str(base64.b64encode(encrypt_data), encoding='utf-8')
    def decrypt(self, cipher_text):
        padded_data = self._get_aes().decrypt(base64.b64decode(cipher_text.encode('utf-8')))
        return str(unpad(padded_data, AES.block_size), encoding='utf-8')
def main():
    key = "123456"
    md5_key = md5(key)
    aes_str = "123456789"
  # ECB 模式
    ecb_cipher = AESCipher(md5_key, mode=AES.MODE_ECB)
    cipher_text = ecb_cipher.encrypt(aes_str)
    print(cipher_text)
    # 7J0VfbEYF0XdLnLuA1b4Fw==
    print(ecb_cipher.decrypt(cipher_text))
  # CBC 模式
    cbc_cipher = AESCipher(md5_key, mode=AES.MODE_CBC, IV=md5_key[0:16].encode())
    cipher_text = cbc_cipher.encrypt(aes_str)
    print(cipher_text)
    # sfH6iGxc01TkIaOUN77hQQ==
    print(cbc_cipher.decrypt(cipher_text))
if __name__ == '__main__':
    main()

参考

https://www.dlitz.net/software/pycrypto/api/current/

使用Python实现AES(256)加密,ECB模式,pkcs7补全(AES五种加密模式(CBC、ECB、CTR、OCF、CFB))


3、JavaScript实现AES加密解密

安装


npm install crypto-js

crypto-js使用的时候有点坑,不像别的语言实现,它会将你传入的key转为它需要的对象,所以要先调用下parse函数


var CryptoJS = require("crypto-js");
// 辅助函数
function md5(data) {
    return CryptoJS.MD5(data).toString();
}
// 传入key之前要调用,不然结果不对
function parseKey(key) {
    return CryptoJS.enc.Utf8.parse(key);
}
// 加密过程
function encrypt(mode, plainText, key, iv = null) {
    const uKey = parseKey(key);
    const uIv = parseKey(iv);
    return CryptoJS.AES.encrypt(plainText, uKey,
        {
            iv: uIv,
            mode: mode,
            padding: CryptoJS.pad.Pkcs7
        }
    ).toString();
}
// 解密过程
function decrypt(mode, cipherText, key, iv = null) {
    const uKey = parseKey(key);
    const uIv = parseKey(iv);
    let bytes = CryptoJS.AES.decrypt(cipherText, uKey,
        {
            iv: uIv,
            mode: mode,
            padding: CryptoJS.pad.Pkcs7
        }
    );
    return bytes.toString(CryptoJS.enc.Utf8);
}
function test() {
    const key = '123456';
    const md5Key = md5(key);
    const iv = md5Key.substr(0, 16);
    const data = '123456789';
    // ECB 模式
    let cipherText = encrypt(CryptoJS.mode.ECB, data, md5Key);
    console.log(cipherText);
    // 7J0VfbEYF0XdLnLuA1b4Fw==
    let plainText = decrypt(CryptoJS.mode.ECB, cipherText, md5Key);
    console.log(plainText);
    // CBC 模式
    cipherText = encrypt(CryptoJS.mode.CBC, data, md5Key, iv);
    console.log(cipherText);
    // sfH6iGxc01TkIaOUN77hQQ==
    plainText = decrypt(CryptoJS.mode.CBC, cipherText, md5Key, iv);
    console.log(plainText);
}
test();
相关文章
|
2月前
|
存储 安全 数据安全/隐私保护
打造安全防线!Python AES&RSA加密工具,黑客绕道走的秘籍
【9月更文挑战第9天】随着数字化时代的到来,信息安全问题日益凸显。本文将介绍如何使用Python结合AES与RSA两种加密算法,构建强大的加密工具。AES以其高效性和强安全性著称,适用于大量数据的快速加密;RSA作为非对称加密算法,在加密小量数据及实现数字签名方面表现卓越。通过整合两者,可以构建既安全又灵活的加密系统。首先,需要安装pycryptodome库。接着,实现AES加密与解密功能,最后利用RSA加密AES密钥,确保其安全传输。这种设计不仅提高了数据传输效率,还增强了密钥交换的安全性,为敏感数据提供坚实保护。
205 43
|
16天前
|
JavaScript Java PHP
快速对比:Django、Spring Boot、Node.js 和 PHP
快速对比:Django、Spring Boot、Node.js 和 PHP
46 7
|
28天前
|
数据采集 JavaScript 前端开发
如何使用Python爬虫处理JavaScript动态加载的内容?
如何使用Python爬虫处理JavaScript动态加载的内容?
|
28天前
|
安全 测试技术 Go
Python 和 Go 实现 AES 加密算法的技术详解
Python 和 Go 实现 AES 加密算法的技术详解
59 0
|
2月前
|
存储 安全 数据安全/隐私保护
安全升级!Python AES加密实战,为你的代码加上一层神秘保护罩
【9月更文挑战第12天】在软件开发中,数据安全至关重要。本文将深入探讨如何使用Python中的AES加密技术保护代码免受非法访问和篡改。AES(高级加密标准)因其高效性和灵活性,已成为全球最广泛使用的对称加密算法之一。通过实战演练,我们将展示如何利用pycryptodome库实现AES加密,包括生成密钥、初始化向量(IV)、加密和解密文本数据等步骤。此外,还将介绍密钥管理和IV随机性等安全注意事项。通过本文的学习,你将掌握使用AES加密保护敏感数据的方法,为代码增添坚实的安全屏障。
122 8
|
2月前
|
安全 算法 数据安全/隐私保护
深度揭秘!Python加密技术的背后,AES与RSA如何守护你的数据安全
【9月更文挑战第10天】随着数字化时代的到来,数据安全成为企业和个人面临的重大挑战。Python 作为功能强大的编程语言,在数据加密领域扮演着重要角色。AES 和 RSA 是两种主流加密算法,分别以对称和非对称加密方式保障数据安全。AES(Advanced Encryption Standard)因其高效性和安全性,在数据加密中广泛应用;而 RSA 则利用公钥和私钥机制,在密钥交换和数字签名方面表现卓越。
76 3
|
2月前
|
存储 安全 数据库
双重防护,无懈可击!Python AES+RSA加密方案,构建最强数据安全堡垒
【9月更文挑战第11天】在数字时代,数据安全至关重要。AES与RSA加密技术相结合,构成了一道坚固防线。AES以其高效性保障数据加密,而RSA则确保密钥安全传输,二者相辅相成,提供双重保护。本文通过Python代码示例展示了这一加密方案的魅力,强调了其在实际应用中的重要性和安全性。使用HTTPS等安全协议传输加密密钥和密文,确保数据在数字世界中自由流通而无忧。
59 1
|
2月前
|
安全 数据安全/隐私保护 Python
情书也能加密?Python AES&RSA,让每一份数据都充满爱的密码
【9月更文挑战第8天】在这个数字化时代,情书不再局限于纸笔,也可能以电子形式在网络中传递。为了确保其安全,Python提供了AES和RSA等加密工具,为情书编织爱的密码。首先,通过安装pycryptodome库,我们可以利用AES对称加密算法高效保护数据;接着,使用RSA非对称加密算法加密AES密钥和IV,进一步增强安全性。即使情书被截获,没有正确密钥也无法解读内容。让我们用Python为爱情编织一张安全的网,守护每份珍贵情感。
45 2
|
3月前
|
机器学习/深度学习 PHP 开发者
探索PHP中的面向对象编程构建你的首个机器学习模型:以Python和scikit-learn为例
【8月更文挑战第30天】在PHP的世界中,面向对象编程(OOP)是一块基石,它让代码更加模块化、易于管理和维护。本文将深入探讨PHP中面向对象的魔法,从类和对象的定义开始,到继承、多态性、封装等核心概念,再到实战中如何应用这些理念来构建更健壮的应用。我们将通过示例代码,一起见证PHP中OOP的魔力,并理解其背后的设计哲学。
|
3月前
|
Web App开发 JavaScript 前端开发
使用Python调用JavaScript进行网页自动化操作
使用Python调用JavaScript进行网页自动化操作