HarmonyOS 鸿蒙Next SM2加解密 中文乱码

发布于 1周前 作者 wuwangju 来自 鸿蒙OS

HarmonyOS 鸿蒙Next SM2加解密 中文乱码

深色代码主题
复制
使用CryptoArchitectureKit相关api进行sm2加解密操作,转为C1C3C2格式密文之后 java工具解密出来的中文字符乱码 英文没有问题,同理解密java后台传过来的C1C3C2类型的密文,中文字符依然也乱码。


更多关于HarmonyOS 鸿蒙Next SM2加解密 中文乱码的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

#你问我答#

对于 CryptoJS 鸿蒙版 aes 解密中文乱码,解决方案是:

decrypt(word: ESObject, key: ESObject, iv: ESObject): ESObject {

  // let encryptedHexStr: ESObject = CryptoJS.enc.Hex.parse(word);

  // const srcs: ESObject = CryptoJS.enc.Base64.stringify(encryptedHexStr);

  const decrypt: ESObject = CryptoJS.AES.decrypt(word, key, {

    iv: iv,

    mode: CryptoJS.mode.ECB,

    padding: CryptoJS.pad.Pkcs7

  });

  const decryptedStr: ESObject = decrypt.toString(CryptoJS.enc.Ut

}

对于使用 SHA256 时原始字符串中有中文导致和后端算出的结果不一致的问题,参考代码如下

// 字符串转成字节流

function stringToUint8ArrayByte(str: string) {

  return new Uint8Array(buffer.from(str,'utf-8').buffer);

}

// 字节流转成可理解的字符串

function uint8ArrayToStringByte(array:Uint8Array) {

  // 将UTF-8编码转换成Unicode编码

  let out: string = '';

  let index: number = 0;

  let len: number = array.length;

  while (index < len) {

    let character = array[index++];

    switch(character >> 4) {

      case 0:

      case 1:

      case 2:

      case 3:

      case 4:

      case 5:

      case 6:

      case 7:

        out += String.fromCharCode(character);

        break;

      case 12:

      case 13:

        out += String.fromCharCode(((character & 0x1F) << 6) | (array[index++] & 0x3F));

        break;

      case 14:

        out += String.fromCharCode(((character & 0x0F) << 12) | ((array[index++] & 0x3F) << 6) | ((array[index++] & 0x3F) << 0));

        break;

      default:

        break;

    }

  }

}

更多关于HarmonyOS 鸿蒙Next SM2加解密 中文乱码的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


深色代码主题
复制
public static Encrypt(plaintext: string, publicKey: string): string {
  try {
    let asymKey = convertStrToPubKey(publicKey) ;
    let cipher = cryptoFramework.createCipher('SM2_256|SM3');
    cipher.initSync(cryptoFramework.CryptoMode.ENCRYPT_MODE, asymKey, null);
    let encryptData = cipher.doFinalSync({ data: stringToUint8Array(plaintext) });
    let pubSpec = cryptoFramework.SM2CryptoUtil.getCipherTextSpec(encryptData, 'C1C3C2');
    return Utils.getC1C3C2(pubSpec);
  } catch (e) {
  }
}
深色代码主题
复制
 static stringToUint8Array(str: string): Uint8Array {
  let textEncoder = util.TextEncoder.create('utf-8');
  return textEncoder.encodeInto(str);
}

把 明文和密文 字符串和字节流的转换,用utf-8方式替换下,就能支持中文了。中文字符转码参考该文档中的- 数据编码格式(中文为utf-8): https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/crypto-development-practice-V5

在HarmonyOS鸿蒙系统中,针对Next SM2加解密过程中出现的中文乱码问题,通常是由于字符编码不一致导致的。以下是一些直接解决方法:

  1. 统一编码:确保在加密和解密过程中使用的字符编码(如UTF-8)一致。检查加密前的原始数据和解密后的输出数据是否在同一编码标准下处理。

  2. 检查数据源:验证加密前的中文数据在源端是否正确编码。如果数据在传输或存储过程中被错误转换,也可能导致乱码。

  3. 加解密库配置:确保使用的加解密库(如HarmonyOS提供的原生库)在初始化时配置正确,支持处理中文字符集。

  4. 日志调试:在加密和解密前后打印数据编码的日志,观察编码是否一致。这有助于定位问题是在加密前、加密过程中还是解密后发生的。

  5. 示例代码验证:使用官方提供的Next SM2加解密示例代码进行对比测试,确保实现过程无误。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html 。通过联系客服,可以提供更详细的错误信息和日志,以便进一步分析和解决问题。

回到顶部