
时间:2022-05-01 15:01:03来源:网络整理
1. AES 原理
AES 算法是一种典型的对称加密算法。 AES的原理可以从这两个文档中了解到:
2. 抽象ECB模式比较简单c语言 aes加密算法,不需要偏移量。本文以CBC模式为例。用JS实现AES算法(基于nodejs crypto-js库,或通过导入aes.js,CBC模式,Base64编码) 用python实现AES算法(基于cryptodemo模块,CBC模式,十六进制ASCII编码和Base64编码) 处理加密结果)加密明文兼容中文,JS和python实现的AES算法结果一致3.JS实现AES算法3.1基于节点环境
npm install crypto-js
// test.js,Base64编码,`node test`执行
const CryptoJS = require("crypto-js");
var key ="0CoJUm6Qyw8W8jud";
var iv = "0102030405060708";
function encrypt(text){
    return CryptoJS.AES.encrypt(text,CryptoJS.enc.Utf8.parse(key),{
        iv:CryptoJS.enc.Utf8.parse(iv),
        mode:CryptoJS.mode.CBC,
        padding:CryptoJS.pad.Pkcs7
    })
}
function decrypt(text){
    var result = CryptoJS.AES.decrypt(text,CryptoJS.enc.Utf8.parse(key),{
        iv:CryptoJS.enc.Utf8.parse(iv),
        mode:CryptoJS.mode.CBC,
        padding:CryptoJS.pad.Pkcs7
    })
    return result.toString(CryptoJS.enc.Utf8)
}
var text="小眯嘻";
var encoded=encrypt(text)
console.log(encoded.toString());
console.log(decrypt(encoded))
3.2不需要节点环境
导入aes.js脚本直接使用
  
  www.jb51.net aes.js 
<script src="aes.js"></script>
<script>
    function encrypt(text){
        return CryptoJS.AES.encrypt(text,CryptoJS.enc.Utf8.parse(key),{
            iv:CryptoJS.enc.Utf8.parse(iv),
            mode:CryptoJS.mode.CBC,
            padding:CryptoJS.pad.Pkcs7
        })
    }
    
    function decrypt(text){
        var result = CryptoJS.AES.decrypt(text,CryptoJS.enc.Utf8.parse(key),{
            iv:CryptoJS.enc.Utf8.parse(iv),
            mode:CryptoJS.mode.CBC,
            padding:CryptoJS.pad.Pkcs7
        })
        return result.toString(CryptoJS.enc.Utf8)
    }
    
    // const CryptoJS = require("crypto-js");
    var key ="0CoJUm6Qyw8W8jud";
    var iv = "0102030405060708";
    
    var text="小眯嘻";
    var encoded=encrypt(text)
    console.log(encoded.toString());
    console.log(decrypt(encoded))
</script>
4.Python 实现 AES 算法
pip 安装 pycryptodome

pycryptodome 库是 pycrypto 库的扩展
4.16进制ASCII处理加密结果
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
# 如果text不足16位的倍数就用空格补足为16位
# 不同于JS,pycryptodome库中加密方法不做任何padding,因此需要区分明文是否为中文的情况
def add_to_16(text):
    pad = 16 - len(text.encode('utf-8')) % 16
    text = text + pad * chr(pad)
    return text.encode('utf-8')
# 加密函数
def encrypt(text, key, mode, iv):
    text = add_to_16(text)
    cryptos = AES.new(key, mode, iv)
    cipher_text = cryptos.encrypt(text)
    return b2a_hex(cipher_text).decode('utf-8')
def decrypt(text, key, mode, iv):
    cryptos = AES.new(key, mode, iv)
    text = a2b_hex(text)
    plain_text = cryptos.decrypt(text)
    # return plain_text.decode('utf-8')
    return bytes.decode(plain_text)
if __name__ == '__main__':
    key = '0CoJUm6Qyw8W8jud'.encode('utf-8')
    mode = AES.MODE_CBC
    iv = '0102030405060708'.encode('utf-8')
    text = "小眯嘻的博客123"
    e = encrypt(text, key, mode, iv)  # 加密
    print("加密后:", e)
    d = decrypt(e, key, mode, iv)  # 解密
    print("解密后:", d)
encode() 和 decode() 方法用于将字符串转换为字节。 binascii 模块包含许多将二进制表示转换为各种 ASCII 编码的方法。 b2a_hex() 和 a2b_hex() 方法用于将字节转换为十六进制 ASCII。

Python 的内置函数 bytes() 可以将字符串 str 类型转换为 bytes 类型。编码参数必须指定,不能省略。如果字符串内容都是 ASCII 字符,可以直接将字符串转换为字节对象,方法是在字符串前直接加 'b' 构造字节字符串值。同样,字节被转换为字符串。 python3中的内置函数ascii()返回一个字符串对象。如果参数中有非ascii字符,则替换为\u,\U,\x。
返回的结果
encrypt() 和 decrypt() 方法是字节类型。因为输出字节中的字节可能不对应ascii字符集c语言 aes加密算法,所以先将字节转换为十六进制ASCII保存输出结果。
4.2 Base64编码的加密结果

python中的基本用法
# 编码
>>> base64.b64encode(b'/x01') # 想象它是一张图片,编码成 base64 之后,就能进行传输
b'L3gwMQ=='
# 解码
>>> base64.b64decode(b'L3gwMQ==') # 传输成功之后,在把解码回来变成一张图片
b'/x01'
在之前的AES算法中,如果将加密结果转换成Base64位,
import base64
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
# 如果text不足16位的倍数就用空格补足为16位
# 不同于JS,pycryptodome库中加密方法不做任何padding,因此需要区分明文是否为中文的情况
def add_to_16_cn(text):
    pad = 16 - len(text.encode('utf-8')) % 16
    text = text + pad * chr(pad)
    return text.encode('utf-8')
# 加密函数
def encrypt(text, key, mode, iv):
    text = add_to_16_cn(text)
    cryptos = AES.new(key, mode, iv)
    cipher_text = cryptos.encrypt(text)
    # return b2a_hex(cipher_text).decode('utf-8')
    return base64.b64encode(cipher_text).decode('utf-8') #base编码
def decrypt(text, key, mode, iv):
    cryptos = AES.new(key, mode, iv)
    # text = a2b_hex(text)
    text = base64.b64decode(text) #base64解码
    plain_text = cryptos.decrypt(text)
    return plain_text.decode('utf-8')
if __name__ == '__main__':
    key = '0CoJUm6Qyw8W8jud'.encode('utf-8')
    mode = AES.MODE_CBC
    iv = '0102030405060708'.encode('utf-8')
    text = "小眯嘻的博客123"
    e = encrypt(text, key, mode, iv)  # 加密
    print("加密后:", e)
    d = decrypt(e, key, mode, iv)  # 解密
    print("解密后:", d)

5.结果验证
验证js和python实现的AES算法结果一致,兼容中文。
AES_JS.png
AES_python.png
声明:文章仅代表原作者观点,不代表本站立场;如有侵权、违规,可直接反馈本站,我们将会作修改或删除处理。
图文推荐
 
				2022-05-01 14:58:00
 
				2022-05-01 14:01:33
 
				2022-05-01 14:01:21
 
				2022-05-01 13:58:04
 
				2022-05-01 13:01:32
 
				2022-05-01 12:58:02
热点排行
精彩文章
 
				2022-05-01 14:58:02
 
				2022-05-01 13:58:07
 
				2022-05-01 13:01:14
 
				2022-05-01 12:58:04
 
				2022-05-01 12:01:15
 
				2022-05-01 11:58:05
热门推荐
