认识sm1,sm2,sm3,sm4以及如何在Node.js实现

概述

国密即国家密码局认定的国产密码算法。主要有SM1,SM2,SM3,SM4。密钥长度和分组长度均为128位。

国密算法是指国家密码管理局认定的一系列国产密码算法,包括SM1-SM9以及ZUC等。其中

SM1、SM4、SM5、SM6、SM7、SM8、ZUC等属于对称密码,

SM2、SM9等属于公钥密码 (非对称加密)

SM3属于单向散列函数。

目前我国主要使用公开的SM2、SM3、SM4作为商用密码算法。

其中SM1、SM7算法不公开,调用该算法时,需要通过加密芯片的接口进行调用

SM2是基于椭圆曲线的公钥密码算法,包括用于数字签名的SM2-1、用于密钥交换的SM2-2和用于公钥密码的SM2-3。

SM3是能够计算出256比特的散列值的单向散列函数,主要用于数字签名和消息认证码。

SM4是属于对称密码的一种分组密码算法,分组长度和密钥长度均为128比特。

国密算法从SM1-SM4分别实现了对称、非对称、摘要等算法功能,目前已普遍应用于日常工作生活中的各个方面,如工作中使用的VPN,金融业务中的资金流转、刷卡支付,以及门禁设施、身份认证等。

S1

SM1 算法是分组密码算法,分组长度为128位,密钥长度都为 128 比特,算法安全保密强度及相关软硬件实现性能与 AES 相当,算法不公开,仅以IP核的形式存在于芯片中。

采用该算法已经研制了系列芯片、智能IC卡、智能密码钥匙、加密卡、加密机等安全产品,广泛应用于电子政务、电子商务及国民经济的各个应用领域(包括国家政务通、警务通等重要领域)。

SM2

可以理解为国产RSA。非对称加密,基于ECC。该算法已公开。由于该算法基于ECC,故其签名速度与秘钥生成速度都快于RSA。

SM2椭圆曲线公钥密码算法是我国自主设计的公钥密码算法,包括SM2-1椭圆曲线数字签名算法,SM2-2椭圆曲线密钥交换协议,SM2-3椭圆曲线公钥加密算法,分别用于实现数字签名密钥协商和数据加密等功能。SM2算法与RSA算法不同的是,SM2算法是基于椭圆曲线上点群离散对数难题,相对于RSA算法,256位的SM2密码强度已经比2048位的RSA密码强度要高,但运算速度快于RSA。

SM3

可以理解为国产MD5。消息摘要。可以用MD5作为对比理解。该算法已公开。校验结果为256位。

SM4

可以理解为国产AES。无线局域网标准的分组数据算法。对称加密,密钥长度和分组长度均为128位。

Node.js中使用库来进行SM3加密的例子

方法一:

javascript 复制代码
const sm3 = require('sm-crypto-v2').sm3;

const message = 'pageNum=3&pageSize=15&timestamp=1721113234985&year=2023&key=HD7232D2AAAKA@978D8723H211?IER&6';
const hash = sm3(message);

console.log(`原始消息: ${message}`);
console.log(`SM3哈希值: ${hash}`);


// 原始消息: pageNum=3&pageSize=15&timestamp=1721113234985&year=2023&key=HD7232D2AAAKA@978D8723H211?IER&6
// SM3哈希值: e2ecadd5c7464b05d67c492bddf740979dd9ee4270d47a14fa054a5415f766a1

方法二:

javascript 复制代码
const { SM3 } = require('gm-crypto');

// 需要加密的原始数据
const originalData = 'pageNum=3&pageSize=15&timestamp=1721113234985&year=2023&key=HD7232D2AAAKA@978D8723H211?IER&6';

// 使用SM3算法进行加密
const encryptedData = SM3.digest(originalData, 'utf8', 'hex');


console.log(`原始消息: ${originalData}`);
console.log(`SM3哈希值: ${encryptedData}`); // 输出加密后的数据


// 原始消息: pageNum=3&pageSize=15&timestamp=1721113234985&year=2023&key=HD7232D2AAAKA@978D8723H211?IER&6
// SM3哈希值: e2ecadd5c7464b05d67c492bddf740979dd9ee4270d47a14fa054a5415f766a1

Node.js中使用库来进行SM4加密的例子

javascript 复制代码
const { SM4 } = require('gm-crypto');

// 定义密钥和明文
const key = '30062AFC48C0E7B5B0918851C0445A37'; // 32位十六进制数字
const plaintext = '1721115495190';

// ECB模式加密
const encryptedECB = SM4.encrypt(plaintext, key, {
  mode: SM4.constants.ECB,
  inputEncoding: 'utf8',
  outputEncoding: 'hex'
});

const decryptedECB = SM4.decrypt(encryptedECB, key, {
  mode: SM4.constants.ECB,
  inputEncoding: 'hex',
  outputEncoding: 'utf8'
});

console.log('ECB加密:', encryptedECB);
console.log('ECB解密:', decryptedECB === plaintext); // true

// CBC模式加密
const iv = '0123456789abcdeffedcba9876543210'; // 初始化向量
const encryptedCBC = SM4.encrypt(plaintext, key, {
  iv,
  mode: SM4.constants.CBC,
  inputEncoding: 'utf8',
  outputEncoding: 'hex'
});

const decryptedCBC = SM4.decrypt(encryptedCBC, key, {
  iv,
  mode: SM4.constants.CBC,
  inputEncoding: 'hex',
  outputEncoding: 'utf8'
});

console.log('CBC加密:', encryptedCBC);
console.log('CBC解密:', decryptedCBC === plaintext); // true
// ECB加密: 90a96cbc5aa9765e1103e2286f1e2079
// ECB解密: true                            
// CBC加密: fffdb6ca9f87e51ff1233b8ebaed7999
// CBC解密: true  
相关推荐
chao_78922 分钟前
二分查找篇——寻找旋转排序数组中的最小值【LeetCode】
python·线性代数·算法·leetcode·矩阵
金玉满堂@bj38 分钟前
PyCharm 中 Python 解释器的添加选项及作用
ide·python·pycharm
程序员三藏43 分钟前
如何使用Pytest进行测试?
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·pytest
随心点儿1 小时前
使用python 将多个docx文件合并为一个word
开发语言·python·多个word合并为一个
不学无术の码农1 小时前
《Effective Python》第十三章 测试与调试——使用 Mock 测试具有复杂依赖的代码
开发语言·python
sleepybear11131 小时前
在Ubuntu上从零开始编译并运行Home Assistant源码并集成HACS与小米开源的Ha Xiaomi Home
python·智能家居·小米·home assistant·米家·ha xiaomi home
纪伊路上盛名在2 小时前
(鱼书)深度学习入门1:python入门
人工智能·python·深度学习
夏末蝉未鸣012 小时前
python transformers笔记(TrainingArguments类)
python·自然语言处理·transformer
德育处主任Pro2 小时前
「py数据分析」04如何将 Python 爬取的数据保存为 CSV 文件
数据库·python·数据分析
咸鱼鲸2 小时前
【PyTorch】PyTorch中数据准备工作(AI生成)
人工智能·pytorch·python