HarmonyOS鸿蒙Next中AES解密失败,麻烦提供下AES加解密代码,能解密描述中的字符串

HarmonyOS鸿蒙Next中AES解密失败,麻烦提供下AES加解密代码,能解密描述中的字符串 AES 解密失败,麻烦提供下AES加解密鸿蒙代码,能解密描述中的字符串

3 回复
测试结果: 08-07 09:23:33.719 2903-2903 A0ff00/[Sample_Cipher] com.examp...cproject I [CryptoToos], result is {"errorMsg":"用户名密码错误","msgcode":"36","loginEmp":null,"time":null,"count":null,"isRemind":null,"flag":null}

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

// 字节流转成可理解的字符串
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;
}

// 摘要结果是Uint8Array类型,转换得到十六进制字符串数据
function uint8ArrayToHexStr(data: Uint8Array): string {
  let hexString = "";
  for (let i = 0; i < data.length; i++) {
    let char = ('00' + data[i].toString(16)).slice(-2);
    hexString += char;
  }
  return hexString;
}

/**
 * AES Encrypt
 * [@param](/user/param) message
 * [@param](/user/param) callback
 */
function aesEncrypt(message: string, callback: Callback<string>) {
  let aesGenerator = cryptoFramework.createSymKeyGenerator(AES128);
  let cipher = cryptoFramework.createCipher(AES128_PKCS7);
  let pubKey = this.stringToUint8Array(AES_ENCRYPT_KEY)
  let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKey };
  aesGenerator.convertKey(pubKeyBlob, (err, symKey) => {
    if (err) {
      console.error("convertKey: error." + (err as BusinessError).code);
      return;
    }
    cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, null, (err, data) => {
      let input: cryptoFramework.DataBlob = { data: this.stringToUint8Array(message) };
      cipher.doFinal(input, (err, data) => {
        Logger.info(TAG, "EncryptOutPut is " + data.data);
        let that = new util.Base64Helper();
        let result = that.encodeToStringSync(data.data)
        Logger.info(TAG, "result is " + result);
        callback(result)
        // vexLOx6pW8+2k1MfWrnGMg==
      })
    })
  })
}

/**
 * AES Decrypt
 * [@param](/user/param) message
 * [@param](/user/param) callback
 */
function aesDecrypt(message: string, callback: Callback<string>) {
  let aesGenerator = cryptoFramework.createSymKeyGenerator(AES128);
  let cipher = cryptoFramework.createCipher(AES128_PKCS7);
  let pubKey = this.stringToUint8Array(AES_ENCRYPT_KEY);
  let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKey };
  aesGenerator.convertKey(pubKeyBlob, (err, symKey) => {
    if (err) {
      console.error("convertKey: error." + (err as BusinessError).code);
      return;
    }
    cipher.init(cryptoFramework.CryptoMode.DECRYPT_MODE, symKey, null, (err, data) => {
      try {
        let that = new util.Base64Helper();
        let newMessage = that.decodeSync(message);
        let input: cryptoFramework.DataBlob = { data: newMessage };
        cipher.doFinal(input, (err, data) => {
          if (err) {
            Logger.error(TAG, "cipher doFinal." + (err as BusinessError).code);
            return;
          }
          Logger.info(TAG, "DecryptOutPut is " + data?.data);
          let result = this.uint8ArrayToString(data?.data)
          Logger.info(TAG, "result is " + result);
          callback(result)
        })
      } catch (err) {
        Logger.info(TAG, "cipher init error: " + (err as BusinessError).code);
        return err;
      }
    })
  })
}

更多关于HarmonyOS鸿蒙Next中AES解密失败,麻烦提供下AES加解密代码,能解密描述中的字符串的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,AES加解密可以通过ohos.security.crypto模块实现。以下是AES加解密的示例代码:

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

function aesEncrypt(plainText: string, key: Uint8Array, iv: Uint8Array): Uint8Array {
    const cipher = crypto.createCipher('AES-128-CBC', key, {iv: iv});
    return cipher.update(plainText);
}

function aesDecrypt(cipherText: Uint8Array, key: Uint8Array, iv: Uint8Array): string {
    const decipher = crypto.createDecipher('AES-128-CBC', key, {iv: iv});
    return decipher.update(cipherText);
}

// 示例使用
const key = new Uint8Array([0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c]);
const iv = new Uint8Array([0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f]);
const plainText = 'Hello, HarmonyOS!';

const encrypted = aesEncrypt(plainText, key, iv);
const decrypted = aesDecrypt(encrypted, key, iv);

console.log('Decrypted:', decrypted);

确保密钥和IV的长度符合AES标准(如AES-128使用16字节)。解密失败可能是由于密钥、IV或加密模式不匹配。

在HarmonyOS鸿蒙Next中,AES加解密可以使用javax.crypto包提供的API。以下是一个简单的AES加解密示例代码:

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class AESUtil {

    private static final String ALGORITHM = "AES";
    private static final String TRANSFORMATION = "AES/ECB/PKCS5Padding";

    public static String encrypt(String data, String key) throws Exception {
        SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), ALGORITHM);
        Cipher cipher = Cipher.getInstance(TRANSFORMATION);
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        byte[] encryptedBytes = cipher.doFinal(data.getBytes());
        return Base64.getEncoder().encodeToString(encryptedBytes);
    }

    public static String decrypt(String encryptedData, String key) throws Exception {
        SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), ALGORITHM);
        Cipher cipher = Cipher.getInstance(TRANSFORMATION);
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedData));
        return new String(decryptedBytes);
    }

    public static void main(String[] args) throws Exception {
        String key = "1234567890123456"; // 16字节密钥
        String data = "Hello, HarmonyOS!";
        String encrypted = encrypt(data, key);
        System.out.println("Encrypted: " + encrypted);
        String decrypted = decrypt(encrypted, key);
        System.out.println("Decrypted: " + decrypted);
    }
}

请确保密钥长度为16、24或32字节,并确保加密和解密时使用相同的密钥和算法模式。如果解密失败,请检查加密字符串、密钥和算法模式是否一致。

回到顶部