HarmonyOS鸿蒙Next 5.0.0中使用ArkTS实现AES/ECB/PKCS5Padding数据加解密

HarmonyOS鸿蒙Next 5.0.0中使用ArkTS实现AES/ECB/PKCS5Padding数据加解密 已经有了安卓版本的应用,想要开发harmonyOs版本的,但是接口数据加解密没有调通。

下面是java语言的

//用这个方式加密数据,key的获取方式在下方提供
public static byte[] aesEncrypt2(String str, String key) throws Exception {
    if (str == null || key == null) {
        return null;
    }
    Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key.getBytes("utf-8"), "AES"));
    byte[] bytes = cipher.doFinal(str.getBytes("utf-8"));
    return bytes;
}

key的获取方式如下

//随机数种子
final static char[] CHARS_ALL = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
        'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u',
        'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
        'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
        'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7',
        '8', '9'};

// 随机密钥
Random rnd = new Random();
StringBuilder keyStrBui = new StringBuilder();
for (int i = 0; i < 16; i++) {
    keyStrBui.append(String.valueOf(CHARS_ALL[rnd.nextInt(62)]));
}
String key = keyStrBui.toString();

下面是我写的arkts版本的,出来的结果完全不一样,该怎么写?

static aesEncrypt(message: string, callback: Function) {
    try {
      let keyData = new Uint8Array([83, 217, 231, 76, 28, 113, 23, 219, 250, 71, 209, 210, 205, 97, 32, 159]);
      let symKey = CipherOffice.genSymKeyByData(keyData);
      let plainText: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from(message, 'utf-8').buffer) };
      let encryptText = CipherOffice.encryptMessage(symKey, plainText);
      let decryptText = CipherOffice.decryptMessage(symKey, encryptText);
      if (plainText.data.toString() === decryptText.data.toString()) {
        Logger.d("encryptData", 'decrypt ok');
        Logger.d("encryptData", 'decrypt plainText: ' + buffer.from(decryptText.data).toString('utf-8'));
      } else {
        Logger.d("encryptData", 'decrypt failed');
      }
      callback(encryptText.data.toString())
    } catch (error) {
      Logger.d("encryptData", `AES ECB “${error}“, error code: ${error.code}`);
    }
  }

// 解密消息
static decryptMessage(symKey: cryptoFramework.SymKey, cipherText: cryptoFramework.DataBlob) {
    let decoder = cryptoFramework.createCipher('AES128|ECB|PKCS7');
    decoder.initSync(cryptoFramework.CryptoMode.DECRYPT_MODE, symKey, null);
    let decryptData = decoder.doFinalSync(cipherText);
    return decryptData;
  }

// 加密消息
static encryptMessage(symKey: cryptoFramework.SymKey, plainText: cryptoFramework.DataBlob) {
    let cipher = cryptoFramework.createCipher('AES128|ECB|PKCS7');
    cipher.initSync(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, null);
    let cipherData = cipher.doFinalSync(plainText);
    return cipherData;
  }

更多关于HarmonyOS鸿蒙Next 5.0.0中使用ArkTS实现AES/ECB/PKCS5Padding数据加解密的实战教程也可以访问 https://www.itying.com/category-93-b0.html

5 回复

参考demo:

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

