最新新闻:

1.AES原理算法算法的应用方法介绍及应用

时间: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

c aes加密_c语言 aes加密算法_c语言aes解密算法

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。

c语言aes解密算法_c语言 aes加密算法_c aes加密

Python 的内置函数 bytes() 可以将字符串 str 类型转换为 bytes 类型。编码参数必须指定,不能省略。如果字符串内容都是 ASCII 字符,可以直接将字符串转换为字节对象,方法是在字符串前直接加 'b' 构造字节字符串值。同样,字节被转换为字符串。 python3中的内置函数ascii()返回一个字符串对象。如果参数中有非ascii字符,则替换为\u,\U,\x。

返回的结果

encrypt() 和 decrypt() 方法是字节类型。因为输出字节中的字节可能不对应ascii字符集c语言 aes加密算法,所以先将字节转换为十六进制ASCII保存输出结果。

4.2 Base64编码的加密结果

c aes加密_c语言 aes加密算法_c语言aes解密算法

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)

c aes加密_c语言 aes加密算法_c语言aes解密算法

5.结果验证

验证js和python实现的AES算法结果一致,兼容中文。

AES_JS.png

AES_python.png

声明:文章仅代表原作者观点,不代表本站立场;如有侵权、违规,可直接反馈本站,我们将会作修改或删除处理。

图文推荐

热点排行

精彩文章

热门推荐