国密简介
国密即国家密码局认定的国产密码算法,是我国自主研发的一系列密码标准,旨在保障信息安全和国家信息安全。这些算法在金融、政务、电信等重要领域得到广泛应用,确保数据的机密性、完整性和真实性。国密算法主要包括 SM2、SM3、SM4 等,它们分别在非对称加密、哈希运算和对称加密方面发挥着重要作用。
SM2
SM2 是一种基于椭圆曲线密码体制的非对称加密算法,其安全性高于传统的 RSA 算法,且在相同安全级别下,密钥长度更短,计算效率更高。SM2 主要用于数字签名、密钥交换和公钥加密等场景。
下面是使用 gm-crypto
库实现 SM2 加密解密的示例代码:
const { SM2 } = require('gm-crypto')
const { publicKey, privateKey } = SM2.generateKeyPair()
const originalData = '4nKtT8poEWsy90jJ'
const encryptedData = SM2.encrypt(originalData, publicKey, {
inputEncoding: 'utf8',
outputEncoding: 'base64'
})
console.log(encryptedData)
const decryptedData = SM2.decrypt(encryptedData, privateKey, {
inputEncoding: 'base64',
outputEncoding: 'utf8'
})
console.log(decryptedData)
在上述代码中,首先生成了 SM2 算法所需的公钥和私钥对。加密过程使用公钥对原始数据进行处理,得到加密后的数据;解密过程则使用对应的私钥对加密数据进行还原,得到原始数据。这种非对称加密方式的特点是公钥可以公开,用于加密数据,而私钥需要妥善保管,用于解密数据。
SM3
SM3 是一种密码哈希算法,主要用于对数据进行哈希运算,生成固定长度的哈希值。该哈希值具有唯一性,即不同的输入数据会生成不同的哈希值,且无法从哈希值反推出原始数据。SM3 常用于数据完整性校验、数字签名等场景。
以下是使用 gm-crypto
库中 SM3 算法的示例:
const { SM3 } = require('gm-crypto')
console.log(SM3.digest('20250731'))
console.log(SM3.digest('lll', 'base64'))
console.log(SM3.digest('022', 'hex', 'base64'))
SM3 算法的 digest
方法可以根据指定的输入编码和输出编码对数据进行哈希处理。通过比较数据的哈希值,可以判断数据在传输或存储过程中是否被篡改,从而保证数据的完整性。
SM4
SM4 是一种分组密码算法,属于对称加密算法,即加密和解密使用相同的密钥。它具有高效、安全的特点,适用于对大量数据进行加密,如文件加密、数据库加密等。SM4 算法支持 ECB 和 CBC 等多种加密模式。
下面是使用 gm-crypto
库实现 SM4 加密解密的示例:
const { SM4 } = require('gm-crypto')
const key_str = "4nKtT8poEWsy90jJ";
//密钥格式必须是 32个16进制字符(128位二进制;16字节)
const key = Buffer.from(key_str, 'utf8').toString('hex');
const originalData = "{\"username\":\"17391910267\",\"password\":\"121421\"}"
let encryptedData, decryptedData
//ECB 加密
encryptedData = SM4.encrypt(originalData, key, {
inputEncoding: 'utf8',
outputEncoding: 'base64'
})
console.log(encryptedData)
//ECB 解密
decryptedData = SM4.decrypt(encryptedData, key, {
inputEncoding: 'base64',
outputEncoding: 'utf8'
})
console.log(decryptedData)
//CBC 加密
//Initialization vector (32个16进制字符(128位二进制;16字节))
const iv = '0123456789abcdeffedcba9876543210'
encryptedData = SM4.encrypt(originalData, key, {
iv,
mode: SM4.constants.CBC,
inputEncoding: 'utf8',
outputEncoding: 'hex'
})
console.log(encryptedData)
//CBC 解密
decryptedData = SM4.decrypt(encryptedData, key, {
iv,
mode: SM4.constants.CBC,
inputEncoding: 'hex',
outputEncoding: 'utf8'
})
console.log(decryptedData)
在 SM4 算法中,ECB 模式是一种基本的加密模式,它将数据分成固定大小的块进行独立加密,但安全性相对较低。CBC 模式则引入了初始化向量(IV),每个数据块的加密都依赖于前一个数据块的加密结果,安全性更高。在使用 CBC 模式时,加密和解密需要使用相同的密钥和初始化向量,才能正确完成数据的加解密过程。
评论