时间: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
热门推荐