node之sm-crypto模块,浏览器和 Node.js 环境中SM国密算法库

2023-12-12 08:52

本文主要是介绍node之sm-crypto模块,浏览器和 Node.js 环境中SM国密算法库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、简介

sm-crypto是一个基于Node.js的密码学库,用于提供各种加密、解密、签名和验证功能。它是为了与国密算法(中国密码算法标准)兼容而设计的。
以下是sm-crypto库的一些主要功能:

  1. 对称加密和解密:sm-crypto支持使用国密算法进行对称加密和解密操作。您可以使用库中提供的函数进行数据的加密和解密,例如使用SM1、SM4等算法。
  2. 非对称加密和解密:sm-crypto支持使用国密算法进行非对称加密和解密操作。您可以使用库中提供的函数进行公钥加密和私钥解密,例如使用SM2算法。
  3. 数字签名和验证:sm-crypto提供了数字签名和验证的功能。您可以使用库中的函数对数据进行签名,并使用相应的公钥验证签名的有效性。这可以用于确保数据的完整性和身份认证。
  4. 密钥生成和派生:sm-crypto支持生成和派生密钥的功能。您可以使用库中的函数生成对称密钥或者从密码派生密钥。这对于安全地管理密钥非常有用。
  5. 密码学哈希函数:sm-crypto提供了一些密码学哈希函数的支持,例如SM3哈希算法。您可以使用这些函数对数据进行哈希,以生成唯一的哈希值。
二、安装
npm install sm-crypto
三、哈希算法SM3
const smCrypto = require('sm-crypto');const sm3_hash = smCrypto.sm3('hello word');console.log(sm3_hash)
四、对称加密算法SM4
  1. smCrypto.sm4…encrypt(inArray, key, options, key, options):
  • inArray:要加密的明文数据,可以是字符串或Buffer对象。
  • key:加密密钥,可以是字符串或Buffer对象。密钥长度必须为16字节(128位)。
  • options:可选参数的对象:
  • mode:加密模式,默认为ecb(电子密码本模式),也可以是cbc(密码分组链接模式)。
  • iv:初始向量(IV),仅在cbc模式下使用。可以是字符串或Buffer对象。IV长度必须为16字节(128位)。
  • padding:填充模式,默认为pkcs7。可以是pkcs7(PKCS7填充)或zero(零填充)。
  • output:输出格式,默认为string。可以是string(字符串)或array(数组)。
  1. smCrypto.sm4…encrypt(inArray, key, options)
  • inArray:要加密的明文数据,可以是字符串或Buffer对象。
  • key:加密密钥,可以是字符串或Buffer对象。密钥长度必须为16字节(128位)。
  • options:可选参数的对象:
  • mode:加密模式,默认为ecb(电子密码本模式),也可以是cbc(密码分组链接模式)。
  • iv:初始向量(IV),仅在cbc模式下使用。可以是字符串或Buffer对象。IV长度必须为16字节(128位)。
  • padding:填充模式,默认为pkcs7。可以是pkcs7(PKCS7填充)或zero(零填充)。
  • output:输出格式,默认为string。可以是string(字符串)或array(数组)。
const smCrypto = require('sm-crypto');const sm4 = smCrypto.sm4;const key = '0123456789ABCDEF0123456789ABCDEF'; // 设置SM4密钥(128位,16字节)
const mode = 'ecb'; // 设置SM4加解密模式(ecb、cbc、ctr等)// 加密数据
const plaintext = 'Hello, SM4!';
const ciphertext = sm4.encrypt(plaintext, key, { mode });
console.log('加密数据:', ciphertext);// 解密数据
const decryptedText = sm4.decrypt(ciphertext, key, { mode });
console.log('解密数据:', decryptedText);
五、非对称加密算法SM2
  1. smCrypto.sm2.generateKeyPairHex(a, b, c):生成SM2密钥对,并以十六进制字符串的形式返回公钥和私钥。参数a、b、c是可选的,用于指定生成密钥对的曲线参数。
  2. smCrypto.sm2.compressPublicKeyHex(s):将SM2公钥的十六进制字符串表示进行压缩,返回压缩后的公钥的十六进制字符串。
  3. smCrypto.sm2.comparePublicKeyHex(publicKey1, publicKey2):比较两个SM2公钥的十六进制字符串表示是否相等。如果相等,返回true;否则返回false。
  4. smCrypto.sm2.doEncrypt(msg, publicKey, cipherMode):使用SM2公钥对消息进行加密
  • msg是要加密的消息
  • publicKey是SM2公钥的十六进制字符串表示
  • cipherMode是加密模式,可以是0(C1C3C2模式)或1(C1C2C3模式)。返回加密后的密文的十六进制字符串表示。
  1. smCrypto.sm2.doDecrypt(encryptData, privateKey, cipherMode):使用SM2私钥对密文进行解密
  • encryptData是要解密的密文的十六进制字符串表示
  • privateKey是SM2私钥的十六进制字符串表示
  • cipherMode是加密模式,与加密时使用的模式保持一致。返回解密后的明文。
  1. smCrypto.sm2.doSignature(msg, privateKey):使用SM2私钥对消息进行数字签名。
  • msg是要签名的消息
  • privateKey是SM2私钥的十六进制字符串表示。返回数字签名的十六进制字符串表示。
  1. smCrypto.sm2.doVerifySignature(msg, signHex, publicKey, options):验证SM2数字签名的有效性。
  • msg是要验证的消息
  • signHex是要验证的数字签名的十六进制字符串表示
  • publicKey是SM2公钥的十六进制字符串表示
  • options是一个可选的对象,可以包含以下属性:der(是否使用DER编码,默认为false)、hash(哈希算法,默认为sm3)、userId(用户ID,默认为空字符串)。如果数字签名有效,返回true;否则返回false。
  1. smCrypto.sm2.getPublicKeyFromPrivateKey(privateKey):从SM2私钥的十六进制字符串表示中获取对应的公钥的十六进制字符串表示。
  2. smCrypto.sm2.getPoint():获取SM2曲线上的一个点,返回该点的十六进制字符串表示。
  3. smCrypto.sm2.verifyPublicKey(publicKey):验证SM2公钥的有效性。publicKey是SM2公钥的十六进制字符串表示。如果公钥有效,返回true;否则返回false。
