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

加载中...

DES 加解密

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

// DES 加密
function desEncrypt(text, key, iv) {
    const encrypted = CryptoJS.DES.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 用 CryptoJS.TripleDES
const enc3 = CryptoJS.TripleDES.encrypt(text, keyWordArray, { iv: ivWordArray, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
from Crypto.Cipher import DES, DES3
from Crypto.Util.Padding import pad, unpad
import base64

def des_encrypt(text, key, iv):
    cipher = DES.new(key.encode('utf-8'), DES.MODE_CBC, iv.encode('utf-8'))
    padded = pad(text.encode('utf-8'), DES.block_size)
    return base64.b64encode(cipher.encrypt(padded)).decode()

def des3_encrypt(text, key, iv):
    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()

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

public class DESUtil {
    public static String encrypt(String text, String key, String iv) throws Exception {
        Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
        DESKeySpec dks = new DESKeySpec(key.getBytes("UTF-8"));
        SecretKeyFactory factory = SecretKeyFactory.getInstance("DES");
        IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes("UTF-8"));
        cipher.init(Cipher.ENCRYPT_MODE, factory.generateSecret(dks), ivSpec);
        return Base64.getEncoder().encodeToString(cipher.doFinal(text.getBytes("UTF-8")));
    }
}
package main

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

func DesEncrypt(text, key, iv string) (string, error) {
    block, err := des.NewCipher([]byte(key))   // 8 字节
    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
}

// 3DES: 用 des.NewTripleDESCipher(24 字节密钥)
<?php
function desEncrypt($text, $key, $iv) {
    $encrypted = openssl_encrypt($text, 'DES-CBC', $key, OPENSSL_RAW_DATA, $iv);
    return base64_encode($encrypted);
}
function des3Encrypt($text, $key, $iv) {
    $encrypted = openssl_encrypt($text, 'DES-EDE3-CBC', $key, OPENSSL_RAW_DATA, $iv);
    return base64_encode($encrypted);
}
?>
DES 加密模式对比
模式 需要IV 并行处理 安全性 特点
CBC 仅解密 推荐 每块异或前一块,最常用
ECB 不推荐 简单,相同明文产生相同密文
CTR 推荐 流加密,性能高
CFB 仅解密 可用 流加密,自同步
OFB 可用 流加密,错误不传播

DES 与 3DES 是什么?

DES (Data Encryption Standard) 是 IBM 在 1970 年代开发、1977 年被美国 NIST 采纳的对称分组密码,使用 56 位有效密钥(8 字节中每字节最高位为奇偶校验位),分组长度 64 位(8 字节)。1998 年 EFF 用专用硬件 22 小时暴力破解了 DES,因此纯 DES 已不再安全,仅用于教学或兼容遗留系统

3DES(Triple DES、TDEA)通过对每个数据块连续运行 3 次 DES 加密以提高安全性,密钥长度 16(K1=K3,112 位有效)或 24(K1≠K2≠K3,168 位有效)字节。NIST 自 2024 年起禁止 3DES 用于新系统,建议优先使用 AES。本工具同时支持 DES 与 3DES,方便对接遗留接口。

参数说明

🔑 密钥 (Key)
DES 需要 8 字节;3DES 16 或 24 字节。密钥需双方约定并保密

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

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

🔄 加密模式 (Mode)
决定如何处理多个数据块。生产环境优先 CBC 或 CTR,避免 ECB

使用建议

✅ 推荐做法
- 新项目优先使用 AES-256,仅在对接遗留接口时使用 DES/3DES
- 使用 CBC 或 CTR 模式,每次加密生成全新随机 IV
- 密钥通过安全通道交换,避免硬编码在代码中
- 用 HMAC 校验密文完整性以防篡改

❌ 避免做法
- 不要使用 ECB 模式加密敏感数据
- 不要复用 IV
- 不要使用弱密码(如全 0、默认值)作为密钥
- 不要在新业务中使用纯 DES(已被破解)

安全说明

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

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

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