@muguilin/gm-crypto
v1.0.4
Published
基于 gm-crypto 密码行业标准化委员会(SM4)和 big-integer 大整数处理 的前后端API数据传输加解密处理模块!
Downloads
34
Maintainers
Readme
@muguilin/gm-crypto
基于 gm-crypto 密码行业标准化委员会(SM4)和 big-integer 大整数处理 的前后端API数据传输 加解密处理模块!
🏡下载安装:
# 使用npm命令下载安装
$ npm i @muguilin/gm-crypto
# 使用yarn命令下载安装
$ yarn add @muguilin/gm-crypto
🚀使用实例:
基于SM4算法简单的数据加密与解密
import { useMS4 } from '@muguilin/gm-crypto'; // 加解密的密钥(32位十六进制数字的任意字符串)【注:前后端要一致,一般由后端提供】! const key = '0123456789abcdeffedcba9876543210'; // 实例化SM4 const { encrypt, decrypt } = useMS4(key); // 加密 const enText = encrypt("要加密的数据"); console.log("加密后的数据:", enText); // 解密 const deText = decrypt(enText); // enText要解密的数据 console.log("解密后的数据:", deText);
基于DH(g、p、server_number) 动态生成key的数据加密与解密
import { SMT } from '@muguilin/gm-crypto'; // g(底数)用于生加成加解密参数key的计算,一般由后端提供(后端[服务端]如 PHP 使用dh+sm4方式进行加解密的话,还需要在PHP环境中配置GMP扩展)! const g = "1038272227580712591710520727608303818673911356163915961405717611171367511230688128700450068148956934708940258418872350885653640473176181192540522651506533255838991048827665976480700225624160024731079722170677370103248727024197708983088571412106375460189255864958701180711121568396017340770855322080575567550949325637777197678655333725734029203250985055060177328699461276182647203930121935504198892010036307848034646028067498289207605424628656754571390515444839264715026166394370979911525156696104494751352224616674298363558921419967181358293514909040869097373019600391108502923597645594040124139849905333261652846776468847455483680198441111660808929037682589885319184876688894899925187095339339054250753607810487010089536185759207920565152930466661764879677531227388969330095782856332361506071119133144295802630500264321699986300934321940810255469010859954588899621259906630420193397923160825361087745167481790971187813341612"; // p(模数)用于生加成加解密参数key的计算,一般由后端提供! const p = "5809605995369958062791915965639201402176612226902900533702900882779736177890990861472094774477339581147373410185646378328043729800750470098210924487866935059164371588168047540943981644516632755067501626434556398193186628990071248660819361205119793693985433297036118232914410171876807536457391277857011849897410207519105333355801121109356897459426271845471397952675959440793493071628394122780510124618488232602464649876850458861245784240929258426287699705312584509625419513463605155428017165714465363094021609290561084025893662561222573202082865797821865270991145082200656978177192827024538990239969175546190770645685893438011714430426409338676314743571154537142031573004276428701433036381801705308659830751190352946025482059931306571004727362479688415574702596946457770284148435989129632853918392117997472632693078113129886487399347796982772784615865232621289656944284216824611318709764535152507354116344703769998514148343807"; // server_number用于生加成加解密参数key的计算,一般由后端提供! const server_number = "533002428294336616873774952106421502149652599458945478609579456633825175435591572213461924245684506823740277481160893127743825132048523201730626138802577877838910882706326333379360061600687327466758774476542895981134200289204422404617548945391801177150646411253838195041563877632692881701550741428542152830253153473327351279494487904039611209303291596783449362822656199480718368618032509368200940760413110348306689538262319224500875234864333495532671661427579382966483603022011800839509503834308172324313333943072078504221645391025883372716069801252155477584045884503119483337385532431165994014594769775689105920235973259687204048804435021223022934701279317419628464758137141877321487918330568586022286653201801159779446145360351977841762477378726595709936168629569734722619448959387741990885057768232228982299736696596473381071538379147381077944582515375238879189105298215519272231254953533071137209214928296924637340551477"; // 加密 const { key = '', result = '', client_number = '' } = SMT.encrypt("要加密的文本数据", g, p, server_number); console.log("加密后的数据:", result); // 解密 const { result = '' } = SMT.decrypt("要解密的数据", key); // result 要解密的数据 console.log("解密后的数据:", result);
基于DH(g、p、server_number) 动态生成key的数据解密
import { SMT } from '@muguilin/gm-crypto'; // g(底数)用于生加成加解密参数key的计算,一般由后端提供(后端[服务端]如 PHP 使用dh+sm4方式进行加解密的话,还需要在PHP环境中配置GMP扩展)! const g = "1038272227580712591710520727608303818673911356163915961405717611171367511230688128700450068148956934708940258418872350885653640473176181192540522651506533255838991048827665976480700225624160024731079722170677370103248727024197708983088571412106375460189255864958701180711121568396017340770855322080575567550949325637777197678655333725734029203250985055060177328699461276182647203930121935504198892010036307848034646028067498289207605424628656754571390515444839264715026166394370979911525156696104494751352224616674298363558921419967181358293514909040869097373019600391108502923597645594040124139849905333261652846776468847455483680198441111660808929037682589885319184876688894899925187095339339054250753607810487010089536185759207920565152930466661764879677531227388969330095782856332361506071119133144295802630500264321699986300934321940810255469010859954588899621259906630420193397923160825361087745167481790971187813341612"; // p(模数)用于生加成加解密参数key的计算,一般由后端提供! const p = "5809605995369958062791915965639201402176612226902900533702900882779736177890990861472094774477339581147373410185646378328043729800750470098210924487866935059164371588168047540943981644516632755067501626434556398193186628990071248660819361205119793693985433297036118232914410171876807536457391277857011849897410207519105333355801121109356897459426271845471397952675959440793493071628394122780510124618488232602464649876850458861245784240929258426287699705312584509625419513463605155428017165714465363094021609290561084025893662561222573202082865797821865270991145082200656978177192827024538990239969175546190770645685893438011714430426409338676314743571154537142031573004276428701433036381801705308659830751190352946025482059931306571004727362479688415574702596946457770284148435989129632853918392117997472632693078113129886487399347796982772784615865232621289656944284216824611318709764535152507354116344703769998514148343807"; // server_number用于生加成加解密参数key的计算,一般由后端提供! const server_number = "533002428294336616873774952106421502149652599458945478609579456633825175435591572213461924245684506823740277481160893127743825132048523201730626138802577877838910882706326333379360061600687327466758774476542895981134200289204422404617548945391801177150646411253838195041563877632692881701550741428542152830253153473327351279494487904039611209303291596783449362822656199480718368618032509368200940760413110348306689538262319224500875234864333495532671661427579382966483603022011800839509503834308172324313333943072078504221645391025883372716069801252155477584045884503119483337385532431165994014594769775689105920235973259687204048804435021223022934701279317419628464758137141877321487918330568586022286653201801159779446145360351977841762477378726595709936168629569734722619448959387741990885057768232228982299736696596473381071538379147381077944582515375238879189105298215519272231254953533071137209214928296924637340551477"; // 加密 const { key = '', bigKey = '', client_number = '' } = SMT.getDH(g, p, server_number); console.log("加密后的数据:", result); // 解密 const { result = '' } = SMT.decrypt("要解密的数据", key); console.log("解密后的数据:", result);
UTF8字节 - 字符串 相互转换
import { Utf8 } from '@muguilin/gm-crypto'; const utf8 = Utf8.encode("要转换的文本数据"); console.log("转换后的utf8字节数据:", utf8); const str = Utf8.decode(utf8); console.log("utf8字节数据 转 字符串:", str);
十六进制 - 字符串 相互转换
import { Hex } from '@muguilin/gm-crypto'; const hex = Hex.encode("要转换的文本数据"); console.log("转换后的16进制数据:", hex); const str = Hex.decode(hex); console.log("16进制 转 字符串:", str);
Base64 - 字符串 相互转换
import { Base64 } from '@muguilin/gm-crypto'; const b64 = Base64.encode("要转换的文本数据"); console.log("转换后的Base64数据:", b64); const str = Base64.decode(b64); console.log("Base64 转 字符串:", str);
获取Web浏览器地址栏URL中?后面的参数
import { getQuery } from '@muguilin/gm-crypto'; const uid = getQuery("user_id", globalThis.location.search); // globalThis.location.search 非必传参数 console.log("从Web浏览器URL中获取到的用户ID:", uid);
📢关于big-integer模块:保留了bigInt的原有用法:
BigInteger.js 是 Javascript 的任意长度整数库,它允许对无限大小的整数,去进行算术运算,尽管在有内存和时间限制的情况下。
Npm地址:big-integer
import { bigInt } from '@muguilin/gm-crypto';
let zero = bigInt();
let ninetyThree = bigInt(93);
let largeNumber = bigInt("75643564363473453456342378564387956906736546456235345");
let googol = bigInt("1e100");
let bigNumber = bigInt(largeNumber);
let maximumByte = bigInt("FF", 16);
let fiftyFiveGoogol = bigInt("<55>0", googol);
📢关于gm-crypto模块:保留了SM2、SM3、SM4的原有用法:
密码行业标准化委员会,GM/T系列(sm2、sm3、sm4)加密算法的纯JavaScript实现,与Node.js和浏览器兼容,支持类型声明文件。
Npm地址:gm-crypto
- SM2 基于椭圆曲线的公钥密码算法。
import { SM2, SM3, SM4 } from '@muguilin/gm-crypto';
const { publicKey, privateKey } = SM2.generateKeyPair()
const originalData = 'SM2 椭圆曲线公钥密码算法'
const encryptedData = SM2.encrypt(originalData, publicKey, {
inputEncoding: 'utf8',
outputEncoding: 'base64'
})
const decryptedData = SM2.decrypt(encryptedData, privateKey, {
inputEncoding: 'base64',
outputEncoding: 'utf8'
})
- SM3 加密哈希算法。
import { SM2, SM3, SM4 } from '@muguilin/gm-crypto';
console.log(SM3.digest('abc'))
console.log(SM3.digest('YWJj', 'base64'))
console.log(SM3.digest('616263', 'hex', 'base64'))
- SM4 分组密码算法。
import { SM2, SM3, SM4 } from '@muguilin/gm-crypto';
const key = '0123456789abcdeffedcba9876543210' // Any string of 32 hexadecimal digits
const originalData = 'SM4 国标对称加密'
/**
* Block cipher modes:
* - ECB: electronic codebook
* - CBC: cipher block chaining
*/
let encryptedData, decryptedData
// ECB
encryptedData = SM4.encrypt(originalData, key, {
inputEncoding: 'utf8',
outputEncoding: 'base64'
})
decryptedData = SM4.decrypt(encryptedData, key, {
inputEncoding: 'base64',
outputEncoding: 'utf8'
})
// CBC
const iv = '0123456789abcdeffedcba9876543210' // Initialization vector(any string of 32 hexadecimal digits)
encryptedData = SM4.encrypt(originalData, key, {
iv: iv,
mode: SM4.constants.CBC,
inputEncoding: 'utf8',
outputEncoding: 'hex'
})
decryptedData = SM4.decrypt(encryptedData, key, {
iv: iv,
mode: SM4.constants.CBC,
inputEncoding: 'hex',
outputEncoding: 'utf8'
})