如何使用AES算法加密 HarmonyOS 鸿蒙Next

如何使用AES算法加密 HarmonyOS 鸿蒙Next

具体实现可参考如下代码:

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

@Entry
@Component
struct AESEncryptionDecryption { 
  build() { 
    Row() { 
      Button('加解密') 
        .onClick(async () => { 
          // 导入密钥 
          let key = await getKey(); 
          // 加密 
          let globalResult = await aesEncrypt('测试', key); 
          // 解密 
          aesDecrypt(globalResult, key); 
        }) 
        .width('100%') 
        .height(50) 
    } 
    .height('100%') 
  } 
} 

export const base = new util.Base64Helper(); 

// 字节流转成可理解的字符串 
export function uint8ArrayToString(array: Uint8Array) { 
  // 将UTF-8编码转换成Unicode编码 
  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; 
} 

// 字符串转成字节流 
function stringToUint8Array(str: string) { 
  return new Uint8Array(buffer.from(str, 'utf-8').buffer); 
} 

// 获取密钥 
async function getKey() { 
  let symAlgName = 'AES128'; 
  let symKeyGenerator = cryptoFramework.createSymKeyGenerator(symAlgName); 
  let dataUint8Array = stringToUint8Array('Whh82GtW/EVjBkD8'); 
  let keyBlob: cryptoFramework.DataBlob = { data: dataUint8Array }; 
  let promiseSymKey = await symKeyGenerator.convertKey(keyBlob); 
  let key = base.encodeToStringSync(promiseSymKey.getEncoded().data); // 将密钥转换为base64存储 
  return key; 
} 

// 加密 
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); 
    console.info('加密后的明文:' + globalResult); 
  } catch (err) { 
    console.info(err.message); 
  } 
  return globalResult; 
} 

// 解密 
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.info('解密后的明文:' + globalResult); 
  } catch (err) { 
    console.info(err.message); 
  } 
}

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

2 回复

uint8ArrayToString的实现太复杂了,可以参考下面代码

import { util } from '@kit.ArkTS'
export function Uint8ArrayToString(array: Uint8Array): string {
  try {
    let textDecoder = util.TextDecoder.create('utf-8')
    let ret = textDecoder.decodeToString(array)
    return ret
  } catch (error) {
    console.error(error, `error code: ${error.code}`)
    return ''
  }
}

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


在HarmonyOS鸿蒙Next中使用AES算法进行加密,可以通过鸿蒙提供的加解密框架实现。鸿蒙Next提供了cryptoFramework模块,支持多种加密算法,包括AES。以下是一个使用AES算法加密的简单示例:

  1. 导入加解密框架:

    import cryptoFramework from '[@ohos](/user/ohos).security.cryptoFramework';
    
  2. 创建AES加密器:

    let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128');
    let symKey = symKeyGenerator.generateSymKey();
    let cipher = cryptoFramework.createCipher('AES128|ECB|PKCS7');
    
  3. 初始化加密器并设置密钥:

    cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, null);
    
  4. 加密数据:

    let plainText = 'This is a secret message';
    let input = { data: stringToUint8Array(plainText) };
    cipher.doFinal(input).then((output) => {
        let encryptedData = output.data;
        console.log('Encrypted Data:', uint8ArrayToString(encryptedData));
    });
    
  5. 辅助函数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(uint8Array) {
        return String.fromCharCode.apply(null, uint8Array);
    }
    

以上代码展示了如何在鸿蒙Next中使用AES算法进行数据加密。cryptoFramework模块提供了丰富的加解密功能,开发者可以根据需求选择合适的算法和模式。

回到顶部