An implementation of GM/T industry standards
npm install gm-crypto




A pure JavaScript implementation of GM/T series(sm2,sm3,sm4) cryptographic algorithms compatible with Node.js and browsers, with type declaration files support.
- GM/T0003-2012《SM2 public key cryptographic algorithm based on elliptic curves》
- GM/T0004-2012《SM3 cryptographic hash algorithm》
- GM/T0002-2012《SM4 block cipher algorithm》(also aliased as SMS4)
Using npm:
``bash`
$ npm install gm-crypto
Using yarn:
`bash`
$ yarn add gm-crypto
#### SM2
> Public Key Cryptographic Algorithm Based on Elliptic Curves.
`js
const { SM2 } = require('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
> Cryptographic Hash Algorithm.
`js
const { SM3 } = require('gm-crypto')
console.log(SM3.digest('abc'))
console.log(SM3.digest('YWJj', 'base64'))
console.log(SM3.digest('616263', 'hex', 'base64'))
`
#### SM4
> Block Cipher Algorithm.
`js
const { SM4 } = require('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'
})
`
- SM2
- .generateKeyPair() ⇒ objectstring
- [.encrypt(data, key[, options]](#sm2encryptdata-key-options) ⇒ | ArrayBufferstring
- [.decrypt(data, key[, options])](#sm2decryptdata-key-options) ⇒ | ArrayBuffer
- SM3
- [.digest(data[, inputEncoding][, outputEncoding])](#sm3digestdata-inputencoding-outputencoding) ⇒ string | ArrayBuffer
- SM4
- [.encrypt(data, key[, options])](#sm4encryptdata-key-options) ⇒ string | ArrayBufferstring
- [.decrypt(data, key[, options])](#sm4decryptdata-key-options) ⇒ | ArrayBuffer
Generates a new asymmetric key pair.
Encrypt data.
| Param | Type | Default | Description |
| ---------------------- | --------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| data | string\|ArrayBuffer\|Buffer | | Plain message |string
| key | | | Public key generated by SM2.generateKeyPair() |object
| options | | | Options |C1C3C2
| options.mode | \| C1C2C3 | C1C3C2 | Concatenation mode |string
| options.inputEncoding | | "utf8" | The encoding of the plain data string,if data is not a string then inputEncoding is ignored. |string
| options.outputEncoding | | | If outputEncoding is provided, a string will be returned, otherwise a ArrayBuffer is returned. |boolean
| options.pc | | false | Includes PC mark as first byte |
Decrypt data.
| Param | Type | Default | Description |
| ---------------------- | --------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| data | string\|ArrayBuffer\|Buffer | | Ciphered data |string
| key | | | Private key generated by SM2.generateKeyPair() |C1C3C2
| options.mode | \| C1C2C3 | C1C3C2 | Concatenation mode |string
| options.inputEncoding | | | The encoding of the plain data string,if data is not a string then inputEncoding is ignored. |string
| options.outputEncoding | | | If outputEncoding is provided, a string will be returned, otherwise a ArrayBuffer is returned. |boolean
| options.pc | | false | Includes PC mark as first byte |
Calculates the digest.
| Param | Type | Default | Description |
| -------------- | --------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| data | string\|ArrayBuffer\|Buffer | | Data message |string
| inputEncoding | | "utf8" | The encoding of the data string, if data is not a string then inputEncoding is ignored. |string
| outputEncoding | | | If outputEncoding is provided, a string will be returned, otherwise a ArrayBuffer is returned. |
Encrypt data.
| Param | Type | Default | Description |
| ---------------------- | --------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| data | string\|ArrayBuffer\|Buffer | | Plain message |string
| key | | | Cipher key(any string of 32 hexadecimal digits) |object
| options | | | Options |ECB
| options.mode | \| CBC | ECB | Block cipher mode |string
| options.iv | | | Initialization vector(any string of 32 hexadecimal digits) |string
| options.inputEncoding | | "utf8" | The encoding of the plain data string,if data is not a string then inputEncoding is ignored. |string
| options.outputEncoding | | | If outputEncoding is provided, a string will be returned, otherwise a ArrayBuffer is returned. |
Decrypt data.
| Param | Type | Default | Description |
| ---------------------- | --------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| data | string\|ArrayBuffer\|Buffer | | Ciphered data |string
| key | | | Cipher key(any string of 32 hexadecimal digits) |object
| options | | | Options |ECB
| options.mode | \| CBC | ECB | Block cipher mode |string
| options.iv | | | Initialization vector(any string of 32 hexadecimal digits) |string
| options.inputEncoding | | | The encoding of the plain data string,if data is not a string then inputEncoding is ignored. |string
| options.outputEncoding | | | If outputEncoding` is provided, a string will be returned, otherwise a ArrayBuffer is returned. |