JavaScript <关于AES/DES`代码+白话`讲解和对比>--案例(四)

前言:

有XX私信,说他对于aes和des的解密有点混淆;说实话,我当初也混淆.其实案例搞多了,就清楚了;但是,今天把它稍微梳理一下,整理出来,对你对我都是交代;

正文:

AES(Advanced Encryption Standard)和 DES(Data Encryption Standard)都是加密算法,用于加密信息以确保数据安全,但它们之间有一些关键区别:

  1. AES是一种比DES更加先进和安全的加密算法。DES是在1970年代创建的,并已被证明容易受到破解攻击(例如穷举攻击),而AES在2001年成为新的标准,具有更高的安全性。
  2. 密钥长度不同:DES使用一个56位的密钥,而AES允许128、192或256位的密钥长度。
  3.  加密块大小:DES以64位为块加密数据,而AES则以128位为块加密数据。
  4.  加密过程:DES使用Feistel网络,它是一种分块密码技术,而AES则使用一个称为SP网络的不同结构(也是分块密码,但是具有不同的内部设计)。
  5.  AES执行速度通常比DES更快,安全性更高。

案例:

在JavaScript中通过`crypto`模块调用AES和DES算法的加密方式如下:
const crypto = require('crypto');// AES加密例子
function encryptWithAES(text, secretKey) {const iv = crypto.randomBytes(16); // 随机生成初始化向量const cipher = crypto.createCipheriv('aes-256-cbc', secretKey, iv);let encrypted = cipher.update(text);encrypted = Buffer.concat([encrypted, cipher.final()]);return iv.toString('hex') + ':' + encrypted.toString('hex');
}// DES加密的例子
function encryptWithDES(text, secretKey) {const iv = crypto.randomBytes(8); // 对于DES,IV是8字节const cipher = crypto.createCipheriv('des-cbc', secretKey, iv);let encrypted = cipher.update(text, 'utf8', 'base64');encrypted += cipher.final('base64');return iv.toString('hex') + ':' + encrypted;
}// 使用示例
const text = 'Hello, World!';
const aesKey = crypto.randomBytes(32); // AES 256位密钥
const desKey = crypto.randomBytes(8);  // DES 56位密钥const aesEncrypted = encryptWithAES(text, aesKey);
console.log('AES Encrypted:', aesEncrypted);const desEncrypted = encryptWithDES(text, desKey);
console.log('DES Encrypted:', desEncrypted);

注意:在实际应用中,密钥需要安全管理,直接使用硬编码的密钥是不安全的。此外,初始化向量(IV)应该是随机的,以提高加密算法的安全性。上面的代码仅作为如何在Node.js环境下使用`crypto`模块的示例说明。

案例:

在JavaScript中通过`crypto`模块调用AES和DES算法的解密方式如下:
const crypto = require('crypto');// AES解密例子
function decryptWithAES(encryptedText, secretKey) {const parts = encryptedText.split(':');const iv = Buffer.from(parts.shift(), 'hex');const encrypted = Buffer.from(parts.join(':'), 'hex');const decipher = crypto.createDecipheriv('aes-256-cbc', secretKey, iv);let decrypted = decipher.update(encrypted);decrypted = Buffer.concat([decrypted, decipher.final()]);return decrypted.toString();
}// DES解密例子
function decryptWithDES(encryptedText, secretKey) {const parts = encryptedText.split(':');const iv = Buffer.from(parts.shift(), 'hex');const encrypted = parts.join(':');const decipher = crypto.createDecipheriv('des-cbc', secretKey, iv);let decrypted = decipher.update(encrypted, 'base64', 'utf8');decrypted += decipher.final('utf8');return decrypted;
}// 使用示例
const aesEncryptedText = '...'; // 这里放入你的加密字符串
const desEncryptedText = '...'; // 这里放入你的加密字符串const aesKey = Buffer.from('...'); // AES 256位密钥用Buffer类型放入,长度32
const desKey = Buffer.from('...'); // DES 56位密钥用Buffer类型放入,长度8const aesDecrypted = decryptWithAES(aesEncryptedText, aesKey);
console.log('AES Decrypted:', aesDecrypted);const desDecrypted = decryptWithDES(desEncryptedText, desKey);
console.log('DES Decrypted:', desDecrypted);
  1. 在实际使用解密函数时,你需要将aesEncryptedText和desEncryptedText替换成相应的加密字符串,aesKey和desKey替换成用于加密的密钥。请确保使用相同的密钥和IV(初始化向量)进行解密,因为这些决定了能否正确地还原加密前的数据.
  2. 解密函数的工作原理和加密很相似,只是流程相反。首先从加密字符串中提取IV和密文部分,然后用相应的密钥和IV创建一个decipher对象,接着用update方法处理密文,最后用final方法完成解密过程,并将解密结果转换成字符串形式。

细致归纳:

