@muguilin/gm-crypto
TypeScript icon, indicating that this package has built-in type declarations

1.0.3 • Public • Published

@muguilin/gm-crypto

MIT License

基于 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);
    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);
    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'
})

Package Sidebar

Install

npm i @muguilin/gm-crypto

Weekly Downloads

16

Version

1.0.3

License

MIT

Unpacked Size

233 kB

Total Files

6

Last publish

Collaborators

  • muguilin