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

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);

相关文章:

  • 【华为OD题库-081】最长的元音子串长度-Java
  • Jenkins:持续集成与持续交付的自动化利器
  • [Verilog]用Verilog实现串并转换/并串装换
  • c语言插入排序及希尔排序详解
  • Spring Boot 常用注解分类
  • 开源框架Apache NiFi调研
  • NSSCTF Crypto靶场练习,21-30wp
  • Springboot入门篇
  • 自动数据增广论文笔记 | AutoAugment: Learning Augmentation Strategies from Data
  • Lua字符串(包含任意字符,如中文)任意位置截取
  • 新增模板中心和系统设置模块,支持飞书平台对接,DataEase开源数据可视化分析平台v2.1.0发布
  • Flink SQL: 高效解析 Kafka 数据并存储为 Parquet 至 HDFS
  • uni-app 微信小程序之好看的ui登录页面(四)
  • Kafka使用总结
  • 一、微前端目标、前端架构的前生今世、微前端架构优势和劣势、软件设计原则与分层
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • Intervention/image 图片处理扩展包的安装和使用
  • Java小白进阶笔记(3)-初级面向对象
  • leetcode386. Lexicographical Numbers
  • MySQL QA
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • Sublime Text 2/3 绑定Eclipse快捷键
  • tensorflow学习笔记3——MNIST应用篇
  • XForms - 更强大的Form
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 代理模式
  • 使用 Docker 部署 Spring Boot项目
  • 使用agvtool更改app version/build
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 由插件封装引出的一丢丢思考
  • 智能网联汽车信息安全
  • nb
  • # 透过事物看本质的能力怎么培养?
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (Ruby)Ubuntu12.04安装Rails环境
  • (SpringBoot)第二章:Spring创建和使用
  • (ZT)一个美国文科博士的YardLife
  • (补)B+树一些思想
  • (二十四)Flask之flask-session组件
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (十五)使用Nexus创建Maven私服
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (转)人的集合论——移山之道
  • ***原理与防范
  • .NET : 在VS2008中计算代码度量值
  • .net core 连接数据库,通过数据库生成Modell
  • /3GB和/USERVA开关
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思