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

Javascript使用Sodium库实现 aead_xchacha20poly1305_ietf加密解密,以及与后端的密文交互

Node.js环境安装 sodium-native (其他库可能会出现加密解密失败,如果要使用不一样的库,请自行验证)

npm install sodium-native

示例代码,使用的是 sodium-native v4.3.2 (其他版本可能会有变化,如果要使用,请自行验证)

const sodium = require('sodium-native');(async () => {await sodium.ready;// 1. 要加密的消息const message = "Hello, world!";try {// 2. 将消息转换为 Uint8Arrayconst messageBytes = new TextEncoder().encode(message);// 生成随机的密钥和 nonceconst key = new Uint8Array(sodium.crypto_aead_xchacha20poly1305_ietf_KEYBYTES); /* 创建一个 32 字节的空Uint8Array : [0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0
]*/const nonce = new Uint8Array(sodium.crypto_aead_xchacha20poly1305_ietf_NPUBBYTES); /* 创建一个 24 字节的空Uint8Array: [0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0
] */#实际开发中,key和nonce会指定,否则影响加密解密sodium.randombytes_buf(key); // 填充随机数据到 keysodium.randombytes_buf(nonce); // 填充随机数据到 nonceconsole.log("随机生成的密钥:", key);console.log("随机生成的 nonce:", nonce);// 创建一个足够大的缓冲区来存储加密后的数据和认证标签const ciphertext = new Uint8Array(messageBytes.length + sodium.crypto_aead_xchacha20poly1305_ietf_ABYTES);// 创建一个足够大的缓冲区来存储解密后的数据(不包括认证标签)const decrypted = new Uint8Array(ciphertext.length - sodium.crypto_aead_xchacha20poly1305_ietf_ABYTES);const additionalData = new Uint8Array(); // 可以为空,或者包含额外的认证数据// 3. 加密sodium.crypto_aead_xchacha20poly1305_ietf_encrypt(ciphertext, // 加密后的缓冲区messageBytes, // 将消息转换为 Uint8ArrayadditionalData, // 附加数据(可选)null, // 附加数据的 nonce(可选)nonce, // 随机生成的 noncekey // 随机生成的密钥);// 输出加密相关信息console.log("加密后的密文:", ciphertext);// 4. 解密sodium.crypto_aead_xchacha20poly1305_ietf_decrypt(decrypted, // 解密后的缓冲区null, // 不需要预先分配空间ciphertext, // 密文additionalData, // 附加数据(可选)nonce, // 随机生成的 noncekey // 随机生成的密钥);if (decrypted) {// 解密成功const decryptedMessage = new TextDecoder().decode(decrypted);console.log("解密后的消息:", decryptedMessage);} else {console.log("解密失败");}} catch (error) {console.error("加密或解密过程中发生错误:", error);}
})();

加密解密正确可用,输出结果:

我们可以看到,在javascript里,无论是key,nonce,还是加密后的密文,都是十进制数组(Uint8Array),对应是typescript的Buffer类,这点我们可以通过查看加密方法的定义

然而在实际开发中,我们很多时候需要前端和后端进行密文的互相解密加密,这里有一些需要注意的地方。

以python为例,python实现加密解密的方法:

pip install pynacl
import nacl.bindings
from nacl.utils import random
import nacl.secretkey = random(nacl.bindings.crypto_aead_xchacha20poly1305_ietf_KEYBYTES)
#也可以是读取key文件获得key,比较常见的做法
# with open('/keyfile/key.cas-ie-key','rb') as file:
#         key = file.read()
decimal_array = [byte for byte in key]
print("随机生成的Key:", key)
nonce = random(nacl.bindings.crypto_aead_xchacha20poly1305_ietf_NPUBBYTES) #实际开发中,key和nonce会指定,否则影响加密解密
print("随机生成的nonce:", nonce)message = b"Hello, world!"ciphertext = nacl.bindings.crypto_aead_xchacha20poly1305_ietf_encrypt(message, None, nonce, key)
print("加密后的密文:",ciphertext)
print("解密后的明文:", nacl.bindings.crypto_aead_xchacha20poly1305_ietf_decrypt(ciphertext, None, nonce, key))

得到结果:

可以看到,python端的key,nonce,和密文,都是字节串bytes,调用方法时,也是传入的字节串参数。而javascript里则是十进制数组,调用方法时,也是传入的十进制数组参数(Uint8Array,对应typescript的Buffer)。

