一、简介
sm-crypto是一个基于Node.js的密码学库,用于提供各种加密、解密、签名和验证功能。它是为了与国密算法(中国密码算法标准)兼容而设计的。
以下是sm-crypto库的一些主要功能:
- 对称加密和解密:sm-crypto支持使用国密算法进行对称加密和解密操作。您可以使用库中提供的函数进行数据的加密和解密,例如使用SM1、SM4等算法。
- 非对称加密和解密:sm-crypto支持使用国密算法进行非对称加密和解密操作。您可以使用库中提供的函数进行公钥加密和私钥解密,例如使用SM2算法。
- 数字签名和验证:sm-crypto提供了数字签名和验证的功能。您可以使用库中的函数对数据进行签名,并使用相应的公钥验证签名的有效性。这可以用于确保数据的完整性和身份认证。
- 密钥生成和派生:sm-crypto支持生成和派生密钥的功能。您可以使用库中的函数生成对称密钥或者从密码派生密钥。这对于安全地管理密钥非常有用。
- 密码学哈希函数:sm-crypto提供了一些密码学哈希函数的支持,例如SM3哈希算法。您可以使用这些函数对数据进行哈希,以生成唯一的哈希值。
二、安装
npm install sm-crypto
三、哈希算法SM3
const smCrypto = require('sm-crypto');
const sm3_hash = smCrypto.sm3('hello word');
console.log(sm3_hash)
四、对称加密算法SM4
- smCrypto.sm4…encrypt(inArray, key, options, key, options):
- inArray:要加密的明文数据,可以是字符串或Buffer对象。
- key:加密密钥,可以是字符串或Buffer对象。密钥长度必须为16字节(128位)。
- options:可选参数的对象:
- mode:加密模式,默认为ecb(电子密码本模式),也可以是cbc(密码分组链接模式)。
- iv:初始向量(IV),仅在cbc模式下使用。可以是字符串或Buffer对象。IV长度必须为16字节(128位)。
- padding:填充模式,默认为pkcs7。可以是pkcs7(PKCS7填充)或zero(零填充)。
- output:输出格式,默认为string。可以是string(字符串)或array(数组)。
- smCrypto.sm4…encrypt(inArray, key, options)
- inArray:要加密的明文数据,可以是字符串或Buffer对象。
- key:加密密钥,可以是字符串或Buffer对象。密钥长度必须为16字节(128位)。
- options:可选参数的对象:
- mode:加密模式,默认为ecb(电子密码本模式),也可以是cbc(密码分组链接模式)。
- iv:初始向量(IV),仅在cbc模式下使用。可以是字符串或Buffer对象。IV长度必须为16字节(128位)。
- padding:填充模式,默认为pkcs7。可以是pkcs7(PKCS7填充)或zero(零填充)。
- output:输出格式,默认为string。可以是string(字符串)或array(数组)。
const smCrypto = require('sm-crypto');
const sm4 = smCrypto.sm4;
const key = '0123456789ABCDEF0123456789ABCDEF'; // 设置SM4密钥(128位,16字节)
const mode = 'ecb'; // 设置SM4加解密模式(ecb、cbc、ctr等)
// 加密数据
const plaintext = 'Hello, SM4!';
const ciphertext = sm4.encrypt(plaintext, key, { mode });
console.log('加密数据:', ciphertext);
// 解密数据
const decryptedText = sm4.decrypt(ciphertext, key, { mode });
console.log('解密数据:', decryptedText);
五、非对称加密算法SM2
- smCrypto.sm2.generateKeyPairHex(a, b, c):生成SM2密钥对,并以十六进制字符串的形式返回公钥和私钥。参数a、b、c是可选的,用于指定生成密钥对的曲线参数。
- smCrypto.sm2.compressPublicKeyHex(s):将SM2公钥的十六进制字符串表示进行压缩,返回压缩后的公钥的十六进制字符串。
- smCrypto.sm2.comparePublicKeyHex(publicKey1, publicKey2):比较两个SM2公钥的十六进制字符串表示是否相等。如果相等,返回true;否则返回false。
- smCrypto.sm2.doEncrypt(msg, publicKey, cipherMode):使用SM2公钥对消息进行加密
- msg是要加密的消息
- publicKey是SM2公钥的十六进制字符串表示
- cipherMode是加密模式,可以是0(C1C3C2模式)或1(C1C2C3模式)。返回加密后的密文的十六进制字符串表示。
- smCrypto.sm2.doDecrypt(encryptData, privateKey, cipherMode):使用SM2私钥对密文进行解密
- encryptData是要解密的密文的十六进制字符串表示
- privateKey是SM2私钥的十六进制字符串表示
- cipherMode是加密模式,与加密时使用的模式保持一致。返回解密后的明文。
- smCrypto.sm2.doSignature(msg, privateKey):使用SM2私钥对消息进行数字签名。
- msg是要签名的消息
- privateKey是SM2私钥的十六进制字符串表示。返回数字签名的十六进制字符串表示。
- smCrypto.sm2.doVerifySignature(msg, signHex, publicKey, options):验证SM2数字签名的有效性。
- msg是要验证的消息
- signHex是要验证的数字签名的十六进制字符串表示
- publicKey是SM2公钥的十六进制字符串表示
- options是一个可选的对象,可以包含以下属性:der(是否使用DER编码,默认为false)、hash(哈希算法,默认为sm3)、userId(用户ID,默认为空字符串)。如果数字签名有效,返回true;否则返回false。
- smCrypto.sm2.getPublicKeyFromPrivateKey(privateKey):从SM2私钥的十六进制字符串表示中获取对应的公钥的十六进制字符串表示。
- smCrypto.sm2.getPoint():获取SM2曲线上的一个点,返回该点的十六进制字符串表示。
- smCrypto.sm2.verifyPublicKey(publicKey):验证SM2公钥的有效性。publicKey是SM2公钥的十六进制字符串表示。如果公钥有效,返回true;否则返回false。
const smCrypto = require('sm-crypto');
const { publicKey, privateKey } = smCrypto.sm2.generateKeyPairHex();// 生成密钥对
const plaintext = 'Hello, world!';// 明文数据
const ciphertext = smCrypto.sm2.doEncrypt(plaintext, publicKey, 1);// 加密
const decryptedText = smCrypto.sm2.doDecrypt(ciphertext, privateKey, 1);// 解密
console.log('加密原数据:', plaintext);
console.log('加密后:', ciphertext);
console.log('解密后:', decryptedText);
const signature = smCrypto.sm2.doSignature(plaintext, privateKey);// 数字签名
const isValidSignature = smCrypto.sm2.doVerifySignature(plaintext, signature, publicKey);// 验证签名
console.log('签名原数据:', plaintext);
console.log('数字签名:', signature);
console.log('签名验证结果:', isValidSignature);