一. 简介
DES: 56位密钥,由于密钥太短,被逐渐被弃用。
AES: 有128位、192位、256位密钥,现在比较流行。密钥长、可以增加破解的难度和成本。
工作模式归纳
-
ECB模式 全称Electronic Codebook模式,译为电子密码本模式,每个数据块独立进行加/解密
-
CBC模式 全称Cipher Block Chaining模式,译为密文分组链接模式
-
先将明文切分成若干小块,然后每个小块与初始块或者上一段的密文段进行逻辑异或运算后,再用密钥进行加密。第一个明文块与一个叫初始化向量的数据块进行逻辑异或运算
-
-
CFB模式 全称Cipher FeedBack模式,译为密文反馈模式
-
OFB模式 全称Output Feedback模式,译为输出反馈模式。
-
CTR模式 全称Counter模式,译为计数器模式。
iv: 防止同样的明文块、加密成同样的密文块
二. python实现
- 安装加密包
pip install pycryptodome
- python代码实现
from Crypto.Cipher import DES
def set_des(key, data, iv):
des = DES.new(key.encode('utf-8'), mode=DES.MODE_CBC, IV=iv.encode('utf-8'))
data_bs = data.encode('utf-8')
# 需要加密的数据必须是8的倍数
# 填充规则: 缺少数据量的个数 * chr(缺少数据量个数)
pad = 8 - len(data_bs) % 8
data_bs += (pad * chr(pad)).encode('utf-8') # 填充
bs = des.encrypt(data_bs) # 加密
return bs
def parse_des(key, data_bs, iv):
# 创建一个加密器
des = DES.new(key.encode('utf-8'), mode=DES.MODE_CBC, IV=iv.encode('utf-8'))
# 解密
result = des.decrypt(data_bs)
# 把字节转换为字符
data = result.decode('utf-8')
return data
if __name__ == '__main__':
key = '1234abcd'
data = '吃饭了吗'
iv = '01020304'
des_data = set_des(key, data, iv)
print(des_data)
parse_des_data = parse_des(key, des_data, iv)
print(parse_des_data.strip())
三. JavaScript实现
- 安装加密包
// 在依赖项中添加包: --save
npm install crypto-js --save
2.JavaScript代码实现
// 引用 crypto-js 加密模块
var CryptoJS = require('crypto-js')
function desEncrypt(text,desKey,desIv) {
var key = CryptoJS.enc.Utf8.parse(desKey),
iv = CryptoJS.enc.Utf8.parse(desIv),
srcs = CryptoJS.enc.Utf8.parse(text),
// CBC 加密模式,Pkcs7 填充方式
encrypted = CryptoJS.DES.encrypt(srcs, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return encrypted.toString();
}
function desDecrypt(encryptedData,desKey,desIv) {
var key = CryptoJS.enc.Utf8.parse(desKey),
iv = CryptoJS.enc.Utf8.parse(desIv),
srcs = encryptedData,
// CBC 加密模式,Pkcs7 填充方式
decrypted = CryptoJS.DES.decrypt(srcs, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return decrypted.toString(CryptoJS.enc.Utf8);
}
var text = "I love Python!" // 待加密对象
var desKey = "6f726c64f2c2057" // 密钥
var desIv = "0123456789ABCDEF" // 初始向量
var encryptedData = desEncrypt(text,desKey,desIv)
var decryptedData = desDecrypt(encryptedData,desKey,desIv)
console.log("加密字符串: ", encryptedData)
console.log("解密字符串: ", decryptedData)
// 加密字符串: +ndbEkWNw2QAfIYQtwC14w==
// 解密字符串: I love Python!