HarmonyOS鸿蒙Next中使用AES对称密钥(CBC模式)加解密解密一个长的base64字符串

HarmonyOS鸿蒙Next中使用AES对称密钥(CBC模式)加解密解密一个长的base64字符串 使用AES对称密钥(CBC模式)加解密解密一个长的base64字符串怎么实现

3 回复

【背景知识】 AES加解密算法是一种常见的对称加解密算法。

数据类型介绍。

  • Base64编码:Base64编码是一种常用于将二进制数据转换为ASCII字符串的编码方式。
  • Uint8Array:Uint8Array是一种基本的JavaScript数组类型,用于处理二进制数据。它是定长的,包含八个位(bit)的无符号整数(0到255),非常适合处理原始字节数据。

【解决方案】

完整示例代码如下:

import { cryptoFramework } from "@kit.CryptoArchitectureKit";
import { buffer, util } from "@kit.ArkTS";
import { BusinessError } from '@kit.BasicServicesKit';

async function aesEncryptString(data: string): Promise<string> {
  let symKey = await genSymKeyByData(new Uint8Array(buffer.from('aeskey0123456789', 'utf-8').buffer));
  let plainText: cryptoFramework.DataBlob = {
    data: new Uint8Array(buffer.from(data, 'utf-8').buffer)
  };
  let encryptText = await encryptMessagePromise(symKey, plainText);
  return new util.Base64Helper().encodeToString(encryptText.data)
}

async function aesDecryptString(data: string): Promise<string> {
  let symKey = await genSymKeyByData(new Uint8Array(buffer.from('aeskey0123456789', 'utf-8').buffer))
  let uint8ArrayDecryptString = new util.Base64Helper().decodeSync(data)
  let plainText: cryptoFramework.DataBlob = {
    data: uint8ArrayDecryptString
  };
  let decryptText = await decryptMessagePromise(symKey, plainText)
  return new util.Base64Helper().encodeToString(decryptText.data)
}

// 加密方法
async function encryptMessagePromise(symKey: cryptoFramework.SymKey, plainText: cryptoFramework.DataBlob) {
  let cipher = cryptoFramework.createCipher('AES128|CBC|PKCS7');
  let iv = genIvParamsSpec();
  await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, iv);
  let cipherData = await cipher.doFinal(plainText);
  return cipherData;
}

// 解密方法
async function decryptMessagePromise(symKey: cryptoFramework.SymKey, cipherText: cryptoFramework.DataBlob) {
  let decoder = cryptoFramework.createCipher('AES128|CBC|PKCS7');
  let iv = genIvParamsSpec();
  await decoder.init(cryptoFramework.CryptoMode.DECRYPT_MODE, symKey, iv);
  let decryptData = await decoder.doFinal(cipherText);
  return decryptData;
}

function genIvParamsSpec() {
  let ivBlob: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from('0123456789101112', 'utf-8').buffer) };
  let ivParamsSpec: cryptoFramework.IvParamsSpec = {
    algName: "IvParamsSpec",
    iv: ivBlob
  };
  return ivParamsSpec;
}

async function genSymKeyByData(symKeyData: Uint8Array) {
  let symKeyBlob: cryptoFramework.DataBlob = { data: symKeyData };
  let aesGenerator = cryptoFramework.createSymKeyGenerator('AES128');
  let symKey = await aesGenerator.convertKey(symKeyBlob);
  return symKey
}

function main() {
  let encryptString: string = ''
  aesEncryptString('This is a test').then((data) => {
    encryptString = data;
    console.info(`encryptString = ${encryptString}`)
    aesDecryptString(encryptString).then((data) => {
      console.info(`test string base64 = ${data}`)
      let stringUint8Array = new util.Base64Helper().decodeSync(data)
      let decoder = util.TextDecoder.create('utf-8');
      let testString = decoder.decodeToString(stringUint8Array);
      console.info(`test string = ${testString}`)
    }).catch((error: BusinessError) => {
      console.error(`DecryptString failed, error code: ${error.code}, error message: ${error.message}`);
    })
  })
}

打印结果如下:

encryptString = aqHCyoI0dFwQ873GtpLSpw==
test string base64 = VGhpcyBpcyBhIHRlc3Q=
test string = This is a test

更多关于HarmonyOS鸿蒙Next中使用AES对称密钥(CBC模式)加解密解密一个长的base64字符串的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,使用AES-CBC模式加解密长Base64字符串需导入@ohos.security.cryptoFramework。创建对称密钥生成器,指定AES算法和CBC模式,生成密钥。使用cipher模块初始化加解密实例,设置密钥和参数(如IV向量)。对Base64字符串先解码为Uint8Array,再分段处理数据。加密后结果可编码为Base64输出;解密时反向操作,Base64解码后传入解密接口还原数据。注意数据对齐和错误处理。

在HarmonyOS Next中实现AES-CBC模式加解密长base64字符串,可以按照以下步骤:

  1. 密钥与IV生成

    • 使用KeyGenerator生成AES密钥
    • 通过IvParameterSpec生成16字节IV向量
  2. 加密流程

    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParameterSpec);
    byte[] encrypted = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8));
    String base64Encrypted = Base64.getEncoder().encodeToString(encrypted);
    
  3. 解密流程

    cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec);
    byte[] decoded = Base64.getDecoder().decode(base64Encrypted);
    byte[] decrypted = cipher.doFinal(decoded);
    String result = new String(decrypted, StandardCharsets.UTF_8);
    
  4. 长字符串处理

    • 对于超长数据,建议分段处理(每次处理≤16MB)
    • 使用Cipher.update()进行流式处理
    • 最后调用doFinal()完成操作
  5. 注意事项

    • 确保IV在加解密时保持一致
    • 使用相同的密钥和填充模式
    • 考虑内存管理,及时清理敏感数据

建议使用华为提供的HUKS(HarmonyOS Universal Keystore Service)进行密钥安全管理,避免硬编码密钥。

回到顶部