const smCrypto = require('sm-crypto');const { publicKey, privateKey } = smCrypto.sm2.generateKeyPairHex();// 生成密钥对
const plaintext = 'Hello, world!';// 明文数据const ciphertext = smCrypto.sm2.doEncrypt(plaintext, publicKey, 1);// 加密
const decryptedText = smCrypto.sm2.doDecrypt(ciphertext, privateKey, 1);// 解密console.log('加密原数据:', plaintext);
console.log('加密后:', ciphertext);
console.log('解密后:', decryptedText);const signature = smCrypto.sm2.doSignature(plaintext, privateKey);// 数字签名
const isValidSignature = smCrypto.sm2.doVerifySignature(plaintext, signature, publicKey);// 验证签名console.log('签名原数据:', plaintext);
console.log('数字签名:', signature);
console.log('签名验证结果:', isValidSignature);

这篇关于node之sm-crypto模块,浏览器和 Node.js 环境中SM国密算法库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/483992

相关文章

通过Docker容器部署Python环境的全流程

《通过Docker容器部署Python环境的全流程》在现代化开发流程中,Docker因其轻量化、环境隔离和跨平台一致性的特性,已成为部署Python应用的标准工具,本文将详细演示如何通过Docker容... 目录引言一、docker与python的协同优势二、核心步骤详解三、进阶配置技巧四、生产环境最佳实践

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

Three.js构建一个 3D 商品展示空间完整实战项目

《Three.js构建一个3D商品展示空间完整实战项目》Three.js是一个强大的JavaScript库,专用于在Web浏览器中创建3D图形,:本文主要介绍Three.js构建一个3D商品展... 目录引言项目核心技术1. 项目架构与资源组织2. 多模型切换、交互热点绑定3. 移动端适配与帧率优化4. 可

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

Nginx添加内置模块过程

《Nginx添加内置模块过程》文章指导如何检查并添加Nginx的with-http_gzip_static模块:确认该模块未默认安装后,需下载同版本源码重新编译,备份替换原有二进制文件,最后重启服务验... 目录1、查看Nginx已编辑的模块2、Nginx官网查看内置模块3、停止Nginx服务4、Nginx

python urllib模块使用操作方法

《pythonurllib模块使用操作方法》Python提供了多个库用于处理URL,常用的有urllib、requests和urlparse(Python3中为urllib.parse),下面是这些... 目录URL 处理库urllib 模块requests 库urlparse 和 urljoin编码和解码

创建springBoot模块没有目录结构的解决方案

《创建springBoot模块没有目录结构的解决方案》2023版IntelliJIDEA创建模块时可能出现目录结构识别错误,导致文件显示异常,解决方法为选择模块后点击确认,重新校准项目结构设置,确保源... 目录创建spChina编程ringBoot模块没有目录结构解决方案总结创建springBoot模块没有目录

Java 与 LibreOffice 集成开发指南(环境搭建及代码示例)

《Java与LibreOffice集成开发指南(环境搭建及代码示例)》本文介绍Java与LibreOffice的集成方法,涵盖环境配置、API调用、文档转换、UNO桥接及REST接口等技术,提供... 目录1. 引言2. 环境搭建2.1 安装 LibreOffice2.2 配置 Java 开发环境2.3 配