本文原创发布在华为开发者社区

介绍

该示例主要分为3个部分:

  1. 国密算法的加解密:包含了SM2、SM4的加解密示例;
  2. 安卓格式和鸿蒙格式的转换:包含了安卓格式的公私钥,转化为鸿蒙格式的公私钥;安卓加密的密文,在鸿蒙解密;鸿蒙生成的密文解码,用于安卓解密;
  3. 以AES128算法为例,实现了CBC/ECB/GCM算法分组的加解密示例。

多种加解密源码链接

效果预览

请添加链接描述

使用说明

打开应用,点击按钮,进入对应示例,进行对应的加解密测试。

实现思路

  1. 国密算法的加解密

    • SM2加密
async encryptSM2BySpecifiedKeyPair(encryptOption: ISM2Cipher) {
  let pubKeyBlob: cryptoFramework.DataBlob | null = encryptOption.pkData ? { data: encryptOption.pkData } : null;
  let priKeyBlob: cryptoFramework.DataBlob | null = encryptOption.skData ? { data: encryptOption.skData } : null;
  let keyPair = await KeyManager.genKeyPairByData(pubKeyBlob, priKeyBlob, encryptOption.algName);
  let pubKey = keyPair.pubKey;
  // 把字符串按utf-8解码为Uint8Array
  let plainTextBlob: cryptoFramework.DataBlob = { data: stringToUint8Array(encryptOption.plainText)};
  let encryptText = await this.encryptMessage(encryptOption.cipherTransform,pubKey, plainTextBlob);
  let encryptData = '';
  let outputType = encryptOption.outputType || 'base64';
  encryptData = base64Helper.encodeToStringSync(encryptText.data);
  if (outputType === 'hex') {
    encryptData = uint8ArrayToHexString(encryptText.data);
  }
  return encryptData;
}
  • SM2解密
async decryptSM2BySpecifiedKeyPair(decryptOption: ISM2Cipher) {
  let encrptStr = decryptOption.encryptedStr || '';
  let plainMessage: Uint8Array;
  let inputType = decryptOption.inputType || 'base64';
  plainMessage = base64Util.decodeSync(encrptStr);
  if (inputType === 'hex') {
    plainMessage = hexStrToUint8Array(encrptStr);
  }
  let pubKeyBlob: cryptoFramework.DataBlob | null = decryptOption.pkData ? { data: decryptOption.pkData } : null;
  let priKeyBlob: cryptoFramework.DataBlob | null = decryptOption.skData ? { data: decryptOption.skData } : null;
  let keyPair = await KeyManager.genKeyPairByData(pubKeyBlob, priKeyBlob, decryptOption.algName);
  let priKey = keyPair.priKey;
  // 把字符串按utf-8解码为Uint8Array
  let plainTextBlob: cryptoFramework.DataBlob = { data: plainMessage };
  let decryptText = await this.decryptMessage(decryptOption.cipherTransform, priKey, plainTextBlob);
  let decryptData = uint8ArrayToString(decryptText.data);
  return decryptData;
}
  • SM4加密
async encryptSM4BySpecifiedKeyPair(encryptOption: ISM4Cipher) {
  let symKey = await KeyManager.genSymKeyBySpecifiedKey(encryptOption.originKeyData, encryptOption.algName);
  let plainTextBlob: cryptoFramework.DataBlob = { data: stringToUint8Array(encryptOption.plainText) };
  let encryptText = await this.encryptMessage(encryptOption.cipherTransform, symKey, plainTextBlob);
  let encryptData = base64Helper.encodeToStringSync(encryptText.data);
  return encryptData;
}
  • SM4解密
async decryptSM4BySpecifiedKeyPair(decryptOption: ISM4Cipher) {
  let message = base64Helper.decodeSync(decryptOption.encryptedStr);
  let symKey = await KeyManager.genSymKeyBySpecifiedKey(decryptOption.originKeyData, decryptOption.algName);
  let plainTextBlob: cryptoFramework.DataBlob = { data: message };
  let decryptText = await this.decryptMessage(decryptOption.cipherTransform, symKey, plainTextBlob);
  let decryptData = uint8ArrayToString(decryptText.data);
  return decryptData;
}
  1. 安卓生成的密钥转换为鸿蒙
async encryptAndroidCipherText(harmonyPrk: string, androidCiphertext: string): Promise<string> {
  let priKeyBlob: cryptoFramework.DataBlob = { data: base64Util.decodeSync(harmonyPrk) }
  let keyPair = await KeyManager.genKeyPairByData(null, priKeyBlob, 'SM2_256');

  // 对于安卓加密的密文,在鸿蒙这边解密时,由于鸿蒙这边的格式是ASN.1包裹的格式,因此需要先序列化
  let c = hexStrToUint8Array(new SM2Ciphertext().i2d_SM2_Ciphertext(androidCiphertext))
  let res = await this.decryptMessage('SM2_256|SM3', keyPair.priKey, { data: c })
  return uint8ArrayToString(res.data);
}
  1. AES128加解密(ECB/CBC/GCM)

通过调用不同加解密算法实现ECB/CBC/GCM加解密


鸿蒙场景化代码
1 声望0 粉丝