爬虫逆向加密技术详解之对称加密算法:3DES加密解密

一、对称加密介绍


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)操作,能够有效抵御暴力破解和差分密码分析攻击。

相关参数定义 :

  1. 密钥(Key)

    • 长度:通常为24字节(192位),由三个独立的8字节(56位有效)子密钥组成(K1、K2、K3)。
    • 特殊情况:可使用两个密钥(K1=K3),此时有效密钥长度为112位。
  2. 初始向量(IV)

    • 作用:在CBC等模式中初始化加密链,增强安全性。
    • 长度:8字节(64位),与DES分组大小一致。
  3. 加密模式

    • ECB(电子密码本):独立加密每个分组,安全性弱,但实现简单。
    • CBC(密码分组链接):前一分组密文与当前分组明文异或后加密,需IV,安全性更高。
    • 其他模式:CFB、OFB等流密码模式较少使用。
  4. 填充方式

    • PKCS7:补足N字节,每字节值为N(如缺3字节则补0x03 0x03 0x03)。
    • ZeroPadding:用0填充,需额外标记实际数据长度。

三、加密解密原理

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)))

  1. 密钥生成:根据用户提供的密钥生成三个子密钥(K1、K2、K3)。
  2. 初始置换:将输入数据按规则置换,增加混淆度。
  3. 三次DES加密
    • 第一次加密:用K1对明文P进行DES加密。
    • 第二次解密:用K2对第一次加密结果进行DES解密。
    • 第三次加密:用K3对第二次解密结果进行DES加密。
  4. 输出结果:将三次操作后的数据拼接,形成最终密文。

四、快速识别3DES加密的方法

4.1 密文长度判断

密文长度是 8字节(64位)分组的整数倍经 Base64 编码后的结果,通常是 4 的倍数。

4.2 验证密文字符集

密文是 Base64 编码的字符串,由字符 A - Za - z0 - 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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值