JS实现AES和DES

目录

目标

概述

DES

AES

实战

JS实现DES

JS实现AES


目标

        了解AES和DES的特点并用JS实现。


概述

DES

        翻译过来叫数据加密标准。它有5种加密模式(CTR、OFB、CFB、CBC、ECB),在JS中,不同加密模式语法结构几乎一致,主要区别就是mode设置和是否需要iv(初始化向量,可以理解为第二个密钥),其中ECB不需要iv,其他模式都需要。它具有以下特点:

  • 密钥长度:56位(实际上是64位,但每8位中有1位用于奇偶校验)。
  • 分组加密:64位分组。
  • 安全性较低,现在已不推荐用于敏感信息传输。

AES

        翻译过来叫高级加密标准。它比DES更先进,更安全。它也有五种加密模式,模式名称和DES的5中模式名称一样,但是内部的加密逻辑不同。同样地,除了ECB外,其他的四种加密模式都要iv(初始化向量)。它有如下特点:

  • 对称加密:加密和解密使用同一个密钥。
  • 分组加密:每次加密固定大小的块(128位=16字节)。
  • 密钥长度可选:128位(16字节)、192位(24字节)、256位(32字节)。

实战

JS实现DES

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

/**
 * 加密方法
 * @returns {string}
 */
function desEncrypt(desKey, desIv, data) {
    var key = cryptoJS.enc.Utf8.parse(desKey), iv = cryptoJS.enc.Utf8.parse(desIv),
        srcs = cryptoJS.enc.Utf8.parse(data), encrypted = cryptoJS.DES.encrypt(srcs, key, {
            //
            iv: iv, mode: cryptoJS.mode.CBC, //明文长度不是分组长度(8 字节)的整数倍时,需要补齐。补充模式为Pkcs7
            padding: cryptoJS.pad.Pkcs7
        });
    return encrypted.toString();
}

/**
 * 解密方法
 * @returns {string}
 */
function desDecrypt(desKey, desIv, data) {
    var key = cryptoJS.enc.Utf8.parse(desKey), iv = cryptoJS.enc.Utf8.parse(desIv),
        decrypted = cryptoJS.DES.decrypt(data, key, {
            iv: iv, mode: cryptoJS.mode.CBC, //明文长度不是分组长度(8 字节)的整数倍时,需要补齐。补充模式为Pkcs7
            padding: cryptoJS.pad.Pkcs7
        });
    return decrypted.toString(cryptoJS.enc.Utf8);
}

//明文
var data = "Hello World!"
//密钥长度超过了8位,则后面的字符串会被自动裁剪。
//所以我们看到密钥是12345678和1234567890加密后的密文是一样的。
var desKey = "12345678"
// 初始向量
var desIv = "0123456789ABCDEF"
//加密
var encryptedData = desEncrypt(desKey, desIv, data)
//解密
var decryptedData = desDecrypt(desKey, desIv, encryptedData)

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

JS实现AES

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

/**
 * 加密方法
 * @returns {string}
 */
function aesEncrypt(aesKey, aesIv, data) {
    var key = cryptoJS.enc.Utf8.parse(aesKey), iv = cryptoJS.enc.Utf8.parse(aesIv),
        srcs = cryptoJS.enc.Utf8.parse(data), encrypted = cryptoJS.AES.encrypt(srcs, key, {
            //
            iv: iv, mode: cryptoJS.mode.CBC, //明文长度不是分组长度(8 字节)的整数倍时,需要补齐。补充模式为Pkcs7
            padding: cryptoJS.pad.Pkcs7
        });
    return encrypted.toString();
}

/**
 * 解密方法
 * @returns {string}
 */
function aesDecrypt(aesKey, aesIv, data) {
    var key = cryptoJS.enc.Utf8.parse(aesKey), iv = cryptoJS.enc.Utf8.parse(aesIv),
        aecrypted = cryptoJS.AES.decrypt(data, key, {
            iv: iv, mode: cryptoJS.mode.CBC, //明文长度不是分组长度(8 字节)的整数倍时,需要补齐。补充模式为Pkcs7
            padding: cryptoJS.pad.Pkcs7
        });
    return aecrypted.toString(cryptoJS.enc.Utf8);
}

//明文
var data = "Hello World!"
//密钥
var aesKey = "1234123412341234"
// 初始向量
var aesIv = "0123456789ABCDEF"
//加密
var encryptedData = aesEncrypt(aesKey, aesIv, data)
//解密
var decryptedData = aesDecrypt(aesKey, aesIv, encryptedData)

console.log("加密字符串: ", encryptedData)
console.log("解密字符串: ", decryptedData)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值