实现多种加解密鸿蒙示例代码 原创

鸿蒙场景化示例代码技术工程师
发布于 2025-3-4 20:11
1.8w浏览
0收藏

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

介绍

该示例主要分为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;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 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;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 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;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 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.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  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.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  1. AES128加解密(ECB/CBC/GCM)

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

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
分类
收藏
回复
举报


回复
    相关推荐