3DES 加解密
字符数: 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 运算(典型流程为
3DES 由美国 NIST 在 SP 800-67 标准中规范化,分组长度仍为 8 字节(64 位)。等效安全强度:双密钥模式约 112 位,三密钥模式约 168 位(实际由于中间相遇攻击约 112 位)。NIST 自 2024 年起禁止 3DES 用于新系统,但在金融、银行、IC 卡等遗留系统中仍广泛使用。
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(性能最高)
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)
- 仅在对接银行、金融、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、编码一致
所有加解密计算均在浏览器内完成,输入与密钥不会上传至任何服务器
🔐 密钥安全
请妥善保管您的密钥,密钥丢失将无法恢复数据
💡 跨平台兼容
本工具基于 CryptoJS 实现,与 JavaScript / Python / Java / Go / PHP 等主流语言的 3DES 实现完全兼容(DES-EDE3-CBC / DESede/CBC/PKCS5Padding 等),只需保持算法、模式、填充、密钥、IV、编码一致