@Entry
@Component
struct AESEEBCrypto {
  @State message: string = '点击开始';

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(() => {
            aesECB()
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}

const name: string = ""

// 加密消息
function encryptMessage(symKey: cryptoFramework.SymKey, plainText: cryptoFramework.DataBlob) {
  let cipher = cryptoFramework.createCipher('AES128|ECB|PKCS7');
  cipher.initSync(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, null);
  let cipherData = cipher.doFinalSync(plainText);
  return cipherData;
}

// 解密消息
function decryptMessage(symKey: cryptoFramework.SymKey, cipherText: cryptoFramework.DataBlob) {
  let decoder = cryptoFramework.createCipher('AES128|ECB|PKCS7');
  decoder.initSync(cryptoFramework.CryptoMode.DECRYPT_MODE, symKey, null);
  let decryptData = decoder.doFinalSync(cipherText);
  return decryptData;
}

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

function uint8ArrayTo16(arr: Uint8Array) {
  // let arr = new Uint8Array([34, 22, 11, 34]);
  let str = buffer.from(arr).toString('hex')
  console.log(str) // 22160b22
  let str2 = str.toUpperCase()
  console.log(str2) // 22160B22
  return str2;
}

async function aesECB() {
  try {
    let base64 = new util.Base64Helper();
    let keyData = "#@#dengta-app$@$";
    let key16 = new Uint8Array(buffer.from(keyData, 'utf-8').buffer)
    let symKey = await genSymKeyByData(key16);
    let message = `this is a ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt`
    let plainText: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from(message, 'utf-8').buffer) };
    let encryptText = encryptMessage(symKey, plainText);
    console.error('encryptText: ' + encryptText.data.toString());
    console.error('encryptText: ' + buffer.from(encryptText.data).toString("hex").toUpperCase());
    let text64 = base64.encodeToStringSync(encryptText.data)
    console.error('encryptText: text64  ' + text64);
    let text16 = uint8ArrayTo16(encryptText.data)
    console.error('encryptText: text16  ' + text16);
    let decryptText = decryptMessage(symKey, encryptText);
    console.info('decrypt ok');
    console.info('decryptText: ' + decryptText.data.toString());
    console.info('decryptText: ' + buffer.from(decryptText.data).toString('utf-8'));
    console.error('encryptText: text16  ' + text16);
  } catch (error) {
    console.error(`AES ECB "${error}", error code: ${error.code}`);
  }
}

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


加密出来的Uint8Array数据,通过textDecoder.decodeWithStream(input)方法转成string之后,返回的string是乱码(this result =

在HarmonyOS鸿蒙Next 5.0.0中,使用ArkTS实现AES/ECB/PKCS5Padding数据加解密可以通过@ohos.security.crypto模块完成。首先,导入相关模块:

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

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

let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128');
let keyBlob = symKeyGenerator.convertKey({ data: new Uint8Array(16) });

创建加密器并设置加密模式为AES/ECB/PKCS5Padding:

let cipher = cryptoFramework.createCipher('AES128|ECB|PKCS5');
cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, keyBlob, null);

加密数据:

let plainText = 'Hello, HarmonyOS!';
let input = { data: new Uint8Array(plainText.split('').map(char => char.charCodeAt(0))) };
cipher.doFinal(input).then(output => {
    console.log('Encrypted data:', output.data);
});

创建解密器并设置解密模式为AES/ECB/PKCS5Padding:

let decipher = cryptoFramework.createCipher('AES128|ECB|PKCS5');
decipher.init(cryptoFramework.CryptoMode.DECRYPT_MODE, keyBlob, null);

解密数据:

decipher.doFinal(output).then(decrypted => {
    console.log('Decrypted data:', new TextDecoder().decode(decrypted.data));
});

以上代码展示了如何在HarmonyOS鸿蒙Next 5.0.0中使用ArkTS实现AES/ECB/PKCS5Padding数据加解密。

在HarmonyOS鸿蒙Next 5.0.0中,使用ArkTS实现AES/ECB/PKCS5Padding数据加解密可以通过cryptoFramework模块完成。首先,创建Cipher实例并指定算法为AES/ECB/PKCS5Padding。然后,使用init方法初始化加密或解密模式,并传入密钥。最后,调用doFinal方法进行数据加解密。示例代码如下:

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

async function aesEncryptDecrypt() {
  const key = cryptoFramework.createSymKeyGenerator('AES').generateSymKey();
  const cipher = cryptoFramework.createCipher('AES/ECB/PKCS5Padding');
  
  // 加密
  await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, key);
  const encrypted = await cipher.doFinal(new Uint8Array([1, 2, 3]));

  // 解密
  await cipher.init(cryptoFramework.CryptoMode.DECRYPT_MODE, key);
  const decrypted = await cipher.doFinal(encrypted);
}

此代码展示了如何使用ArkTS进行AES/ECB/PKCS5Padding加解密。

回到顶部