更新记录

2.0.0(2024-12-23) 下载此版本

api全部更改为驼峰命名,整体逻辑没有改变,更新请注意。

增加了bc密文转kona密文。

1.0.8(2023-12-13) 下载此版本

增加了sm2与bc库的适配,其他库的适配方案与bc适配其他的方案相同,去除密文04即可

1.0.7(2023-12-13) 下载此版本

更新文档

查看更多

平台兼容性

uni-app

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
- - - - 4.4 × -
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 快应用-华为 快应用-联盟
- - - - - - - - - - -

uni-app x

Chrome Safari Android iOS 鸿蒙 微信小程序
- - 5.0 × - -

bunny-kona-crypto

开发文档

UTS 语法 UTS API插件 UTS 组件插件 Hello UTS

本插件基于 kona-crypto 1.0.10

需要写好引入代码后再打包自定义基座,才会被正确打包,否则将被hb摇掉。

市面上有很多 sm 算法的实现,他们的 ky、iv、密文编码、填充格式、数据转换格式等实现有很多种方式,有些尽管其格式保持一致也可能存在不能相互加解密的情况。

所以如果有涉及到密文传输、跨设备加解密,请尽量使用相同的加解密工具或者自行测试不同库之间的兼容性。

本插件 sm4 中,密文、iv、key 均是 hex 格式。

本插件开发初衷是为端到端加密 im 工作,不考虑与其他 sm 加解密库兼容。不过可以修改源码使其与你的业务逻辑兼容。

本插件与 js版、java版(js封装)的 sm-srypto 兼容。

bouncycastle 兼容。

按需导入类、方法

复制代码import { TencentKonaInit, Sm2, Sm2Util, Sm3, Sm4Def, Sm4Gcm, Sm4Ecb } from "@/uni_modules/sm-crypto"

开始前,全局注册,直接执行即可。

复制代码TencentKonaInit()

SM2

复制代码//传入公私钥(16进制字符串),生成一个sm2加密对象
const sm2 = new Sm2("044291b381a039a8d7d02d7272d2d7c78a30d33e3eeaa0b509bf77d2376582ab2d573730e6bfe9a53bad53f53ac1a85d9c11050931f04bc8b3afc04144d5a6f9be", "5aa03412c3051e1d4cf9d19cfbeeec70c28f388c9f82747cc912096c9cd44bea")

//传入空字符串,将会自动生成一个拥有新公私钥的sm2对象
const sm2 = new Sm2("","")

//获取公私钥,将得到16进制字符串
console.log("sm2 pubkey", sm2.publicKey)
console.log("sm2 prikey", sm2.privateKey)

//使用公钥加密字符串,将得到16进制密文字符串
const sm2_en_str = sm2.encryptPubKey(sm2_msg_str, "BC")
console.log("sm2 公钥加密测试1 04开头的BC密文 C1||C3||C2", sm2_en_str)

const sm2_en_str = sm2.encryptPubKey(sm2_msg_str, "KONA")
console.log("sm2 公钥加密测试1 KONA 的密文 C1||C3||C2,与其他库不兼容", sm2_en_str)

//使用私钥解密,注意请传入 KONA 密文。将得到明文(UTF_8编码)
console.log("sm2 私钥解密测试1", sm2.decryptPriKey(sm2_en_str))

//KONA 密文转换 BC 密文
//如希望使用别的库解密,请删除开头04。注意kona不能直接解密bc密文,需要转换成kona密文
const bcC1C2C3 = SM2_UTIL.ctxtToBcC1C2C3(sm2_en_str)
const bcC1C3C2 = SM2_UTIL.ctxtToBcC1C3C2(sm2_en_str)

//BC密文转KONA密文,第二个参数为传入的bc密文格式,可选 C1C2C3
const toKonaCtxt = Sm2Util.bcCtextToKonaC1C3C2(bcCtxt, 'C1C3C2')

//kona密文签名,第二个参数需要传入空字符串,将使用sm2默认id进行签名,自定义id还没有适配
const sm2_ver : string = sm2.signature(sm2_en_str, "")
console.log("sm2 消息签名测试1", sm2_ver)
//验签,返回一个布尔值
console.log("sm2 消息签名校验 测试1", sm2.signVerified(sm2_ver, sm2_en_str))

SM3

复制代码const sm3 = new Sm3()
//传入 byte[] 
sm3.checkDigest("pppppppp".toByteArray())
sm3.checkDigest("aaaaaNI好".toByteArray())
console.log("消息摘要", sm3.getDigest());

SM4

sm4的密文有多种格式,具体如下

  • SM4/CBC/NoPadding:使用CBC分组操作模式,不使用填充。明文或密文的长度必须是16字节的整数倍。
  • SM4/CBC/PKCS7Padding:使用CBC分组操作模式,且使用PKCS#7填充。明文或密文的长度可以不是16字节的整数倍。
  • SM4/CTR/NoPadding:使用CTR分组操作模式,不使用填充。明文或密文的长度可以不是16字节的整数倍。
  • SM4/ECB/NoPadding:使用ECB分组操作模式,不使用填充。明文或密文的长度必须是16字节的整数倍。
  • SM4/ECB/PKCS7Padding:使用ECB分组操作模式,且使用PKCS#7填充。明文或密文的长度可以不是16字节的整数倍。
  • SM4/GCM/NoPadding:使用GCM分组操作模式,不使用填充。明文或密文的长度可以不是16字节的整数倍。
