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

相关文章

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

python运用requests模拟浏览器发送请求过程

《python运用requests模拟浏览器发送请求过程》模拟浏览器请求可选用requests处理静态内容,selenium应对动态页面,playwright支持高级自动化,设置代理和超时参数,根据需... 目录使用requests库模拟浏览器请求使用selenium自动化浏览器操作使用playwright

Python获取浏览器Cookies的四种方式小结

《Python获取浏览器Cookies的四种方式小结》在进行Web应用程序测试和开发时,获取浏览器Cookies是一项重要任务,本文我们介绍四种用Python获取浏览器Cookies的方式,具有一定的... 目录什么是 Cookie?1.使用Selenium库获取浏览器Cookies2.使用浏览器开发者工具

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤

Java JDK1.8 安装和环境配置教程详解

《JavaJDK1.8安装和环境配置教程详解》文章简要介绍了JDK1.8的安装流程,包括官网下载对应系统版本、安装时选择非系统盘路径、配置JAVA_HOME、CLASSPATH和Path环境变量,... 目录1.下载JDK2.安装JDK3.配置环境变量4.检验JDK官网下载地址:Java Downloads

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提

SQLite3 在嵌入式C环境中存储音频/视频文件的最优方案

《SQLite3在嵌入式C环境中存储音频/视频文件的最优方案》本文探讨了SQLite3在嵌入式C环境中存储音视频文件的优化方案,推荐采用文件路径存储结合元数据管理,兼顾效率与资源限制,小文件可使用B... 目录SQLite3 在嵌入式C环境中存储音频/视频文件的专业方案一、存储策略选择1. 直接存储 vs