AesUtils.ets 3.71 KB
import { cryptoFramework } from '@kit.CryptoArchitectureKit';
import { util } from '@kit.ArkTS';

const TAG: string = '[AesUtils]'
/**
 * ASE密钥 TODO 示例密钥,业务需要按实际密钥修改
 */
const AES_ENCRYPT_KEY: string = '5QXzAbJj0TJN9OQNvxFhhw==';
const AES128: string = 'AES128';
const AES128_ECB_PKCS5: string = 'AES128|ECB|PKCS5';  // 'AES128|PKCS5';

/**
 * AES加密/解密
 */
export class AesUtils {
  static stringToUint8Array(str: string) {
    let arr: number[] = new Array();
    for (let i = 0, j = str.length; i < j; ++i) {
      arr.push(str.charCodeAt(i));
    }
    let tmpArray = new Uint8Array(arr);
    return tmpArray;
  }

  static uint8ArrayToString(array: Uint8Array): string {
    let arrayString = '';
    for (let i = 0; i < array.length; i++) {
      arrayString += String.fromCharCode(array[i]);
    }
    return arrayString;
  }

  /**
   * aes加密
   * @param message
   * @param callback
   */
  static async aesEncrypt(message: string, secretKey?: string): Promise<string> {
    // Logger.debug(TAG, `aesEncrypt message: ${message}`);
    // 组装convertKey所需的二进制密钥数据
    let base64Helper = new util.Base64Helper();
    let pubKey = base64Helper.decodeSync(secretKey ?? AES_ENCRYPT_KEY); // AES密钥
    let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKey };
    // 创建对称密钥生成器
    let aesGenerator = cryptoFramework.createSymKeyGenerator(AES128);
    // 转换/生成对称密钥对象
    let symKey: cryptoFramework.SymKey = await aesGenerator.convertKey(pubKeyBlob)
    // 生成加解密生成器
    let cipher = cryptoFramework.createCipher(AES128_ECB_PKCS5);
    // 初始化加密
    await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, null)
    // 封装加密所需数据
    let input: cryptoFramework.DataBlob = { data: AesUtils.stringToUint8Array(message) };
    // 当数据量较小时,可以在init完成后直接调用doFinal
    // 当数据量较大时,可以多次调用update,即分段加解密。
    let output: cryptoFramework.DataBlob = await cipher.doFinal(input)
    // Logger.info(TAG, "aesEncrypt output.data is " + output.data);
    let result = base64Helper.encodeToStringSync(output?.data)
    // Logger.info(TAG, "aesEncrypt result is " + result);
    return result;
  }

  /**
   * aes解密
   * @param message
   * @param callback
   */
  static async aesDecrypt(message: string, secretKey?: string): Promise<string> {
    // Logger.debug(TAG, `aesDecrypt message: ${message}`);
    // 组装convertKey所需的二进制密钥数据
    let base64Helper = new util.Base64Helper();
    let pubKey = base64Helper.decodeSync(secretKey ?? AES_ENCRYPT_KEY); // AES密钥
    let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKey };
    // 创建对称密钥生成器
    let aesGenerator = cryptoFramework.createSymKeyGenerator(AES128);
    // 转换/生成对称密钥对象
    let symKey: cryptoFramework.SymKey = await aesGenerator.convertKey(pubKeyBlob)
    //  生成加解密生成器
    let cipher = cryptoFramework.createCipher(AES128_ECB_PKCS5);
    // 初始化加密
    await cipher.init(cryptoFramework.CryptoMode.DECRYPT_MODE, symKey, null)
    // 封装加密所需数据
    let newMessage = base64Helper.decodeSync(message);
    let input: cryptoFramework.DataBlob = { data: newMessage };
    // 当数据量较小时,可以在init完成后直接调用doFinal
    // 当数据量较大时,可以多次调用update,即分段加解密。
    let output: cryptoFramework.DataBlob = await cipher.doFinal(input)
    // Logger.debug(TAG, "aesDecrypt is output.data " + output?.data);
    let result = AesUtils.uint8ArrayToString(output?.data)
    // Logger.debug(TAG, "aesDecrypt result is " + result);
    return result
  }
}