# sm-crypto
小程序 js 库。国密算法 sm2、sm3 和 sm4 的实现。
> 使用此组件需要依赖小程序基础库 2.2.1 以上版本,同时依赖开发者工具的 npm 构建。具体详情可查阅[官方 npm 文档](https://developers.weixin.qq.com/miniprogram/dev/devtools/npm.html)。
## 安装
```bash
npm install --save miniprogram-sm-crypto
```
## sm2
### 获取密钥对
```js
const sm2 = require('miniprogram-sm-crypto').sm2
let keypair = sm2.generateKeyPairHex()
publicKey = keypair.publicKey // 公钥
privateKey = keypair.privateKey // 私钥
// 默认生成公钥 130 位太长,可以压缩公钥到 66 位
const compressedPublicKey = sm2.compressPublicKeyHex(publicKey) // compressedPublicKey 和 publicKey 等价
sm2.comparePublicKeyHex(publicKey, compressedPublicKey) // 判断公钥是否等价
// 自定义随机数,参数会直接透传给 jsbn 库的 BigInteger 构造器
// 注意:开发者使用自定义随机数,需要自行确保传入的随机数符合密码学安全
let keypair2 = sm2.generateKeyPairHex('123123123123123')
let keypair3 = sm2.generateKeyPairHex(256, SecureRandom)
let verifyResult = sm2.verifyPublicKey(publicKey) // 验证公钥
verifyResult = sm2.verifyPublicKey(compressedPublicKey) // 验证公钥
```
### 加密解密
```js
const sm2 = require('miniprogram-sm-crypto').sm2
const cipherMode = 1 // 1 - C1C3C2,0 - C1C2C3,默认为1
let encryptData = sm2.doEncrypt(msgString, publicKey, cipherMode) // 加密结果
let decryptData = sm2.doDecrypt(encryptData, privateKey, cipherMode) // 解密结果
encryptData = sm2.doEncrypt(msgArray, publicKey, cipherMode) // 加密结果,输入数组
decryptData = sm2.doDecrypt(encryptData, privateKey, cipherMode, {output: 'array'}) // 解密结果,输出数组
```
### 签名验签
> ps:理论上来说,只做纯签名是最快的。
```js
const sm2 = require('miniprogram-sm-crypto').sm2
// 纯签名 + 生成椭圆曲线点
let sigValueHex = sm2.doSignature(msg, privateKey) // 签名
let verifyResult = sm2.doVerifySignature(msg, sigValueHex, publicKey) // 验签结果
// 纯签名
let sigValueHex2 = sm2.doSignature(msg, privateKey, {
pointPool: [sm2.getPoint(), sm2.getPoint(), sm2.getPoint(), sm2.getPoint()], // 传入事先已生成好的椭圆曲线点,可加快签名速度
}) // 签名
let verifyResult2 = sm2.doVerifySignature(msg, sigValueHex2, publicKey) // 验签结果
// 纯签名 + 生成椭圆曲线点 + der编解码
let sigValueHex3 = sm2.doSignature(msg, privateKey, {
der: true,
}) // 签名
let verifyResult3 = sm2.doVerifySignature(msg, sigValueHex3, publicKey, {
der: true,
}) // 验签结果
// 纯签名 + 生成椭圆曲线点 + sm3杂凑
let sigValueHex4 = sm2.doSignature(msg, privateKey, {
hash: true,
}) // 签名
let verifyResult4 = sm2.doVerifySignature(msg, sigValueHex4, publicKey, {
hash: true,
}) // 验签结果
// 纯签名 + 生成椭圆曲线点 + sm3杂凑(不做公钥推导)
let sigValueHex5 = sm2.doSignature(msg, privateKey, {
hash: true,
publicKey, // 传入公钥的话,可以去掉sm3杂凑中推导公钥的过程,速度会比纯签名 + 生成椭圆曲线点 + sm3杂凑快
})
let verifyResult5 = sm2.doVerifySignature(msg, sigValueHex5, publicKey, {
hash: true,
publicKey,
})
// 纯签名 + 生成椭圆曲线点 + sm3杂凑 + 不做公钥推 + 添加 userId(长度小于 8192)
// 默认 userId 值为 1234567812345678
let sigValueHex6 = sm2.doSignature(msgString, privateKey, {
hash: true,
publicKey,
userId: 'testUserId',
})
let verifyResult6 = sm2.doVerifySignature(msgString, sigValueHex6, publicKey, {
hash: true,
userId: 'testUserId',
})
```
### 获取椭圆曲线点
```js
const sm2 = require('miniprogram-sm-crypto').sm2
let point = sm2.getPoint() // 获取一个椭圆曲线点,可在sm2签名时传入
```
## sm3
```js
const sm3 = require('miniprogram-sm-crypto').sm3
let hashData = sm3('abc') // 杂凑
// hmac
hashData = sm3('abc', {
key: 'daac25c1512fe50f79b0e4526b93f5c0e1460cef40b6dd44af13caec62e8c60e0d885f3c6d6fb51e530889e6fd4ac743a6d332e68a0f2a3923f42585dceb93e9', // 要求为 16 进制串或字节数组
})
```
## sm4
### 加密
```js
const sm4 = require('miniprogram-sm-crypto').sm4
const msg = 'hello world! 我是 juneandgreen.' // 可以为 utf8 串或字节数组
const key = '0123456789abcdeffedcba9876543210' // 可以为 16 进制串或字节数组,要求为 128 比特
let encryptData = sm4.encrypt(msg, key) // 加密,默认输出 16 进制字符串,默认使用 pkcs#7 填充(传 pkcs#5 也会走 pkcs#7 填充)
let encryptData = sm4.encrypt(msg, key, {padding: 'none'}) // 加密,不使用 padding
let encryptData = sm4.encrypt(msg, key, {padding: 'none', output: 'array'}) // 加密,不使用 padding,输出为字节数组
let encryptData = sm4.encrypt(msg, key, {mode: 'cbc', iv: 'fedcba98765432100123456789abcdef'}) // 加密,cbc 模式
```
### 解密
```js
const sm4 = require('miniprogram-sm-crypto').sm4
const encryptData = '0e395deb10f6e8a17e17823e1fd9bd98a1bff1df508b5b8a1efb79ec633d1bb129432ac1b74972dbe97bab04f024e89c' // 可以为 16 进制串或字节数组
const key = '0123456789abcdeffedcba9876543210' // 可以为 16 进制串或字节数组,要求为 128 比特
let decryptData = sm4.decrypt(encryptData, key) // 解密,默认输出 utf8 字符串,默认使用 pkcs#7 填充(传 pkcs#5 也会走 pkcs#7 填充)
let decryptData = sm4.decrypt(encryptData, key, {padding: 'none'}) // 解密,不使用 padding
let decryptData = sm4.decrypt(encryptData, key, {padding: 'none', output: 'array'}) // 解密,不使用 padding,输出为字节数组
let decryptData = sm4.decrypt(encryptData, key, {mode: 'cbc', iv: 'fedcba98765432100123456789abcdef'}) // 解密,cbc 模式
```
## 协议
MIT
没有合适的资源?快使用搜索试试~ 我知道了~
收起资源包目录
chatgpt微信聊天小程序。java编写服务器,实现chatgpt接口的调用 (312个子文件)
.babelrc 202B
example.html 222B
ChatModel.java 7KB
ChatWebSocketServer.java 4KB
UserController.java 2KB
ChatGptConfig.java 2KB
Test.java 1KB
R.java 838B
ChatRequestParameter.java 531B
UserLogServiceImpl.java 512B
UserLog.java 499B
UserServiceImpl.java 496B
WebSocketConfig.java 496B
ChatResponseParameter.java 402B
User.java 379B
Choice.java 336B
App.java 329B
ChatMessage.java 286B
Delta.java 279B
UserMapper.java 256B
UserLogMapper.java 227B
UserLogService.java 177B
UserService.java 176B
Hello.java 117B
壁纸6.jpg 7.01MB
壁纸7.jpg 3.68MB
壁纸5.jpg 1.38MB
壁纸8.jpg 882KB
好看的壁纸.jpg 827KB
壁纸3.jpg 316KB
icon.js 204KB
icon.js 204KB
index.js 50KB
index.js 50KB
index.js 43KB
index.js 41KB
index.js 11KB
form.js 9KB
form.js 9KB
ec.js 8KB
index.js 7KB
chat.js 5KB
utils.js 5KB
sm3.js 4KB
asn1.js 4KB
uploader.js 3KB
uploader.js 3KB
index.js 3KB
home.js 2KB
login.js 2KB
.eslintrc.js 2KB
checkbox-group.js 2KB
checkbox-group.js 2KB
index.js 2KB
searchbar.js 2KB
searchbar.js 2KB
slideview.js 1KB
slideview.js 1KB
0.js 1KB
0.js 1KB
navigation-bar.js 1KB
navigation-bar.js 1KB
cell.js 1KB
cell.js 1KB
actionsheet.js 1KB
actionsheet.js 1KB
gallery.js 1KB
gallery.js 1KB
toptips.js 1KB
toptips.js 1KB
dialog.js 1KB
dialog.js 1KB
half-screen-dialog.js 1KB
half-screen-dialog.js 1KB
cells.js 1KB
cells.js 1KB
checkbox.js 1KB
checkbox.js 1KB
gulpfile.js 840B
grids.js 757B
grids.js 757B
form-page.js 633B
form-page.js 633B
.eslintrc.js 587B
tabbar.js 543B
tabbar.js 543B
util.js 460B
loading.js 422B
msg.js 422B
loading.js 422B
msg.js 422B
app.js 364B
badge.js 319B
badge.js 319B
index.js 223B
index.js 223B
example.js 137B
index.js 114B
es6-import.js 64B
package.json 4KB
共 312 条
- 1
- 2
- 3
- 4
资源推荐
资源预览
资源评论
155 浏览量
187 浏览量
5星 · 资源好评率100%
2024-11-25 上传
157 浏览量
195 浏览量
186 浏览量
5星 · 资源好评率100%
142 浏览量
128 浏览量
175 浏览量
2023-08-22 上传
5星 · 资源好评率100%
2023-09-03 上传
5星 · 资源好评率100%
125 浏览量
108 浏览量
130 浏览量
112 浏览量
2023-04-15 上传
2024-03-24 上传
2024-11-30 上传
2024-02-21 上传
2024-09-30 上传
118 浏览量
2023-04-21 上传
资源评论
极致人生-010
- 粉丝: 4436
- 资源: 3089
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 亿阳融智-和利时—2002年4季度个人绩效计划--培训助理.doc
- 亿阳融智-和利时—7系统部培训室主管职位说明书V1.0.doc
- 亿阳融智-和利时—7系统部培训室负责人职位说明书.doc
- 离线版 LVGL-font-conv,网页版,LVGL字库转换
- 亿阳融智-和利时—工业自动化事业部系统部个人绩效计划(2002年9月)(培训室).doc
- 亿阳融智-和利时—项目组培训需求.doc
- 亿阳融智-和利时—和利时公司培训合同.doc
- 亿阳融智-和利时—人员培训汇总.xls
- 亿阳融智-和利时—人力资源部培训主管.doc
- 基于TableSQL API的轻量级Flink CDC应用详细文档+全部资料.zip
- 基于hdfs、iceberg、spark、flink做的一个iceberg管理客户端详细文档+全部资料.zip
- 远卓—兰桥医学科技—流程(技术部-培训).doc
- 远卓—兰桥医学科技—流程(技术部-新用户培训四级流程).doc
- 远卓—兰桥医学科技—流程(技术部-新用户培训前准备四级流程).doc
- 远卓—兰桥医学科技—培训制度.doc
- 基于logminer,flink的oracle-cdc实时同步功能详细文档+全部资料.zip
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功