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字节,并确保加密和解密时使用相同的密钥和算法模式。如果解密失败,请检查加密字符串、密钥和算法模式是否一致。