文章目录
一、对称加密介绍
3DES属于对称加密算法,不知道什么是对称加密的小伙伴请看这篇文章:https://blog.youkuaiyun.com/thy525/article/details/147700959
二、3DES加密算法简介
3DES(Triple DES)是DES(Data Encryption Standard)的增强版本,全称为三重数据加密标准(Triple Data Encryption Standard)。它通过三次DES加密过程来提高安全性,是DES向AES(Advanced Encryption Standard)过渡的加密算法。3DES使用三个不同的56位密钥(总计168位,实际有效密钥长度为112位,因密钥互补规则)对数据进行加密-解密-加密(EDE)操作,能够有效抵御暴力破解和差分密码分析攻击。
相关参数定义 :
-
密钥(Key)
- 长度:通常为24字节(192位),由三个独立的8字节(56位有效)子密钥组成(K1、K2、K3)。
- 特殊情况:可使用两个密钥(K1=K3),此时有效密钥长度为112位。
-
初始向量(IV)
- 作用:在CBC等模式中初始化加密链,增强安全性。
- 长度:8字节(64位),与DES分组大小一致。
-
加密模式
- ECB(电子密码本):独立加密每个分组,安全性弱,但实现简单。
- CBC(密码分组链接):前一分组密文与当前分组明文异或后加密,需IV,安全性更高。
- 其他模式:CFB、OFB等流密码模式较少使用。
-
填充方式
- PKCS7:补足N字节,每字节值为N(如缺3字节则补
0x03 0x03 0x03)。 - ZeroPadding:用0填充,需额外标记实际数据长度。
- PKCS7:补足N字节,每字节值为N(如缺3字节则补
三、加密解密原理
3DES的加密过程为: C = E K 3 ( D K 2 ( E K 1 ( P ) ) ) C = E_{K3}(D_{K2}(E_{K1}(P))) C=EK3(DK2(EK1(P)))
解密过程为: P = D K 1 ( E K 2 ( D K 3 ( C ) ) ) P = D_{K1}(E_{K2}(D_{K3}(C))) P=DK1(EK2(DK3(C)))
- 密钥生成:根据用户提供的密钥生成三个子密钥(K1、K2、K3)。
- 初始置换:将输入数据按规则置换,增加混淆度。
- 三次DES加密:
- 第一次加密:用K1对明文P进行DES加密。
- 第二次解密:用K2对第一次加密结果进行DES解密。
- 第三次加密:用K3对第二次解密结果进行DES加密。
- 输出结果:将三次操作后的数据拼接,形成最终密文。
四、快速识别3DES加密的方法
4.1 密文长度判断
密文长度是 8字节(64位)分组的整数倍经 Base64 编码后的结果,通常是 4 的倍数。
4.2 验证密文字符集
密文是 Base64 编码的字符串,由字符 A - Z、a - z、0 - 9、+、/ 和 = 组成(用于填充)。
4.3 代码特征识别
-
密钥处理:检测24字节密钥的生成或拆分逻辑(如将24字节密钥拆分为三个8字节子密钥)。
-
加密函数调用:识别三次DES加密/解密操作,顺序为E-D-E。
-
CryptoJS库:
CryptoJS.TripleDES.encrypt(text, key, { iv: iv });
总结:仅从密文本身较难一眼区分,但如果密文是 Base64 编码,且长度符合 8 字节分组加密后 Base64 编码的规律,结合使用较长的 128 位或 192 位密钥和已知的 3DES 加密库信息,可推测为 3DES 加密结果。
五、代码实现
5.1 JavaScript实现3DES加密解密
const CryptoJS = require('crypto-js');
// DES 加密函数,使用 CBC 模式和偏移量
function encrypt3DES(plainText, keyHex, ivHex) {
const encrypted = CryptoJS.TripleDES.encrypt(plainText, keyHex, {
iv: ivHex,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return encrypted.ciphertext.toString(CryptoJS.enc.Base64);
}
// DES 解密函数,使用 CBC 模式和偏移量
function decrypt3DES(cipherText, keyHex, ivHex) {
const decrypted = CryptoJS.TripleDES.decrypt(cipherText, keyHex, {
iv: ivHex,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return decrypted.toString(CryptoJS.enc.Utf8);
}
const plainText = '123456'; // 明文
const keyHex = CryptoJS.enc.Utf8.parse('123456789012345678901234'); // 密钥(24字节)
const ivHex = CryptoJS.enc.Utf8.parse('12345678'); // 向量(8字节)
// 加密
const encrypted = encrypt3DES(plainText, keyHex, ivHex);
console.log('3DES 加密后密文: ', encrypted);
console.log('3DES 加密后密文长度: ', encrypted.length);
//解密
const decrypted = decrypt3DES(encrypted, keyHex, ivHex);
console.log('3DES 解密后: ', decrypted);
运行结果:
3DES 加密后密文: 1F8cfMMhXoQ=
3DES 加密后密文长度: 12
3DES 解密后: 123456
5.2 Python实现3DES加密解密
from Cryptodome.Cipher import DES3
from Cryptodome.Util.Padding import pad, unpad
import base64
def encrypt_3des(plain_text, key, iv):
"""
3DES加密函数,使用CBC模式和PKCS7填充
:param plain_text: 明文(字符串)
:param key: 密钥(24字节)
:param iv: 初始化向量(8字节)
:return: Base64编码的密文
"""
cipher = DES3.new(key, DES3.MODE_CBC, iv)
padded_data = pad(plain_text.encode('utf-8'), DES3.block_size, style='pkcs7')
encrypted_data = cipher.encrypt(padded_data)
return base64.b64encode(encrypted_data).decode('utf-8')
def decrypt_3des(cipher_text, key, iv):
"""
3DES解密函数,使用CBC模式和PKCS7填充
:param cipher_text: Base64编码的密文
:param key: 密钥(24字节)
:param iv: 初始化向量(8字节)
:return: 解密后的明文
"""
cipher = DES3.new(key, DES3.MODE_CBC, iv)
encrypted_data = base64.b64decode(cipher_text)
decrypted_data = cipher.decrypt(encrypted_data)
return unpad(decrypted_data, DES3.block_size, style='pkcs7').decode('utf-8')
# 测试
plain_text = '123456' # 明文
key = b'123456789012345678901234' # 密钥(24字节)
iv = b'12345678' # 初始化向量(8字节)
# 加密
encrypted = encrypt_3des(plain_text, key, iv)
print('3DES 加密后密文:', encrypted)
print('3DES 加密后密文长度:', len(encrypted))
# 解密
decrypted = decrypt_3des(encrypted, key, iv)
print('3DES 解密后:', decrypted)
运行结果:
3DES 加密后密文: 1F8cfMMhXoQ=
3DES 加密后密文长度: 12
3DES 解密后: 123456
1961

被折叠的 条评论
为什么被折叠?



