要用 AES 算法加密,首先我们要引入 crypto-js ,crypto-js 是一个纯 javascript 写的加密算法类库 ,可以非常方便地在 javascript 进行 MD5、SHA1、SHA2、SHA3、RIPEMD-160 哈希散列,进行 AES、DES、Rabbit、RC4、Triple DES 加解密,我们可以采用 npm install crypto-js --save 进行下载安装,也可以直接去 GitHub下载源码~
const CryptoJS = require['crypto-js']; //引用AES源码js
const key = CryptoJS.enc.Utf8.parse["1234123412ABCDEF"]; //十六位十六进制数作为密钥
const iv = CryptoJS.enc.Utf8.parse['ABCDEF1234123412']; //十六位十六进制数作为密钥偏移量
//解密方法
function Decrypt[word] {
let encryptedHexStr = CryptoJS.enc.Hex.parse[word];
let srcs = CryptoJS.enc.Base64.stringify[encryptedHexStr];
let decrypt = CryptoJS.AES.decrypt[srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }];
let decryptedStr = decrypt.toString[CryptoJS.enc.Utf8];
return decryptedStr.toString[];
}
//加密方法
function Encrypt[word] {
let srcs = CryptoJS.enc.Utf8.parse[word];
let encrypted = CryptoJS.AES.encrypt[srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }];
return encrypted.ciphertext.toString[].toUpperCase[];
}
export default {
Decrypt ,
Encrypt
}
上面的代码中的 key 是密钥 ,iv 是密钥偏移量,这个一般是接口返回的,为了方便,我们这里就直接在这里定义了。
值得注意的是密钥的长度,由于对称解密使用的算法是 AES-128-CBC算法,数据采用 PKCS#7 填充 , 因此这里的 key 需要为16位!
接着我们定义了 解密方法Decrypt 和 加密方法 Encrypt ,最后通过 export default 将其暴露出去,方便在需要的时候进行引入~
—————————————————————————————————————————————
转载链接:https. //www. jianshu. com/p/a47477e8126a
—————————————————————————————————————————————
crypto-js实现前端《AES/DES》加密,python进行对应的后端解密
一. AES加密解密
1. AES-128-CBC
Zero:数据长度不足时填充0,如果数据长度刚好合适就不填充
PKCS5:填充8字节长度的ASCII码编号为8的字符
PKCS7:[1] 数据如果长度刚好合适,就填充数据长度的字节,填充数据为ASCII码编号为数据长度的字符
(2)数据长度如果没对齐,则差n长度,就补充n长度的ASCII码编号为n的字符
分析
1. 前端参数
2. 前端逻辑分析
- key密钥采用随机数生成16位字符,然后通过Crypto. enc. UTF8. parse解析成需要的key
- iv偏移量采用key进行MD5加密后取前16个字符作为偏移量
- AES加密后的数据最后再base64加密后显现的
- 数据传输时加密把key和加密后的数据传到后端
3. 后端参数
4. 后端逻辑分析
- 拿到随机的key字符串,然后转化为MD5,取前面16个字符作为偏移量iv
- 将前端传来的加密数据先base64解密为需要AES解密的数据
- AES解密,key,iv都时字符串
- 不同的数据填充方式,获取的最后解密的数据是不同的,需要根据不同的数据填充方式转化为最终我们需要的前端原始未加密的字符串
js前端实现加密
// n位随机数生成
function randomNum[n] {
let sString = "";
let strings = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
for [i = 0; i 32]] # 此处报错,在我环境
else:
return "不存在此种数据填充方式"
二、 DES加密解密
1. DES-128-CBC模式
分析
1)前端参数
- key秘钥采用随机数生成8为字符,然后通过Crypto. enc. UTF8. parse解析成需要的key
- iv偏移量采用key进行base64加密后取前8个字符作为偏移量
- DES加密后的数据最后再base64加密后显现的
- 数据传输时加密把key和加密后的数据传到后端
3)后端参数
4. 后端逻辑分析
- 拿到随机的key字符串,然后转化为base64,取前面8个字符作为偏移量iv
- 将前端传来的加密数据先base64解密为需要DES解密的数据
- DES解密,key,iv都时字符串
- 不同的数据填充方式,获取的最后解密的数据是不同的,需要根据不同的数据填充方式转化为最终我们需要的前端原始未加密的字符串
js前端实现加密
// n位随机数生成
function randomNum[n] {
let sString = "";
let strings = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
for [i = 0; i 32]]
else:
return "不存在此种数据填充方式"
—————————————————————————————————————————————
原文链接:https. //Blog. csdn. net/hl120841/bài viết/chi tiết/105278277
CryptoJS aes加密,需key 和偏移量 iv
function getAesString[data,key,iv]{//加密
var key = CryptoJS.enc.Latin1.parse[key];
var iv = CryptoJS.enc.Latin1.parse[iv];
var srcs = CryptoJS.enc.Utf8.parse[data];
var encrypted = CryptoJS.AES.encrypt[srcs,key,
{
iv:iv,
mode:CryptoJS.mode.CBC,
padding:CryptoJS.pad.Pkcs7
}];
return encrypted;
}
function getDAesString[encrypted,key,iv]{//解密
var key = CryptoJS.enc.Latin1.parse[key];
var iv = CryptoJS.enc.Latin1.parse[iv];
var decrypted = CryptoJS.AES.decrypt[encrypted,key,
{
iv:iv,
mode:CryptoJS.mode.CBC,
padding:CryptoJS.pad.Pkcs7
}];
return decrypted.toString[CryptoJS.enc.Utf8];
}
function getAES[]{ //加密
var data = "123456";//明文
var key = 'aaaa'; //密钥
var iv = 'bbbb';
var encrypted = getAesString[data,key,iv]; //密文
var enstr = CryptoJS.enc.Base64.stringify[encrypted.ciphertext];//encrypted.toString[];
// document.getElementById["encrypted"].innerHTML = encrypted;
}
// function getDAes[]{//解密
// var encrypted = document.getElementById["encrypted"].innerHTML; //密文
// var key = '1234567812345678';
// var iv = 'Pkcs7';
// var decryptedStr = getDAesString[encrypted,key,iv];
// document.getElementById["decrypted"].innerHTML = decryptedStr;
// };
getAES[];
khóa var = CryptoJS. enc. tiếng Latinh1. phân tích cú pháp [khóa];
var iv = CryptoJS. enc. tiếng Latinh1. phân tích cú pháp [iv];
key 和iv 编码均为CryptoJS. enc. tiếng Latinh1. phân tích cú pháp
参考资料: http. //wenku. baidu. com/link?url=aVGnTYLZxpssQpXPNfArG-bHpq-GYALUXCTeDwQWUZyIZGitimtmcr25elkem8cAPs4JjYIc3P8q7OTTjidOHWxM1NJDRIH2wuQvZkHgaYO
—————————————————————————————————————————————
原文链接:https. //Blog. csdn. net/u010200636/bài viết/chi tiết/53004754
trăn3. 6执行AES加密及解密方法
python版本:3. 6. 5
首先安装pycryptodome
# pip install pycryptodome
加密方式特别简单,代码如下:
方式一:补0
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
补0方式[ECB加密]
"""
import base64
from Crypto.Cipher import AES
# 补足字符串长度为16的倍数
def add_to_16[s]:
while len[s] % 16 != 0:
s += '\0'
return str.encode[s] # 返回bytes
key = '1234567890123456' # 密钥长度必须为16、24或32位,分别对应AES-128、AES-192和AES-256
text = 'abcdefg' # 待加密文本
aes = AES.new[str.encode[key], AES.MODE_ECB] # 初始化加密器,本例采用ECB加密模式
encrypted_text = str[base64.encodebytes[aes.encrypt[add_to_16[text]]], encoding='utf8'].replace['\n', ''] # 加密
decrypted_text = str[aes.decrypt[base64.decodebytes[bytes[encrypted_text, encoding='utf8']]].rstrip[b'\0'].decode["utf8"]] # 解密
print['加密值:', encrypted_text]
print['解密值:', decrypted_text]
结果为:
方式二:pkcs5________số 8_______
结果为:
两种方式加密后的值是不一样的,解密方式也是不一样的。
个人开发、IT常用工具网站 https. //www. huatools. com/
功能有 JSON格式化、XML格式化、URL格式化、Unix时间戳、Unicode转中文等。
原文链接:https. //Blog. csdn. net/hh775313602/bài viết/chi tiết/78991340
trăn3. 6 实现AES加密、解密(改版)
用pyCryptodome模块带的aes先将秘钥,以及要加密的文本填充为16位,随后对aes产生的字节码进行base64位编码,转为字符串的形式即可,解密思想逆过来即可。先逆向解密base64成bytes,执行解密密并转码返回str,将多余位数的’\0’替换为空。