python和JavaScript使用对称加密DES

一. 简介

DES: 56位密钥,由于密钥太短,被逐渐被弃用。

AES: 有128位、192位、256位密钥,现在比较流行。密钥长、可以增加破解的难度和成本。

工作模式归纳

  • ECB模式 全称Electronic Codebook模式,译为电子密码本模式,每个数据块独立进行加/解密

  • CBC模式 全称Cipher Block Chaining模式,译为密文分组链接模式

    • 先将明文切分成若干小块,然后每个小块与初始块或者上一段的密文段进行逻辑异或运算后,再用密钥进行加密。第一个明文块与一个叫初始化向量的数据块进行逻辑异或运算
      
  • CFB模式 全称Cipher FeedBack模式,译为密文反馈模式

  • OFB模式 全称Output Feedback模式,译为输出反馈模式。

  • CTR模式 全称Counter模式,译为计数器模式。

iv: 防止同样的明文块、加密成同样的密文块


二. python实现

  1. 安装加密包
pip install pycryptodome
  1. python代码实现
from Crypto.Cipher import DES


def set_des(key, data, iv):
    des = DES.new(key.encode('utf-8'), mode=DES.MODE_CBC, IV=iv.encode('utf-8'))
    data_bs = data.encode('utf-8')
    # 需要加密的数据必须是8的倍数
    # 填充规则: 缺少数据量的个数 * chr(缺少数据量个数)
    pad = 8 - len(data_bs) % 8
    data_bs += (pad * chr(pad)).encode('utf-8')  # 填充
    bs = des.encrypt(data_bs)  # 加密
    return bs


def parse_des(key, data_bs, iv):
    # 创建一个加密器
    des = DES.new(key.encode('utf-8'), mode=DES.MODE_CBC, IV=iv.encode('utf-8'))
    # 解密
    result = des.decrypt(data_bs)
    # 把字节转换为字符
    data = result.decode('utf-8')
    return data


if __name__ == '__main__':
    key = '1234abcd'
    data = '吃饭了吗'
    iv = '01020304'
    des_data = set_des(key, data, iv)
    print(des_data)
    parse_des_data = parse_des(key, des_data, iv)
    print(parse_des_data.strip())

三. JavaScript实现

  1. 安装加密包
// 在依赖项中添加包: --save
npm install crypto-js  --save

2.JavaScript代码实现

// 引用 crypto-js 加密模块 
var CryptoJS = require('crypto-js')

function desEncrypt(text,desKey,desIv) {
    var key = CryptoJS.enc.Utf8.parse(desKey),
        iv = CryptoJS.enc.Utf8.parse(desIv),
        srcs = CryptoJS.enc.Utf8.parse(text),
        // CBC 加密模式,Pkcs7 填充方式
        encrypted = CryptoJS.DES.encrypt(srcs, key, {
            iv: iv,
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7
        });
    return encrypted.toString();
}

function desDecrypt(encryptedData,desKey,desIv) {
    var key = CryptoJS.enc.Utf8.parse(desKey),
        iv = CryptoJS.enc.Utf8.parse(desIv),
        srcs = encryptedData,
        // CBC 加密模式,Pkcs7 填充方式
        decrypted = CryptoJS.DES.decrypt(srcs, key, {
            iv: iv,
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7
        });
    return decrypted.toString(CryptoJS.enc.Utf8);
}

var text = "I love Python!"       // 待加密对象
var desKey = "6f726c64f2c2057"    // 密钥
var desIv = "0123456789ABCDEF"    // 初始向量

var encryptedData = desEncrypt(text,desKey,desIv)
var decryptedData = desDecrypt(encryptedData,desKey,desIv)

console.log("加密字符串: ", encryptedData)
console.log("解密字符串: ", decryptedData)

// 加密字符串:  +ndbEkWNw2QAfIYQtwC14w==
// 解密字符串:  I love Python!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值