DES

  1. 密钥长度: 56位实际密钥加上8位奇偶校验位,共64位。
  2. 块大小: 64位。
  3. 安全性: 已不再被认为足够安全,因为其较短的密钥长度容易受到穷举攻击。
  4. 用途: 早期的标准加密算法,现在一般不推荐用于敏感数据。
  5. 实现: 在Node.js中,可以使用`crypto`模块中的`createCipheriv`和`createDecipheriv`方法,与密钥和初始化向量(IV)一起使用。
const crypto = require('crypto');
const desKey = Buffer.alloc(8); // DES需要8字节密钥
const desIv = Buffer.alloc(8); // DES需要8字节IV// 加密
const desCipher = crypto.createCipheriv('des-cbc', desKey, desIv);
let desEncrypted = desCipher.update('text_to_encrypt', 'utf8', 'base64');
desEncrypted += desCipher.final('base64');// 解密
const desDecipher = crypto.createDecipheriv('des-cbc', desKey, desIv);
let desDecrypted = desDecipher.update(desEncrypted, 'base64', 'utf8');
desDecrypted += desDecipher.final('utf8');


 AES

  1. 密钥长度: 支持128位、192位和256位密钥长度。
  2. 块大小: 128位。
  3. 安全性: 提供了更高级的安全性,是现在广泛采用的加密标准。
  4. 用途: 广泛用于政府、金融和商业领域,用于保护数据。
  5. 实现: 在Node.js中,也可以使用`crypto`模块中的相应方法,不过需要更长的密钥和适用于AES的IV。
const crypto = require('crypto');
const aesKey = Buffer.alloc(32); // AES 256位密钥
const aesIv = Buffer.alloc(16); // AES需要16字节IV// 加密
const aesCipher = crypto.createCipheriv('aes-256-cbc', aesKey, aesIv);
let aesEncrypted = aesCipher.update('text_to_encrypt', 'utf8', 'base64');
aesEncrypted += aesCipher.final('base64');// 解密
const aesDecipher = crypto.createDecipheriv('aes-256-cbc', aesKey, aesIv);
let aesDecrypted = aesDecipher.update(aesEncrypted, 'base64', 'utf8');
aesDecrypted += aesDecipher.final('utf8');

总结:

  1. - AES是DES的替代者,提供了更高的安全性和更快的速度。

  2. - DES现在由于易于被破解而被认为不够安全,不应用于需要高安全性的应用中。

  3. - 在JavaScript中,使用`crypto`模块可以方便地实现这两种算法的加密解密。

  4. - 加密时,需要指定算法名、密钥、和初始化向量(IV),而解密时需要用相同的密钥和IV进行反向操作。

  5. - 安全实践要求,密钥和IV应当保密并确保通过安全方式分配和存储,密钥和IV的选择应是随机的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/204181.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Node.js快速搭建简单的HTTP服务器并发布公网远程访问

文章目录 前言1.安装Node.js环境2.创建node.js服务3. 访问node.js 服务4.内网穿透4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5.固定公网地址 前言 Node.js 是能够在服务器端运行 JavaScript 的开放源代码、跨平台运行环境。Node.js 由 OpenJS Foundation&#xff0…

TCP传输的三次握手四次挥手策略

TCP传输的三次握手四次挥手策略如下: 第一次握手:客户端发送一个带有SYN标志的数据包给服务器,并记为SYN_Client。第二次握手:服务器收到SYN_Client后,向客户端发送一个带有SYN和ACK标志的数据包,记为SYN_…

西工大计算机学院计算机系统基础实验一(函数编写15~17)

还是那句话,稳住心态,稳住心态,稳住心态。心里别慌,心里别慌,心里别慌。 第15题,howManyBits,返回用二进制补码形式表示x所需的最小二进制位数。比如howManyBits(12) 5,12可以被表…

初学vue3与ts:vue3选项式api获取当前路由地址

vue2的获取方法 this.$route.pathvue3选项式api获取方法 import { useRouter } from vue-router; const router useRouter(); console.log(router) console.log(router.currentRoute.value.path)

测开速成考点

用户登录界面需要做哪些测试? ⑴功能:  正确的用户名,正确的密码,点击提交按钮,验证能否正确登录 是否跳转正确页面。  错误的用户名 或 密码,点击提交,提示相应的错误信息。  记住用户名…

Word文件设置了只读模式,为什么还能编辑?

Word文档设置了只读模式,为什么还可以编辑呢?,不过当我们进行保存的时候会发现,word提示需要重命名并选择新路径才能够保存,是因为什么呢?今天我们学习一下如何解决问题。 这种操作,即使可以编辑…

Python-文件详解

一个计算机包括:CPU、存储器、输入设备、输出设备 存储器分为内存和硬盘 文件路径:一层一层文件目录组成的字符串 文件路径可以视为文件在硬盘中的身份标识,因为每一个文件的1路径唯一 文件之间使用/反斜杠和\正斜杠都一样 内存和硬盘的区别…

