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

相关文章

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

Nginx搭建前端本地预览环境的完整步骤教学

《Nginx搭建前端本地预览环境的完整步骤教学》这篇文章主要为大家详细介绍了Nginx搭建前端本地预览环境的完整步骤教学,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录项目目录结构核心配置文件:nginx.conf脚本化操作:nginx.shnpm 脚本集成总结:对前端的意义很多

深入理解Mysql OnlineDDL的算法

《深入理解MysqlOnlineDDL的算法》本文主要介绍了讲解MysqlOnlineDDL的算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小... 目录一、Online DDL 是什么?二、Online DDL 的三种主要算法2.1COPY(复制法)

Python sys模块的使用及说明

《Pythonsys模块的使用及说明》Pythonsys模块是核心工具,用于解释器交互与运行时控制,涵盖命令行参数处理、路径修改、强制退出、I/O重定向、系统信息获取等功能,适用于脚本开发与调试,需... 目录python sys 模块详解常用功能与代码示例获取命令行参数修改模块搜索路径强制退出程序标准输入

Python pickle模块的使用指南

《Pythonpickle模块的使用指南》Pythonpickle模块用于对象序列化与反序列化,支持dump/load方法及自定义类,需注意安全风险,建议在受控环境中使用,适用于模型持久化、缓存及跨... 目录python pickle 模块详解基本序列化与反序列化直接序列化为字节流自定义对象的序列化安全注

JS纯前端实现浏览器语音播报、朗读功能的完整代码

《JS纯前端实现浏览器语音播报、朗读功能的完整代码》在现代互联网的发展中,语音技术正逐渐成为改变用户体验的重要一环,下面:本文主要介绍JS纯前端实现浏览器语音播报、朗读功能的相关资料,文中通过代码... 目录一、朗读单条文本:① 语音自选参数,按钮控制语音:② 效果图:二、朗读多条文本:① 语音有默认值:②

在Node.js中使用.env文件管理环境变量的全过程

《在Node.js中使用.env文件管理环境变量的全过程》Node.js应用程序通常依赖于环境变量来管理敏感信息或配置设置,.env文件已经成为一种流行的本地管理这些变量的方法,本文将探讨.env文件... 目录引言为什么使php用 .env 文件 ?如何在 Node.js 中使用 .env 文件最佳实践引

python pymodbus模块的具体使用

《pythonpymodbus模块的具体使用》pymodbus是一个Python实现的Modbus协议库,支持TCP和RTU通信模式,支持读写线圈、离散输入、保持寄存器等数据类型,具有一定的参考价值... 目录一、详解1、 基础概念2、核心功能3、安装与设置4、使用示例5、 高级特性6、注意事项二、代码示例

使用Node.js和PostgreSQL构建数据库应用

《使用Node.js和PostgreSQL构建数据库应用》PostgreSQL是一个功能强大的开源关系型数据库,而Node.js是构建高效网络应用的理想平台,结合这两个技术,我们可以创建出色的数据驱动... 目录初始化项目与安装依赖建立数据库连接执行CRUD操作查询数据插入数据更新数据删除数据完整示例与最佳

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

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