五岁小站 - 免费在线工具箱

加载中...

3DES 加解密

当前: 0 字符
当前: 0 字符
字符数: 0 | 字节数: 0
长度: 0 字符
常用配置模板
代码示例(3DES-24-CBC-PKCS7-Base64)
// 使用 CryptoJS 库
const CryptoJS = require('crypto-js');

// 3DES 加密(24 字节密钥)
function tripleDesEncrypt(text, key, iv) {
    const encrypted = CryptoJS.TripleDES.encrypt(text, CryptoJS.enc.Utf8.parse(key), {
        iv: CryptoJS.enc.Utf8.parse(iv),
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    });
    return encrypted.toString(); // Base64
}

// 3DES 解密
function tripleDesDecrypt(ciphertext, key, iv) {
    const decrypted = CryptoJS.TripleDES.decrypt(ciphertext, CryptoJS.enc.Utf8.parse(key), {
        iv: CryptoJS.enc.Utf8.parse(iv),
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    });
    return decrypted.toString(CryptoJS.enc.Utf8);
}
from Crypto.Cipher import DES3
from Crypto.Util.Padding import pad, unpad
import base64

def des3_encrypt(text, key, iv):
    # key 必须为 16 或 24 字节
    cipher = DES3.new(key.encode('utf-8'), DES3.MODE_CBC, iv.encode('utf-8'))
    padded = pad(text.encode('utf-8'), DES3.block_size)
    return base64.b64encode(cipher.encrypt(padded)).decode()

def des3_decrypt(ciphertext, key, iv):
    cipher = DES3.new(key.encode('utf-8'), DES3.MODE_CBC, iv.encode('utf-8'))
    decrypted = cipher.decrypt(base64.b64decode(ciphertext))
    return unpad(decrypted, DES3.block_size).decode('utf-8')

# pip install pycryptodome
import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.IvParameterSpec;
import java.util.Base64;

public class TripleDESUtil {
    public static String encrypt(String text, String key, String iv) throws Exception {
        // key 必须为 16 或 24 字节
        Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
        DESedeKeySpec keySpec = new DESedeKeySpec(key.getBytes("UTF-8"));
        SecretKeyFactory factory = SecretKeyFactory.getInstance("DESede");
        IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes("UTF-8"));
        cipher.init(Cipher.ENCRYPT_MODE, factory.generateSecret(keySpec), ivSpec);
        return Base64.getEncoder().encodeToString(cipher.doFinal(text.getBytes("UTF-8")));
    }

    public static String decrypt(String ciphertext, String key, String iv) throws Exception {
        Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
        DESedeKeySpec keySpec = new DESedeKeySpec(key.getBytes("UTF-8"));
        SecretKeyFactory factory = SecretKeyFactory.getInstance("DESede");
        IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes("UTF-8"));
        cipher.init(Cipher.DECRYPT_MODE, factory.generateSecret(keySpec), ivSpec);
        return new String(cipher.doFinal(Base64.getDecoder().decode(ciphertext)), "UTF-8");
    }
}
package main

import (
    "crypto/cipher"
    "crypto/des"
    "encoding/base64"
)

func TripleDesEncrypt(text, key, iv string) (string, error) {
    block, err := des.NewTripleDESCipher([]byte(key)) // 24 字节
    if err != nil { return "", err }
    plaintext := pkcs7Pad([]byte(text), block.BlockSize())
    mode := cipher.NewCBCEncrypter(block, []byte(iv))
    ct := make([]byte, len(plaintext))
    mode.CryptBlocks(ct, plaintext)
    return base64.StdEncoding.EncodeToString(ct), nil
}

func TripleDesDecrypt(ciphertext, key, iv string) (string, error) {
    block, _ := des.NewTripleDESCipher([]byte(key))
    data, _ := base64.StdEncoding.DecodeString(ciphertext)
    mode := cipher.NewCBCDecrypter(block, []byte(iv))
    plaintext := make([]byte, len(data))
    mode.CryptBlocks(plaintext, data)
    return string(pkcs7UnPad(plaintext)), nil
}
<?php
function tripleDesEncrypt($text, $key, $iv) {
    $encrypted = openssl_encrypt($text, 'DES-EDE3-CBC', $key, OPENSSL_RAW_DATA, $iv);
    return base64_encode($encrypted);
}

function tripleDesDecrypt($ciphertext, $key, $iv) {
    $data = base64_decode($ciphertext);
    return openssl_decrypt($data, 'DES-EDE3-CBC', $key, OPENSSL_RAW_DATA, $iv);
}

// 24 字节示例
$key = "12345678ABCDEFGH98765432"; // 24 字节
$iv  = "12345678";                  // 8 字节
$encrypted = tripleDesEncrypt("Hello World", $key, $iv);
?>
3DES 加密模式对比
模式 需要IV 并行处理 安全性 特点
CBC 仅解密 推荐 金融行业最常用,每块异或前一块
ECB 不推荐 简单,相同明文产生相同密文
CTR 推荐 流加密,性能高于 CBC
CFB 仅解密 可用 流加密,自同步
OFB 可用 流加密,错误不传播

3DES(TripleDES)是什么?

3DES(Triple DES、TDEA)是对原始 DES 算法的增强版本,对每个数据块连续应用 3 次 DES 运算(典型流程为 EK1(DK2(EK3(明文))),称为 EDE 模式),有效抵御了对原始 DES 的暴力破解攻击。

3DES 由美国 NIST 在 SP 800-67 标准中规范化,分组长度仍为 8 字节(64 位)。等效安全强度:双密钥模式约 112 位,三密钥模式约 168 位(实际由于中间相遇攻击约 112 位)。NIST 自 2024 年起禁止 3DES 用于新系统,但在金融、银行、IC 卡等遗留系统中仍广泛使用。

参数说明

🔑 密钥 (Key)
16 字节双密钥模式:K1=K3,等效有效强度 112 位,常见于早期金融 IC 卡
24 字节三密钥模式:K1≠K2≠K3,最常用配置

📐 偏移量 (IV)
初始化向量,固定 8 字节(与 DES 分组长度一致)。CBC/CTR/CFB/OFB 模式需要,ECB 不需要

📦 填充方式 (Padding)
3DES 要求明文长度是 8 字节整数倍,PKCS7 是默认且最通用的填充

🔄 加密模式 (Mode)
决定如何处理多个数据块。生产环境优先 CBC(兼容性最好)或 CTR(性能最高)

使用建议

✅ 推荐做法
- 仅在对接银行、金融、IC 卡等遗留系统时使用 3DES,新项目优先 AES
- 优先使用 24 字节三密钥模式(K1≠K2≠K3)
- 使用 CBC 或 CTR 模式,每次加密生成全新随机 IV
- 密钥通过安全通道交换,避免硬编码
- 用 HMAC 校验密文完整性以防篡改

❌ 避免做法
- 不要使用 ECB 模式加密敏感数据
- 不要复用 IV
- 不要使用弱密钥(全 0、连续字节)
- 不要在新业务中选用 3DES(NIST 已禁用,请使用 AES)

安全说明

🛡️ 本地处理
所有加解密计算均在浏览器内完成,输入与密钥不会上传至任何服务器

🔐 密钥安全
请妥善保管您的密钥,密钥丢失将无法恢复数据

💡 跨平台兼容
本工具基于 CryptoJS 实现,与 JavaScript / Python / Java / Go / PHP 等主流语言的 3DES 实现完全兼容(DES-EDE3-CBC / DESede/CBC/PKCS5Padding 等),只需保持算法、模式、填充、密钥、IV、编码一致