所以,python的密文在javascript端解密,javascript的密文在python端解密,是不能直接用对方的key,nonce,和密文的。

我们需要将字节串bytes和Unit8Array进行相互转换

从python端到javascript:

#在python端转换为十进制数组
decimal_array = [byte for byte in ciphertext]#key,nonce同理#结果:[108, 13, 97, 116, 187, 108, 69, 252, 135, 246, 107, 42, 39, 176, 94, 232, 140, 247, 152, 2, 239, 29, 23, 172, 131, 254, 30, 77, 46]

javascript端转换为Uint8Array后再传入方法里:

const ciphertext = new Uint8Array([108, 13, 97, 116, 187, 108, 69, 252, 135, 246, 107, 42, 39, 176, 94, 232, 140, 247, 152, 2, 239, 29, 23, 172, 131, 254, 30, 77, 46])
#key,nonce同理

从javascript到python端:

#在python里直接把js的数组转换为字节串即可
#key,nonce同理
ciphertext = bytes(unint8array_from_js)

相关文章:

Javascript使用Sodium库实现 aead_xchacha20poly1305_ietf加密解密,以及与后端的密文交互

Node.js环境安装 sodium-native (其他库可能会出现加密解密失败,如果要使用不一样的库,请自行验证) npm install sodium-native 示例代码,使用的是 sodium-native v4.3.2 (其他版本可能会有变化,如果要使用,请自行验…...

视频mp4垂直拼接 水平拼接

视频mp4垂直拼接 水平拼接 pinjie_v.py import imageio import numpy as np import os import cv2def pinjie_v(dir1,dir2,out_dir):os.makedirs(out_dir, exist_okTrue)# 获取目录下的所有视频文件video_files_1 [f for f in os.listdir(dir1) if f.endswith(.mp4)]video_fi…...

跟着李沐老师学习深度学习(十二)

循环神经网络 序列模型 序列数据 实际中很多数据是有时序结构的 比如:电影的评价随时间变化而变化 拿奖后评分上升,直到奖项被忘记看了很多好电影后,人们的期望变高季节性:贺岁片、暑期档导演、演员的负面报道导致评分变低 核心思想&#…...

MFC中CString的Format、与XML中的XML_SETTEXT格式化注意

1、在MFC中导入 "msxml6.dll",并使用其中的XML_SETTEXT函数,此调用在进行格式化的时候,调用的还是CString.Format()函数! 2、用double类型的数据,格式化整形数%d之前,必须将double强转为int&…...

如何设计合理的树状结构表:平衡查询效率与维护效率

树状结构广泛应用于数据建模中,例如 商品分类、组织架构、权限管理 等场景。合理设计树形结构的数据库表,能够有效提升 查询效率 和 维护效率。本文将探讨如何在设计时平衡这两者,详细介绍常用的几种树状结构存储方式及其适用场景。 一、树状…...

Springboot的简单推荐实现

以springboot 推荐社团招新为例子 使用 Spring Boot 构建社团招新推荐系统,用户注册后选择兴趣,系统根据兴趣推荐社团。 实现包括用户注册、兴趣选择和基于标签匹配的推荐算法。 系统使用 JPA 管理数据库,Spring Security 确保安全&#xff0…...

SpringBoot速成概括

视频:黑马程序员SpringBoot3Vue3全套视频教程,springbootvue企业级全栈开发从基础、实战到面试一套通关_哔哩哔哩_bilibili 图示:...

springboot多实例部署时,@Scheduled注释的方法重复执行

问题&#xff1a;springboot多实例部署时&#xff0c;Scheduled注释的方法重复执行 在 Spring Boot 中要实现 Redis 的SET NX EX命令&#xff0c;可以借助 Spring Data Redis 来完成。SET NX EX命令用于在键不存在时设置键值对&#xff0c;并同时设置过期时间。 <dependen…...

蓝桥杯15 填空题

1.握手问题&#xff1a; 思路&#xff1a;首先当所有人都握过手&#xff0c;由于一次握手相当于两个人都握手过&#xff0c;所以容易发现这是一个组合问题&#xff0c;为&#xff08;50*49&#xff09;/2&#xff0c;而其中有7个人没有相互握过手&#xff0c;那么减去&#xff…...

快速入门——第三方组件element-ui

学习自哔哩哔哩上的“刘老师教编程”&#xff0c;具体学习的网站为&#xff1a;10.第三方组件element-ui_哔哩哔哩_bilibili&#xff0c;以下是看课后做的笔记&#xff0c;仅供参考。 第一节 组件间的传值 组件可以有内部Data提供数据&#xff0c;也可由父组件通过prop方式传…...

力扣-贪心-455 分发饼干

思路 用小饼干去喂胃口小的孩子&#xff0c;不满足条件的时候&#xff0c;去喂胃口稍微大点的孩子&#xff0c;尽可能多满足孩子 class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {sort(g.begin(), g.end());sort(s.b…...

【多模态处理篇二】【深度揭秘:DeepSeek视频理解之时空注意力机制解析】

一、为啥要搞视频理解这事儿 咱先唠唠为啥视频理解这么重要哈。现在这互联网时代,视频那可是铺天盖地的。你刷短视频平台,看在线电影,玩游戏直播,到处都是视频。但是计算机它一开始可不懂视频里到底是啥意思,它看到的就是一堆像素点和声音信号。 视频理解呢,就是要让计…...

网络运维学习笔记 017 HCIA-Datacom综合实验01

文章目录 综合实验1实验需求总部特性 分支8分支9 配置一、 基本配置&#xff08;IP二层VLAN链路聚合&#xff09;ACC_SWSW-S1SW-S2SW-Ser1SW-CoreSW8SW9DHCPISPGW 二、 单臂路由GW 三、 vlanifSW8SW9 四、 OSPFSW8SW9GW 五、 DHCPDHCPGW 六、 NAT缺省路由GW 七、 HTTPGW 综合实…...

数据结构:实验题目:单链表归并。将两个非递减次序排列的单链表归并为一个非递增次序排列的单链表,并计算表长。要求利用原来两个单链表的结点存放合并后的单链表。

输出样例如图&#xff1a; 代码如下&#xff1a; #include<stdio.h>#include<stdlib.h>//链表节点结构 typedefstructListNode{intval;structListNode*next; } ListNode;// 创建新节点 ListNode* createNode(int val){ListNode* newNode (ListNode*)malloc(sizeo…...

请求go构建缓存,go clean -cache

go clean -cache go 构建时会产生很多缓存&#xff0c; 一般是目录&#xff1a;/Users/xxx/Library/Caches/go-build 此目录README&#xff1a; This directory holds cached build artifacts from the Go build system. Run "go clean -cache" if the directory …...

Windows和Linux下,通过C++实现获取蓝牙版本号

在 C 中获取蓝牙版本号&#xff0c;不同的操作系统有不同的实现方式&#xff0c;下面分别介绍在 Windows 和 Linux 系统下的实现方法。 Windows 系统 在 Windows 系统中&#xff0c;可以使用 Windows API 来与蓝牙设备交互&#xff0c;获取蓝牙版本号。以下是一个示例代码&…...

【网络】如何划分子网、计算子网掩码、确定网络地址、广播地址和可用主机地址范围?

当然&#xff01;让我们一步一步详细介绍如何划分子网、计算子网掩码、确定网络地址、广播地址和可用主机地址范围。假设我们从一个 10.0.0.0/24 的网络开始&#xff0c;并且需要为每个子网提供 50 个主机地址。 问题概述&#xff1a; 我们有一个网络 10.0.0.0/24。我们希望为…...

内核数据结构用法(2)list

list 在 Linux 内核中&#xff0c;链表操作是通过一组宏和函数来实现的&#xff0c;这些操作通常用来管理和遍历链表。以下是一些常用的链表函数和宏的具体用法。 1. 定义链表节点 首先&#xff0c;你需要定义一个包含 struct list_head 的结构体&#xff1a; #include <…...

【数据分析】2.数据分析业务全流程

业务流程方法论&#xff1a;3阶段6步骤 一、课程核心内容结构 1. 方法论概述 目标&#xff1a;系统性地解决商业中的关键问题框架&#xff1a;分为三个阶段&#xff0c;每个阶段包含两个步骤适用场景&#xff1a;适用于数据分析师、业务经理等需要通过数据分析支持决策的从业…...

第三十章 V - W 开头的术语

文章目录 第三十章 V - W 开头的术语视图 (view)虚拟字段 (virtual field)虚拟表 (virtual table) 以 W 开头的术语观察点 (watchpoint)Web 应用程序 (web application)工作集 (working set)写入镜像日志记录 (write image journaling) 以 X 开头的术语XData 第三十章 V - W 开…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...