zhangbo1_wd

新增加密工具类

  1 +import { cryptoFramework } from '@kit.CryptoArchitectureKit';
  2 +import { util } from '@kit.ArkTS';
  3 +
  4 +const TAG: string = '[AesUtils]'
  5 +/**
  6 + * ASE密钥 TODO 示例密钥,业务需要按实际密钥修改
  7 + */
  8 +const AES_ENCRYPT_KEY: string = '5QXzAbJj0TJN9OQNvxFhhw==';
  9 +const AES128: string = 'AES128';
  10 +const AES128_ECB_PKCS5: string = 'AES128|ECB|PKCS5'; // 'AES128|PKCS5';
  11 +
  12 +/**
  13 + * AES加密/解密
  14 + */
  15 +export class AesUtils {
  16 + static stringToUint8Array(str: string) {
  17 + let arr: number[] = new Array();
  18 + for (let i = 0, j = str.length; i < j; ++i) {
  19 + arr.push(str.charCodeAt(i));
  20 + }
  21 + let tmpArray = new Uint8Array(arr);
  22 + return tmpArray;
  23 + }
  24 +
  25 + static uint8ArrayToString(array: Uint8Array): string {
  26 + let arrayString = '';
  27 + for (let i = 0; i < array.length; i++) {
  28 + arrayString += String.fromCharCode(array[i]);
  29 + }
  30 + return arrayString;
  31 + }
  32 +
  33 + /**
  34 + * aes加密
  35 + * @param message
  36 + * @param callback
  37 + */
  38 + static async aesEncrypt(message: string, secretKey?: string): Promise<string> {
  39 + // Logger.debug(TAG, `aesEncrypt message: ${message}`);
  40 + // 组装convertKey所需的二进制密钥数据
  41 + let base64Helper = new util.Base64Helper();
  42 + let pubKey = base64Helper.decodeSync(secretKey ?? AES_ENCRYPT_KEY); // AES密钥
  43 + let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKey };
  44 + // 创建对称密钥生成器
  45 + let aesGenerator = cryptoFramework.createSymKeyGenerator(AES128);
  46 + // 转换/生成对称密钥对象
  47 + let symKey: cryptoFramework.SymKey = await aesGenerator.convertKey(pubKeyBlob)
  48 + // 生成加解密生成器
  49 + let cipher = cryptoFramework.createCipher(AES128_ECB_PKCS5);
  50 + // 初始化加密
  51 + await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, null)
  52 + // 封装加密所需数据
  53 + let input: cryptoFramework.DataBlob = { data: AesUtils.stringToUint8Array(message) };
  54 + // 当数据量较小时,可以在init完成后直接调用doFinal
  55 + // 当数据量较大时,可以多次调用update,即分段加解密。
  56 + let output: cryptoFramework.DataBlob = await cipher.doFinal(input)
  57 + // Logger.info(TAG, "aesEncrypt output.data is " + output.data);
  58 + let result = base64Helper.encodeToStringSync(output?.data)
  59 + // Logger.info(TAG, "aesEncrypt result is " + result);
  60 + return result;
  61 + }
  62 +
  63 + /**
  64 + * aes解密
  65 + * @param message
  66 + * @param callback
  67 + */
  68 + static async aesDecrypt(message: string, secretKey?: string): Promise<string> {
  69 + // Logger.debug(TAG, `aesDecrypt message: ${message}`);
  70 + // 组装convertKey所需的二进制密钥数据
  71 + let base64Helper = new util.Base64Helper();
  72 + let pubKey = base64Helper.decodeSync(secretKey ?? AES_ENCRYPT_KEY); // AES密钥
  73 + let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKey };
  74 + // 创建对称密钥生成器
  75 + let aesGenerator = cryptoFramework.createSymKeyGenerator(AES128);
  76 + // 转换/生成对称密钥对象
  77 + let symKey: cryptoFramework.SymKey = await aesGenerator.convertKey(pubKeyBlob)
  78 + // 生成加解密生成器
  79 + let cipher = cryptoFramework.createCipher(AES128_ECB_PKCS5);
  80 + // 初始化加密
  81 + await cipher.init(cryptoFramework.CryptoMode.DECRYPT_MODE, symKey, null)
  82 + // 封装加密所需数据
  83 + let newMessage = base64Helper.decodeSync(message);
  84 + let input: cryptoFramework.DataBlob = { data: newMessage };
  85 + // 当数据量较小时,可以在init完成后直接调用doFinal
  86 + // 当数据量较大时,可以多次调用update,即分段加解密。
  87 + let output: cryptoFramework.DataBlob = await cipher.doFinal(input)
  88 + // Logger.debug(TAG, "aesDecrypt is output.data " + output?.data);
  89 + let result = AesUtils.uint8ArrayToString(output?.data)
  90 + // Logger.debug(TAG, "aesDecrypt result is " + result);
  91 + return result
  92 + }
  93 +}