跳至主要內容

sm-crypto加解密

三思原创大约 2 分钟前端前端sm-crypto加密解密

本文介绍了如何在使用 sm-crypto 的加密过程中结合 base64 编码和解码操作,以及通过 cbc 方式进行加解密的步骤。示例代码展示了对明文进行编码、密钥转换、加密解密等流程,同时强调了 base64 编码/解码的作用与影响。

image
image

sm-crypto加解密

如果您想在使用 sm-crypto 的加密过程中使用 base64 编码和解码,请按照以下方法进行操作:

  • 对明文进行 base64 编码:使用 Buffer 对象将明文转换为 Buffer,并调用 toString('base64')​ 方法进行编码。例如:
const plainText = 'Hello, world!';
const buffer = Buffer.from(plainText, 'utf8');
const base64Text = buffer.toString('base64');
  • 对密钥进行 base64 解码:将密钥从 base64 字符串转换为 Buffer 对象。例如:
const keyBase64 = 'y1PatzQi4QniPkGulVr+mQ==';
const keyBuffer = Buffer.from(keyBase64, 'base64');
  • 加密明文:使用 sm-crypto 的加密方法进行加密。例如,使用 sm4.encrypt​ 进行 SM4 对称加密,并对加密结果进行 base64 编码:
const cipherText = sm4.encrypt(buffer, keyBuffer, 'ecb').toString('base64');
  • 对加密结果进行 base64 解码:将加密结果从 base64 字符串转换为 Buffer 对象。例如:
const cipherTextBase64 = '4qHZvlk2x0pVqJ/rfGdHCg==';
const cipherTextBuffer = Buffer.from(cipherTextBase64, 'base64');
  • 解密密文:使用 sm-crypto 的解密方法进行解密。例如,使用 sm4.decrypt​ 进行 SM4 对称解密,以获取明文:
const plainTextBuffer = sm4.decrypt(cipherTextBuffer, keyBuffer, 'ecb');
const plainText = plainTextBuffer.toString('utf8');

通过上述方法可以使用 base64 编码和解码来对 sm-crypto 进行加密和解密。请注意,使用 base64 编码和解码可以有效地将二进制数据转换为可读的 ASCII 字符串,但同时也会增加一些额外的计算量和传输负担。您需要权衡编码和解码的优势和劣势,并根据您的具体需求进行选择。

cbc方式加解密

      // const decryptData = sm4.cbc.decrypt(encryptData, key, iv);
      // const msg = '{"handleItemCode":"1112000000012568X5312201410500101","projectNo":"202306200000333875","creditCode":"1112000000012568X5","ticket":"742a568b52274679961e28fa20434131","sceneCode":"S0002","taskBasicCode":"12201410500101","pageEcho":"0","handleItemName":"东软测试申报事项"}\n' // 可以为 16 进制串或字节数组
      const key = '41346132675248725744767455614775' // 可以为 16 进制串或字节数组,要求为 128 比特

      // let encryptData = sm4.encrypt(msg, key, {mode: 'cbc', iv: '41346132675248725744767455614775'}) // 加密,cbc 模式
      let  encryptData ="7hz1WyGfoSt+QWT21ChPO1aXxYkp3NgBgnbU47VyQNDzH6nprO5Bm7FFp31G2+rdFN8PhnWxiAI5tBJu5vE2LWOQCxPlfEdy6QdWI4Hk7U1m6bzDzBeLqejfPYB/Im3WLSUSWuDFjIVrwrk6rwbjW8F42SUSgY+zptqiEzrlODTJOgMI6cfX7mD+8o5obzCs4h7J47fF4Y8O3CpOQqUPQx2KirEOnY8wUTB63HGliIV3otps2dvQNSjy49gydlReWMR1crw9cpl25SXvV1PfANpwMpAjaX5SZYTWG7jvmTa5UtmEQPUmmEdETFC/6nRZ/1Nzm2+iLLY27MjPhtLvXUu1QHeS1dElusa9zUWBp1v/8Ije+PdPKgiD8BheEHm0"
      console.log('加密结果:', encryptData);
      // const base64EncodedData = Base64.decode(encryptData) // 解码
      const base64EncodedData = Buffer.from(encryptData, 'base64');
      console.log('加密结果base64:', base64EncodedData);
      let decryptData = sm4.decrypt(base64EncodedData, key, {mode: 'cbc', iv: '41346132675248725744767455614775'}) // 解密,cbc 模式
      console.log('解密结果:', decryptData);

      // let decryptData = sm4.decrypt(param, 'A4a2gRHrWDvtUaGu', {mode: 'cbc', iv: 'A4a2gRHrWDvtUaGu'}) // 解密,cbc 模式