目录
目标
概述
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)