HarmonyOS鸿蒙Next中AES128|CBC|PKCS7的加密问题

HarmonyOS鸿蒙Next中AES128|CBC|PKCS7的加密问题 加密后字段内容不符的问题 在对jsonstring进行加密时,使用cryptoFramework的AES128|CBC|PKCS7进行加密

3 回复

参考demo试试

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

@Component
@Entry
struct Index {
  getCBCResult: getCBC = new getCBC();
  keys: string = 'NJNGYVWTELBR2A3R';
  iv: string = 'KUGEPZ44SKKKMM30'
  jsonString: string = '上述json字符串'

  build() {
    Column() {
      Button("AES128|CBC|PKCS7加密").onClick(async () => {
        let ciphertextCBC = await this.getCBCResult.encryptAESByCBC(this.jsonString, this.keys, this.iv)
        console.log("aes Encrypt = " + ciphertextCBC);
      })
    }
  }
}

class getCBC {
  async encryptAESByCBC(content: string, publicKey: string, iv: string): Promise<string> {
    let result = ""
    try {
      let pkBlob: cryptoFramework.DataBlob = {
        data: stringToUint8Array(publicKey)
      };
      let generator = cryptoFramework.createSymKeyGenerator('AES128');
      let globalKey = await generator.convertKey(pkBlob);
      let ivData = stringToUint8Array(iv);
      let ivdata: cryptoFramework.DataBlob = { data: ivData };
      let newIv: cryptoFramework.IvParamsSpec = { iv: ivdata, algName: 'IvParamsSpec' } //cbc 模式的参数
      let mode = cryptoFramework.CryptoMode.ENCRYPT_MODE;
      let globalCipher = cryptoFramework.createCipher('AES128|CBC|PKCS7');
      await globalCipher.init(mode, globalKey, newIv);
      let plainText: cryptoFramework.DataBlob = { data: stringToUint8Array(content) };
      let encryptData: cryptoFramework.DataBlob = await globalCipher.doFinal(plainText);
      result = uint8ArrayToHexStr(encryptData.data);
    } catch (err) {
      console.log(err.message)
    }
    return result;
  }
}

function stringToUint8Array(str: string): Uint8Array {
  return new Uint8Array(buffer.from(str, 'utf-8').buffer);
}

function uint8ArrayToHexStr(data: Uint8Array): string {
  return buffer.from(data.buffer).toString('hex');
}

更多关于HarmonyOS鸿蒙Next中AES128|CBC|PKCS7的加密问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,AES128|CBC|PKCS7的加密可以通过cryptoFramework模块实现。首先,创建对称密钥生成器SymKeyGenerator,指定算法为AES128。然后,生成对称密钥SymKey。接着,创建加密操作Cipher,设置模式为CBC,填充方式为PKCS7。最后,使用Cipher进行加密操作,输入数据和密钥,输出加密后的数据。

示例代码如下:

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

let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128');
let symKey = symKeyGenerator.generateSymKey();

let cipher = cryptoFramework.createCipher('AES128|CBC|PKCS7');
cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, null);

let input = { data: new Uint8Array([1, 2, 3, 4, 5]) };
cipher.doFinal(input).then(output => {
    console.log('Encrypted data:', output.data);
});

此代码展示了如何在HarmonyOS鸿蒙Next中使用AES128|CBC|PKCS7进行加密。

在HarmonyOS鸿蒙Next中,使用AES128|CBC|PKCS7进行加密时,首先确保密钥长度为16字节,IV(初始化向量)同样为16字节。通过javax.crypto.Cipher类进行加密操作,设置模式为Cipher.ENCRYPT_MODE,并使用AES/CBC/PKCS7Padding算法。示例代码如下:

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
IvParameterSpec ivSpec = new IvParameterSpec(iv);
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
byte[] encrypted = cipher.doFinal(plainText.getBytes());

确保密钥和IV的安全性,避免硬编码。

回到顶部