当前位置: 首页 > news >正文

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)

相关文章:

  • 蓝桥杯刷题周计划(第四周)
  • 手撕LLM(二):从源码出发,探索LoRA加载、推理全流程
  • AudioFramework面试题
  • 【动态规划】线性dp
  • Windows事件日志清除
  • spring mvc异步请求 sse 大文件下载 断点续传下载Range
  • 【Kafka基础】topics命令行操作大全:进阶命令解析(2)
  • OpenSceneGraph (OSG) 开发入门
  • LeetCode 热题 100 堆
  • 快速通过简单代码了解装饰模式
  • 在Unity中,如果物体上的脚本丢失,可以通过编写一个自定义编辑器脚本来查找并删除这些丢失的组件
  • DeepSeek 教我 C++ (7) :常见的一些未定义UB
  • 基于论文的大模型应用:基于SmartETL的arXiv论文数据接入与预处理(一)
  • 嵌入式硬件篇---TOF陀螺仪SPI液晶屏
  • Xorg内存管理机制深度解析
  • P1025 [NOIP 2001 提高组] 数的划分(DFS)
  • 【Linux】:HTTP协议
  • Spring RestTemplate修仙指南:从HTTP萌新到请求大能的终极奥义
  • 【VS Code】为什么vscode已经关闭,http://localhost:5173/还可以打开或项目还在运行,端口被占用
  • 软件工程面试题(三十二)
  • 长春网站seo/360优化大师最新版
  • 从网站建设到网站运营/seo网站推广
  • 网站开发网页制作教程/江小白网络营销案例
  • 做二维码推送网站/整站优化快速排名
  • 祺越网站建设/湖南关键词优化排名推广
  • 阿里巴巴网站是怎么做的/哈市今日头条最新