HarmonyOS鸿蒙Next ArkTS中如何使用AES加密和解密

发布于 1周前 作者 caililin 来自 鸿蒙OS

HarmonyOS鸿蒙Next ArkTS中如何使用AES加密和解密 ArkTs中如何使用AES加密和解密

3 回复
AES加解密demo

```typescript
import { aesEncrypt, aesDecrypt } from './Test3';
[@Component](/user/Component)
struct Test {
  [@State](/user/State) plainText: string = 'Hello World';
  [@State](/user/State) plainText1: string = '';
  [@State](/user/State) ciphertext1: string = '';
  [@State](/user/State) iv: string = '1234564512345645';
  [@State](/user/State) keys: string = 'CjZwwvt13DJTTOCD0/z1cw==';
  scroller: Scroller = new Scroller()
  build() {
    Stack({ alignContent: Alignment.TopStart }) {
      Scroll(this.scroller) {
        Column() {
          Text("AES128加解密")
            .fontSize(50)
            .fontWeight(FontWeight.Bold)
          Column() {
            Text("待加密的内容")
              .fontSize(15)
              .fontWeight(FontWeight.Bold)
            TextInput({ text: this.plainText }).onChange(value => {
              this.plainText = value
            })
            Text("密钥")
              .fontSize(15)
              .fontWeight(FontWeight.Bold)
            TextInput({ text: this.keys }).onChange(value => {
              this.keys = value
            })
            Text("偏移量")
              .fontSize(15)
              .fontWeight(FontWeight.Bold)
            TextInput({ text: this.iv }).onChange(value => {
              this.iv = value
            })
            Button("AES128|ECB|PKCS7加密").onClick(async () => {
              this.ciphertext1 = await aesEncrypt(this.plainText, this.keys)
              console.log("aes Encrypt = " + this.ciphertext1);
            })
            TextInput({ text: this.ciphertext1 })
            Button("ECB解密").onClick(async () => {
              this.plainText1 = await aesDecrypt(this.ciphertext1, this.keys)
            })
            TextInput({ text: this.plainText1 })
          }
          .width('100%')
        }
      }
      .scrollable(ScrollDirection.Vertical) // 滚动方向纵向
      .scrollBar(BarState.On) // 滚动条常驻显示
      .scrollBarColor(Color.Gray) // 滚动条颜色
      .scrollBarWidth(10) // 滚动条宽度
      .friction(0.6)
      .edgeEffect(EdgeEffect.None)
      .onScroll((xOffset: number, yOffset: number) => {
        console.info(xOffset + ' ' + yOffset)
      })
      .onScrollEdge((side: Edge) => {
        console.info('To the edge')
      })
      .onScrollStop(() => {
        console.info('Scroll Stop')
      })
    }
  }
}
//加密
import { cryptoFramework } from '[@kit](/user/kit).CryptoArchitectureKit';
import { base, stringToUint8Array, uint8ArrayToString } from './Test4';

export async function aesEncrypt(text: string, puKey: string): Promise<string> {
  let globalResult = ""
  try {
    let cipherAlgName = 'AES128|ECB|PKCS7';
    let globalCipher = cryptoFramework.createCipher(cipherAlgName);
    let symAlgName = 'AES128';
    let symKeyGenerator = cryptoFramework.createSymKeyGenerator(symAlgName);
    let dataUint8Array = base.decodeSync(puKey)
    let keyBlob: cryptoFramework.DataBlob = { data: dataUint8Array }
    let promiseSymKey = await symKeyGenerator.convertKey(keyBlob)
    await globalCipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, promiseSymKey, null);
    let result = await globalCipher.doFinal({ data: stringToUint8Array(text) })
    globalResult = base.encodeToStringSync(result.data);
  } catch (err) {
    console.log(err.message)
  }
  return globalResult;
}

// 解密
export async function aesDecrypt(text: string, key: string) {
  let globalResult = ""
  try {
    let cipherAlgName = 'AES128|ECB|PKCS7';
    let globalCipher = cryptoFramework.createCipher(cipherAlgName);
    let symAlgName = 'AES128';
    let symKeyGenerator = cryptoFramework.createSymKeyGenerator(symAlgName);
    let dataUint8Array = base.decodeSync(key)
    let keyBlob: cryptoFramework.DataBlob = { data: dataUint8Array }
    let promiseSymKey = await symKeyGenerator.convertKey(keyBlob)
    await globalCipher.init(cryptoFramework.CryptoMode.DECRYPT_MODE, promiseSymKey, null);
    let plainText: cryptoFramework.DataBlob = { data: base.decodeSync(text) }
    let result = await globalCipher.doFinal(plainText)
    globalResult = uint8ArrayToString(result.data);
    console.log("解密后的明文==》" + globalResult)
  } catch (err) {
    console.log(err.message)
  } finally {
    return globalResult
  }
}
import buffer from '[@ohos](/user/ohos).buffer';
import util from '[@ohos](/user/ohos).util';
export function uint8ArrayToHexStr(data: Uint8Array): string {
  return buffer.from(data).toString('hex');
}
//十六进制转Uint8Array
export function HexStrTouint8Array(data: string): Uint8Array {
  return new Uint8Array(buffer.from(data, 'hex').buffer);
}
export const base = new util.Base64Helper();
// 字符串转成字节流
export function stringToUint8Array(str: string) {
  return new Uint8Array(buffer.from(str,'utf-8').buffer);
}
// 字节流转成可理解的字符串
export function uint8ArrayToString(array:Uint8Array) {
  let out: string = "";
  let index: number = 0;
  let len: number = array.length;
  while (index < len) {
    let character = array[index++];
    switch(character >> 4) {
      case 0:
      case 1:
      case 2:
      case 3:
      case 4:
      case 5:
      case 6:
      case 7:
        out += String.fromCharCode(character);
        break;
      case 12:
      case 13:
        out += String.fromCharCode(((character & 0x1F) << 6) | (array[index++] & 0x3F));
        break;
      case 14:
        out += String.fromCharCode(((character & 0x0F) << 12) | ((array[index++] & 0x3F) << 6) | ((array[index++] & 0x3F) << 0));
        break;
      default:
        break;
    }
  }
  return out;
}

更多关于HarmonyOS鸿蒙Next ArkTS中如何使用AES加密和解密的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,使用ArkTS进行AES加密和解密可以通过cryptoFramework模块实现。首先,导入cryptoFramework模块:

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

创建对称密钥生成器并生成AES密钥:

let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES256');
let keyBlob = symKeyGenerator.generateSymKey();

使用生成的密钥进行加密:

let cipher = cryptoFramework.createCipher('AES256|ECB|PKCS7');
cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, keyBlob, null);
let plainText = 'Hello, HarmonyOS!';
let input = { data: stringToUint8Array(plainText) };
cipher.doFinal(input).then(data => {
    console.info('Encrypted data:', data.data);
});

使用相同的密钥进行解密:

cipher.init(cryptoFramework.CryptoMode.DECRYPT_MODE, keyBlob, null);
let encryptedData = { data: data.data };
cipher.doFinal(encryptedData).then(data => {
    console.info('Decrypted data:', uint8ArrayToString(data.data));
});

辅助函数stringToUint8Arrayuint8ArrayToString用于字符串与Uint8Array之间的转换:

function stringToUint8Array(str) {
    let arr = new Uint8Array(str.length);
    for (let i = 0; i < str.length; i++) {
        arr[i] = str.charCodeAt(i);
    }
    return arr;
}

function uint8ArrayToString(arr) {
    return String.fromCharCode.apply(null, arr);
}

通过以上步骤,可以在ArkTS中实现AES加密和解密。

在HarmonyOS鸿蒙Next的ArkTS中,使用AES加密和解密可以通过@ohos.security.crypto模块实现。首先,创建AesCipher实例,设置密钥和加密模式(如AES-GCM)。然后,调用encrypt方法进行加密,或调用decrypt方法进行解密。以下是示例代码:

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

const key = new Uint8Array([...]); // 32字节密钥
const data = new Uint8Array([...]); // 待加密数据
const aesCipher = crypto.createAesCipher('AES256|GCM|PKCS7'); // 创建AES实例
aesCipher.init(crypto.CryptoMode.ENCRYPT_MODE, key); // 初始化加密模式
const encrypted = aesCipher.doFinal(data); // 加密数据

aesCipher.init(crypto.CryptoMode.DECRYPT_MODE, key); // 初始化解密模式
const decrypted = aesCipher.doFinal(encrypted); // 解密数据

确保密钥长度符合AES标准(128/192/256位),并处理异常情况。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!