npm package: @muguilin/gm-crypto
Description: 基于 gm-crypto 密码行业标准化委员会（SM4）和 big-integer 大整数处理 的前后端API数据传输加解密处理模块！
Author: 沐枫（MuGuiLin）
Latest version: 1.0.4

# @muguilin/gm-crypto

[![MIT License](https://img.shields.io/npm/l/utilsjs.svg?style=flat-square)](https://www.npmjs.com/package/mu-tooljs)

> 基于 gm-crypto 密码行业标准化委员会（SM4）和 big-integer 大整数处理 的前后端API数据传输 加解密处理模块！
>




#### 🏡下载安装：

```shell
# 使用npm命令下载安装
$ npm i @muguilin/gm-crypto

# 使用yarn命令下载安装
$ yarn add @muguilin/gm-crypto
```



#### 🚀使用实例：

- **基于SM4算法简单的数据加密与解密**

    ``` javascript
    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的数据加密与解密**

    ![DH-SM4](D:\GitHub\Npm\package\@muguilin\gm-crypto\publish\DH-SM4.jpg)

    ``` javascript
    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的数据解密**

    ```javascript
    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字节 - 字符串 相互转换**

    ```javascript
    import { Utf8 } from '@muguilin/gm-crypto';
    
    const utf8 = Utf8.encode("要转换的文本数据");
    console.log("转换后的utf8字节数据：", utf8);
    
    const str = Utf8.decode(utf8);
    console.log("utf8字节数据 转 字符串：", str);
    ```

    

- **十六进制 - 字符串 相互转换**

    ```javascript
    import { Hex } from '@muguilin/gm-crypto';
    
    const hex = Hex.encode("要转换的文本数据");
    console.log("转换后的16进制数据：", hex);
    
    const str = Hex.decode(hex);
    console.log("16进制 转 字符串：", str);
    ```

    

- **Base64 - 字符串 相互转换**

    ```javascript
    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中?后面的参数**

    ```javascript
    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 ](https://www.npmjs.com/package/big-integer)

```javascript
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](https://www.npmjs.com/package/gm-crypto)

- **SM2** 基于椭圆曲线的公钥密码算法。

```javascript
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** 加密哈希算法。

```javascript
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** 分组密码算法。

```javascript
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'
})
```