AI文本生成工具-免费AI文本生成软件

在当今数字时代,人工智能技术的快速发展不仅改变了我们的生活方式,还在创作领域崭露头角。其中,AI文本生成技术的迅猛发展引起了广泛关注。本文将深入探讨AI文本生成的方法、工具以及一些关键技巧,帮助读者更好地了解并利用这一前…

Run Micro-ROS on almost any stm32

Run Micro-ROS on almost any stm32 - Tech blog (guillaumebeuzeboc.github.io) Run Micro-ROS on almost any stm32 19 Sep 2021 c, cmake, stm32, micro-ros, clion 如果用的不是STM32F4,需要自己去生成micro_ros_stm32cubemx_utils库 Micro-ROS brings the…

你知道模拟养成游戏如何开发吗?

在游戏开发的世界中,模拟养成游戏一直以其引人入胜的玩法和独特的虚拟体验吸引着玩家的目光。从概念的孵化到最终的上线,模拟养成游戏的开发是一个富有挑战性又充满创意的过程。本文将带你深入了解这一过程,揭示模拟养成游戏背后的秘密&#…

UNIX 文件权限设置的相关函数

函数 umask umask 函数为进程设置文件模式创建屏蔽字&#xff0c;并返回之前的值。这个函数没有出错返回&#xff0c;它不会出错. #include <sys/stat.h> mode_t umask(mode_t cmask); // 返回值&#xff1a;为文件模式创建屏蔽字 其中&#xff0c;参数 cmask 是由 文…

qt 5.15.2 主窗体菜单工具栏树控件功能

qt 5.15.2 主窗体菜单工具栏树控件功能 显示主窗体效果&#xff1a; mainwindow.h文件内容&#xff1a; #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QFileDialog> #include <QString> #include <QMessageBox>#inc…

m1通过源码编译xgboost4j的jar

1、下载源码 git clone --recursive https://github.com/dmlc/xgboost cd xgboost 编译xgboost的动态链接库dylib&#xff0c;m1源码编译xgboost的动态链接库dylib文件 2、编译XGBoost的jar文件&#xff1a; A、如果没有安装maven可以通过以下命令进行安装&#xff0c;如果安…

【开发技能】-解决visio交叉线(跨线)交叉点弯曲问题

问题 平时工作中使用visio作图时&#xff0c;经常会遇到交叉线在相交时会形成一个弯曲弓形&#xff0c;这十分影响视图效果。可以采用下面的方法消除弓形。 方法 第一步&#xff1a;菜单栏--设计---连接线 第二步&#xff1a;选中这条交叉线---点击显示跨线 最终问题得到解决…

基于ssm学校运动会信息管理系统论文

摘 要 在当今社会上&#xff0c;体育运动越来越普及&#xff0c;参与运动会的人越来越多&#xff0c;但是目前对运动会信息管理还是处于手工记录的时代&#xff0c;这远远满足不了现在用户需求&#xff0c;因此建立一个运动会信息管理系统已经变的非常重要。 本文重点阐述了学…

16个UI设计小规则,但是却能产生巨大影响

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版&#xff0c;欢迎购买。点击进入详情 文章目录 1.使用空间对相关元素进行分组2.保持一致3.确保外观相似的元素功能相似4.创建清晰的视觉层次5.删除不必要的样式6.有目的地使用颜色7.确保界面元素的对比…

漫步者开放式耳机怎么样?南卡、漫步者开放式耳机哪个好?

现在开放式耳机的市场越来越混杂&#xff0c;我们作为消费者在挑选的时候&#xff0c;一定要找准需求点才能把踩坑几率降到最低。实在不会挑选的也不要紧&#xff0c;我最近入了2款目前市面最畅销的百元款开放式耳机&#xff1a;南卡OE CC和漫步者comfo fit&#xff0c;亲身上耳…

Java电商平台 - API 接口设计之 token、timestamp、sign 具体架构与实现

一&#xff1a;token 简介 Token&#xff1a;访问令牌access token, 用于接口中, 用于标识接口调用者的身份、凭证&#xff0c;减少用户名和密码的传输次数。一般情况下客户端(接口调用方)需要先向服务器端申请一个接口调用的账号&#xff0c;服务器会给出一个appId和一个key, …

js截取域名url地址

这样的域名链接 https://aaa.com/collections/strap-on?filter.v.price.gte1&filter.v.price.lte233 去掉https://aaa.com/collections/ 和 ?filter.v.price.gte1&filter.v.price.lte233 只要strap-on中间这部分 <script> var url window.location.href; va…

resnet 图像分类的项目

1. 项目文件 文件下载资源&#xff1a;resnet 图像分类的项目代码 本章利用reset34 作图像分类&#xff0c;包括计算训练集和测试集的loss、accuracy曲线&#xff0c;对训练好的网络在训练集测试集上求混淆矩阵 data 文件为训练集测试集&#xff0c;图像按照文件夹摆放inferenc…