HarmonyOS Next 之使用AES实现对称加解密

2025-06-18 14:51:00
108次阅读
0个评论

概述

AES-GCM(高级加密标准-Galois/Counter Mode)是一种兼具加密和认证功能的对称加密算法。其在保证数据机密性的同时,通过生成认证标签提供完整性校验能力。适用于对安全要求较高的敏感数据传输场景,如支付凭证、生物特征等信息加密。

优势特性:

  • 同时提供加密和认证功能
  • 并行计算效率高
  • 支持附加认证数据(AAD)
  • 标准化程度高,安全性强

开发步骤

1. 生成对称密钥

使用cryptoFramework.createSymKeyGenerator创建AES密钥生成器,指定密钥长度为256位。

import cryptoFramework from '@ohos.security.cryptoFramework';

// 生成AES256密钥
async function generateAESKey(): Promise<cryptoFramework.SymKey> {
  try {
    let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES256');
    let symKey = await symKeyGenerator.generateSymKey();
    console.info('AES key generated successfully');
    return symKey;
  } catch (error) {
    console.error(`Key generation failed: ${error.code}, ${error.message}`);
    throw error;
  }
}
  1. 执行加密操作

通过createCipher创建GCM模式加密器,配置加密参数:

async function encryptData(
  symKey: cryptoFramework.SymKey,
  plainText: string
): Promise<{ cipherData: Uint8Array; iv: Uint8Array }> {
  try {
    let cipher = cryptoFramework.createCipher('AES256|GCM|PKCS7');
    
    // 设置加密参数
    let iv = new Uint8Array(12); // GCM推荐12字节IV
    window.crypto.getRandomValues(iv);
    let gcmParams = {
      algName: 'GcmParamsSpec',
      iv: iv,
      aad: new Uint8Array([]), // 可选附加认证数据
      authTagLen: 128 // 认证标签长度(bits)
    };
    await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, gcmParams);

    // 执行加密
    let input: cryptoFramework.DataBlob = { data: new TextEncoder().encode(plainText) };
    let cipherData = await cipher.doFinal(input);
    console.info('Encryption successful');
    return { cipherData: cipherData.data, iv: iv };
  } catch (error) {
    console.error(`Encryption failed: ${error.code}, ${error.message}`);
    throw error;
  }
}
  1. 执行解密操作

使用相同的密钥和IV初始化解密器,处理密文数据:

async function decryptData(
  symKey: cryptoFramework.SymKey,
  cipherData: Uint8Array,
  iv: Uint8Array
): Promise<string> {
  try {
    let cipher = cryptoFramework.createCipher('AES256|GCM|PKCS7');
    
    // 配置与加密一致的参数
    let gcmParams = {
      algName: 'GcmParamsSpec',
      iv: iv,
      aad: new Uint8Array([]),
      authTagLen: 128
    };
    await cipher.init(cryptoFramework.CryptoMode.DECRYPT_MODE, symKey, gcmParams);

    // 执行解密
    let input: cryptoFramework.DataBlob = { data: cipherData };
    let plainData = await cipher.doFinal(input);
    return new TextDecoder().decode(plainData.data);
  } catch (error) {
    console.error(`Decryption failed: ${error.code}, ${error.message}`);
    throw error;
  }
}

完整示例调用

async function aesGcmDemo() {
  try {
    // 1. 生成密钥
    let symKey = await generateAESKey();
    
    // 2. 加密数据
    let plainText = 'HarmonyOS4.0 secret message';
    let { cipherData, iv } = await encryptData(symKey, plainText);
    
    // 3. 解密数据
    let decryptedText = await decryptData(symKey, cipherData, iv);
    console.info(`Decryption result: ${decryptedText === plainText}`);
  } catch (error) {
    console.error(`Process error: ${error.code}, ${error.message}`);
  }
}
收藏00

登录 后评论。没有帐号? 注册 一个。