微信小程序國密算法實現庫sm-crypto

國密算法是國家密碼局制定標準的一系列算法,主要有SM1,SM2,SM3,SM4,密鑰長度和分組長度均爲128位。其中:

  • SM1 爲對稱加密。其加密強度與AES相當。該算法不公開,調用該算法時,需要通過加密芯片的接口進行調用。
  • SM2爲非對稱加密,基於ECC。該算法已公開。由於該算法基於ECC,故其簽名速度與祕鑰生成速度都快於RSA。ECC 256位(SM2採用的就是ECC 256位的一種)安全強度比RSA 2048位高,但運算速度快於RSA。
  • SM3 消息摘要。可以用MD5作爲對比理解。該算法已公開。校驗結果爲256位。
  • SM4 無線局域網標準的分組數據算法。對稱加密,密鑰長度和分組長度均爲128位。

sm-crypto可以在微信小程序中實現SM2、SM3、SM4國密算法。

使用

安裝 sm-crypto

從小程序基礎庫版本 2.2.1 或以上、及開發者工具 1.02.1808300 或以上開始,小程序支持使用 npm 安裝第三方包。

npm install --save miniprogram-sm-crypto

sm2

獲取密鑰對

const sm2 = require('miniprogram-sm-crypto').sm2;

let keypair = sm2.generateKeyPairHex();

publicKey = keypair.publicKey; // 公鑰
privateKey = keypair.privateKey; // 私鑰

加密解密

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); // 解密結果

簽名驗籤

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

獲取橢圓曲線點

const sm2 = require('miniprogram-sm-crypto').sm2;

let poin = sm2.getPoint(); // 獲取一個橢圓曲線點,可在sm2簽名時傳入

sm3

const sm3 = require('miniprogram-sm-crypto').sm3;

let hashData = sm3('abc'); // 雜湊

sm4

加密

const sm4 = require('miniprogram-sm-crypto').sm4;
const key = [0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10];

let encryptData = sm4.encrypt([0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10], key); // 加密

解密

const sm4 = require('miniprogram-sm-crypto').sm4;
const key = [0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10];

let decryptData = sm4.decrypt([0x68, 0x1e, 0xdf, 0x34, 0xd2, 0x06, 0x96, 0x5e, 0x86, 0xb3, 0xe9, 0x4f, 0x53, 0x6e, 0x42, 0x46], key); // 解密

其他

sm-crypto項目地址:https://github.com/wechat-min...

【小程序推薦】百科知識詞典

圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章