SM4 ECB
复制代码// SM4 ECB
type SM4_ECB_TYPE = "SM4/ECB/PKCS7Padding" | "SM4/ECB/NoPadding"

//第一个参数 key任意长度的hex字符串
//第二个参数由 SM4_ECB_TYPE 进行限制
//自动生成一个hex key
const sm4_ecb = new Sm4Ecb("", "SM4/ECB/PKCS7Padding")

//亦可以使用任意长度的 hex key进行初始化
const sm4_ecb = new Sm4Ecb("aaa", "SM4/ECB/PKCS7Padding")

const str_sm4_ecb : string = sm4_ecb.encrypt("你好呀!@@@@@@@ hkasjdlfjas;dfj 呵呵哈哈哈成功了啊啊啊啊")

//获取hex字符串加密key
console.log("sm4 ECB key", sm4_ecb.key)
//16进制密文字符串
console.log("sm4 ECB 加密", str_sm4_ecb)
//明文
console.log("sm4 ECB 解密", sm4_ecb.decrypt(str_sm4_ecb))
SM4 CBC\CTR
复制代码//第一个参数:iv 必须是16bit的16进制字符串(hex),传入空字符串将自动生成
//第二个参数:key 任意长度hex字符串,传入空字符串将自动生成
//第三个参数:可选 "SM4/CBC/PKCS7Padding" | "SM4/CTR/NoPadding"
const sm4_def = new Sm4Def("000102030405060708090A0B0C0D0E0e", "", "SM4/CTR/NoPadding")
const sm4_def = new Sm4Def("", "", "SM4/CTR/NoPadding")

//获取普通字符串key
console.log("sm4 def key", sm4_def.key)

//获取hex字符串iv
console.log("sm4 def iv", sm4_def.iv)

const str : string = sm4_def.encrypt("你好呀!@@@@@@@ hkasjdlfjas;dfj 呵呵哈哈哈成功了啊啊啊啊")
//hex字符串密文
console.log("加密", str)
//明文
console.log("解密", sm4_def.decrypt(str))
SM4 GCM
复制代码//第一个参数 iv 12bit 的16进制字符串
//第二个参数 key 16bit 的hex字符串
const sm4_gcm = new Sm4Gcm("6F7862454952327634724858", "9iRgDypeRHtIrDar")

//hex字符串
console.log("sm4 def key", sm4_gcm.key)
//hex字符串
console.log("sm4 def iv", sm4_gcm.iv)
const cStr = sm4_gcm.encrypt("hhhhhh呵呵哈哈哈")
//hex字符串密文
console.log("GCM 加密测试", cStr)
//明文
console.log("GCM 解密测试", sm4_gcm.decrypt(cStr))

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

许可协议

MIT协议
290***@qq.com

2024-12-02

sm2 BC怎么转换成kona密文?

changQing1 2024-12-23

//KONA 密文转换 BC 密文 const bcC1C2C3 = SM2_UTIL.cctxtToBcC1C2C3(sm2_en_str) const bcC1C3C2 = SM2_UTIL.cctxtToBcC1C3C2(sm2_en_str)

changQing1 2024-12-24

文档已补齐

m13***@163.com

2024-11-26

微风需要竹林

2024-05-13

按需引入const SM4_ECB = SM4_ECB(this.deviceKey, text)报错SM4_ECB不是一个function

changQing1 2024-05-16

是不是没导,或者从新打包之类的问题

266***@qq.com

2024-02-20

我用的最新版本,VUE2,按照文档来的,但还是报文件查找失败,uni_modules/sm-crypto

changQing1 2024-02-20

尝试最新的hb版本打包基座,并且尝试切换vue3(虽然官方说通用,但我没实际测试过)

超级无敌APP

2024-02-04

你好,我有点没搞懂,其他的插件我是传一个publicKey,在传登录密码,然后获取到加密的一个密码,如果用您这个,我应该调用哪个方法?

超级无敌APP 2024-02-04

uni_modules/sm-crypto is not found

changQing1 2024-02-19

找不到包看文档第一行。加密的话看你需要什么方式,自行选择上面的示例代码。

927***@qq.com

2023-12-11

sm3需要如何使用呢?

changQing1 2023-12-11

sm3的代码我并未上传。着急使用可以查看自行适配sm3,或等待一天时间我将其上传

927***@qq.com 2023-12-11

ok,代码使用上不急,我们在尝试将uniapp项目慢慢搬移到uniapp-x,在针对uniapp项目内的各种方法寻找uniapp-x的解决方案,目前大头就是sm4ECB和sm4CBC加解密,再是sm3加签,但是因为只是尝试搬移,所以时间上并不急切。

使用中有什么不明白的地方,就向插件作者提问吧~ 我要提问