鸿蒙Next原生应用开发AES加解密

简介:本文介绍了将Android AES加解密功能移植到鸿蒙系统的实现过程。代码展示了使用ArkTS语言开发的CipherModel类,包含AES-128 CBC模式加解密功能,支持PKCS5/PKCS7填充。主要实现字符串与Uint8Array的转换、密钥处理(截取前16字节作为密钥,后续作为IV)、基于cryptoFramework的加密/解密流程,并通过Base64进行数据编码/解码转换。使用示例展示了如何调用aesEncrypt方法进行加密操作。该实现保留了与Android版本相似的功能接口,同时适配了鸿蒙系统的加解密API。

之前项目时android的现在在尝试移植开发一个鸿蒙原生的,中间碰到AES加解密,根据原有的android代码,转换为ArcTS。代码如下:

TypeScript 复制代码
import util from '@ohos.util';
import cryptoFramework from '@ohos.security.cryptoFramework';
import { Logger } from './Logger';


const TAG: string = '[CipherModel]'
const AES128: string = 'AES128';
const AES128_CBC_PKCS5: string = 'AES128|CBC|PKCS5';
const AES128_PKCS7: string = 'AES128|PKCS7';

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


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


  aesEncrypt(message: string, key: string,  callback:(result:string)=>void) {
    let that = new util.Base64Helper();
    if(key.length>16){
      key = key.substring(0,16)
    }
    let iv = key.substring(16)
    let paramsSpec: cryptoFramework.IvParamsSpec = { iv: { data: this.stringToUint8Array(iv) }, algName: "IvParamsSpec" }
    let aesGenerator = cryptoFramework.createSymKeyGenerator(AES128);
    let cipher = cryptoFramework.createCipher(AES128_CBC_PKCS5);
    let pubKey = that.decodeSync(key);
    let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKey };
    aesGenerator.convertKey(pubKeyBlob, (err, symKey) => {
      if (err) {
        console.error("convertKey: error.");
        return;
      }
      cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, paramsSpec, (err, data) => {
        let input: cryptoFramework.DataBlob = { data: this.stringToUint8Array(message) };
        cipher.doFinal(input, (err, data) => {
          Logger.info(TAG, "EncryptOutPut is " + data.data);
          let result = that.encodeToStringSync(data.data)
          Logger.info(TAG, "result is " + result);
          callback(result)
        })
      })
    })
  }


  aesDecrypt(message: string, key: string, callback:(result:string)=>void) {
    if(key.length>16){
      key = key.substring(0,16)
    }
    let iv = key.substring(16)
    let paramsSpec: cryptoFramework.IvParamsSpec = { iv: { data: this.stringToUint8Array(iv) }, algName: "IvParamsSpec" }


    let aesGenerator = cryptoFramework.createSymKeyGenerator(AES128);
    let cipher = cryptoFramework.createCipher(AES128_CBC_PKCS5);
    let that = new util.Base64Helper();
    let pubKey = that.decodeSync(key);
    let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKey };
    aesGenerator.convertKey(pubKeyBlob, (err, symKey) => {
      if (err) {
        console.error("convertKey: error.");
        return;
      }
      cipher.init(cryptoFramework.CryptoMode.DECRYPT_MODE, symKey, paramsSpec, (err, data) => {
        let newMessage = that.decodeSync(message);
        let input: cryptoFramework.DataBlob = { data: newMessage };
        cipher.doFinal(input, (err, data) => {
          Logger.info(TAG, "DecryptOutPut is " + data.data);
          let result = this.uint8ArrayToString(data.data)
          Logger.info(TAG, "result is " + result);
          callback(result)
        })
      })
    })
  }
}

其中Key是密钥,每次加解密需要输入对应的密钥,自己可以自定义,使用方法:

TypeScript 复制代码
 this.cipherModel.aesEncrypt(//加密
      this.newPwdStr,//加密内容
      CommonConstants.sKey,//加密密钥
      (result: string) => {
        Logger.info("加密", `this result = ${JSON.stringify(result)}`);
        this.cipherText = result;//加密结果
      })
相关推荐
廖松洋(Alina)2 小时前
04极速划词页面实现-鸿蒙PC端Electron开发
华为·electron·开源·harmonyos·鸿蒙
廖松洋(Alina)3 小时前
03主入口页面与导航结构-鸿蒙PC端Electron开发
前端·javascript·华为·electron·开源·harmonyos·鸿蒙
廖松洋(Alina)3 小时前
09词根分解与水印展示-鸿蒙PC端Electron开发
前端·javascript·华为·electron·开源·harmonyos·鸿蒙
廖松洋(Alina)3 小时前
08单词切换与底部导航-鸿蒙PC端Electron开发
华为·electron·鸿蒙
廖松洋(Alina)4 小时前
01环境搭建与项目创建-鸿蒙PC端Electron开发
华为·electron·开源·harmonyos·鸿蒙
三声三视4 小时前
Electron鸿蒙桌面应用打包部署完全指南(含自动更新)
前端·electron·前端框架·harmonyos·鸿蒙·桌面端
三声三视4 小时前
Electron for 鸿蒙PC:用 Node-API 打通原生系统调用,告别“Web 孤岛
electron·harmonyos·桌面应用·鸿蒙
三声三视1 天前
Electron+鸿蒙桌面应用实战:跨平台开发完全指南
electron·harmonyos·鸿蒙·桌面
阿钱真强道2 天前
19 小凌派 rk2206 鸿蒙 LiteOS-M 任务详解
华为·鸿蒙·任务·liteos·详解·rk2206·小凌派
阿钱真强道2 天前
18 小凌派 rk2206 鸿蒙 liteos 如何通过修改配置文件,编译不通的案例
华为·鸿蒙·编译·案例·liteos·rk2206