HarmonyOS鸿蒙Next中如何生成一个aes的字符串加密算法呢

HarmonyOS鸿蒙Next中如何生成一个aes的字符串加密算法呢 您好,我们项目中需要用aes128加密一个字符串,密码为:“a1b2c3d4e5012345”; 填充为 PKCS1Padding;没有偏移量,输出结果也是一个字符串,网站(http://tool.chacuo.net/cryptaes)上的效果如附件;如何用arkts实现加密算法方法呢?官方给的文档我没看懂怎么用?

3 回复
import { cryptoFramework } from '@kit.CryptoArchitectureKit';
import { util } from '@kit.ArkTS';

/**
 * aes_ecb_pkcs5
 */
@Entry
@Component
struct Index {
  @State message: string = 'Hello World';
  @State enText: string = '';
  @State deText: string = '';
  @State enTargetText: string = 'FzAvEpEPx0Cc+wzKUAh6+WVlSx3DY+MVdZw3eCxBuY8=';
  @State deTargetText: string = '~miaocc.dev-s.yunduoketang.cn';
  base = new util.Base64Helper();
  async aesEncrypt(text: string, puKey: string): Promise<string> {
    let globalResult = ""
    try {
      //这里已AES加解密为例支持AES、SM4、3DES
      let cipherAlgName = 'AES128|ECB|PKCS5';
      // 创建加解密对象
      let globalCipher = cryptoFramework.createCipher(cipherAlgName);
      //这里已AES加解密为例支持AES、SM4、3DES
      let symAlgName = 'AES128';
      //创建密钥对象
      let symKeyGenerator = cryptoFramework.createSymKeyGenerator(symAlgName);
      let textEncoder = new util.TextEncoder();
      let buffer = new ArrayBuffer(20);
      let res = new Uint8Array(buffer);
      res = textEncoder.encodeInto(puKey);
      let keyBlob: cryptoFramework.DataBlob = { data: res }
      //导入外部密钥
      let promiseSymKey = await symKeyGenerator.convertKey(keyBlob)
      //初始化
      await globalCipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, promiseSymKey, null);
      //加密
      let result = await globalCipher.doFinal({ data: this.stringToUint8Array(text) })
      //将加密结果转换为base64格式,用于保存或者传递
      globalResult = this.base.encodeToStringSync(result.data);
    } catch (err) {
      console.log(err.message)
    }
    return globalResult;
  }
  // 解密
  async aesDecrypt(text: string, key: string) {
    let globalResult = ""
    try {
      //这里已AES加解密为例支持AES、SM4、3DES
      let cipherAlgName = 'AES128|ECB|PKCS5';
      // 创建加解密对象
      let globalCipher = cryptoFramework.createCipher(cipherAlgName);
      //这里已AES加解密为例支持AES、SM4、3DES
      let symAlgName = 'AES128';
      //创建密钥对象
      let symKeyGenerator = cryptoFramework.createSymKeyGenerator(symAlgName);
      // let dataUint8Array = base.decodeSync(key)
      let textEncoder = new util.TextEncoder();
      let buffer = new ArrayBuffer(20);
      let res = new Uint8Array(buffer);
      res = textEncoder.encodeInto(key);
      let keyBlob: cryptoFramework.DataBlob = { data: res }
      //导入外部密钥
      let promiseSymKey = await symKeyGenerator.convertKey(keyBlob)
      await globalCipher.init(cryptoFramework.CryptoMode.DECRYPT_MODE, promiseSymKey, null);
      let plainText: cryptoFramework.DataBlob = { data: this.base.decodeSync(text) }
      let result = await globalCipher.doFinal(plainText)
      //将解密后的结果result解码之后得到明文
      globalResult = this.uint8ArrayToString(result.data);
      console.log("解密后的明文==》" + globalResult)
      this.deText = globalResult
    } catch (err) {
      console.log(err.message)
    }
  }
  uint8ArrayToString(dataArray: Uint8Array) {
    let dataString = '';
    for (let i = 0; i < dataArray.length; i++) {
      dataString += String.fromCharCode(dataArray[i]);
    }
    return dataString;
  }
  stringToUint8Array(str: string): Uint8Array {
    let arr: number[] = [];
    for (let i = 0, j = str.length; i < j; ++i) {
      arr.push(str.charCodeAt(i));
    }
    let tmpUint8Array = new Uint8Array(arr);
    return tmpUint8Array;
  }
  build() {
    Column({space:10}) {
      Text(`加密结果:${this.enText}`)
      Text(`加密匹配结果:${this.enText === this.enTargetText}`)
      Button('加密').onClick(async () => {
        this.enText = await this.aesEncrypt('~miaocc.dev-s.yunduoketang.cn', 'a1b2c3d4e5012345')
      })
      Button('解密').onClick(async () => {
        await this.aesDecrypt(this.enText, 'a1b2c3d4e5012345')
      })
      Text(`解密结果:${this.deText}`)
      Text(`解密匹配结果:${this.deText === this.deTargetText}`)
    }
    .width('100%')
    .height('100%')
    .justifyContent(FlexAlign.Center)
  }
}

更多关于HarmonyOS鸿蒙Next中如何生成一个aes的字符串加密算法呢的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,生成一个AES字符串加密算法可以使用ohos.security.crypto模块提供的API。以下是一个简单的示例代码,展示如何使用AES加密字符串:

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

function aesEncrypt(plainText: string, key: string): string {
    // 将密钥转换为Uint8Array
    const keyBytes = new TextEncoder().encode(key);

    // 创建AES密钥对象
    const aesKey = crypto.createSymKeyGenerator('AES').convertKey(keyBytes);

    // 创建AES加密器
    const cipher = crypto.createCipher('AES/CBC/PKCS7');

    // 初始化加密器
    cipher.init(aesKey, 'AES/CBC/PKCS7');

    // 加密数据
    const plainBytes = new TextEncoder().encode(plainText);
    const encryptedBytes = cipher.doFinal(plainBytes);

    // 将加密后的数据转换为Base64字符串
    return btoa(String.fromCharCode(...new Uint8Array(encryptedBytes)));
}

// 使用示例
const encryptedText = aesEncrypt('Hello, HarmonyOS!', 'my-secret-key');
console.log(encryptedText);

这段代码定义了aesEncrypt函数,接受明文和密钥作为输入,返回加密后的Base64字符串。crypto.createSymKeyGenerator用于生成AES密钥,crypto.createCipher用于创建加密器,cipher.init初始化加密器,cipher.doFinal执行加密操作。

在HarmonyOS鸿蒙Next中,生成AES字符串加密算法可以使用javax.crypto包中的类。首先,初始化KeyGenerator生成AES密钥,然后使用Cipher类进行加密。示例如下:

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.util.Base64;

public class AESExample {
    public static void main(String[] args) throws Exception {
        KeyGenerator keyGen = KeyGenerator.getInstance("AES");
        keyGen.init(128); // 128位密钥
        SecretKey secretKey = keyGen.generateKey();

        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);

        String original = "Hello, HarmonyOS!";
        byte[] encrypted = cipher.doFinal(original.getBytes());
        String encryptedString = Base64.getEncoder().encodeToString(encrypted);

        System.out.println("Encrypted: " + encryptedString);
    }
}

此代码生成AES密钥并加密字符串,输出Base64编码的加密结果。

回到顶部