HarmonyOS鸿蒙Next中使用AES对称密钥(CBC模式)加解密解密一个长的base64字符串
HarmonyOS鸿蒙Next中使用AES对称密钥(CBC模式)加解密解密一个长的base64字符串 使用AES对称密钥(CBC模式)加解密解密一个长的base64字符串怎么实现
3 回复
【背景知识】 AES加解密算法是一种常见的对称加解密算法。
数据类型介绍。
- Base64编码:Base64编码是一种常用于将二进制数据转换为ASCII字符串的编码方式。
- Uint8Array:Uint8Array是一种基本的JavaScript数组类型,用于处理二进制数据。它是定长的,包含八个位(bit)的无符号整数(0到255),非常适合处理原始字节数据。
【解决方案】
完整示例代码如下:
import { cryptoFramework } from "@kit.CryptoArchitectureKit";
import { buffer, util } from "@kit.ArkTS";
import { BusinessError } from '@kit.BasicServicesKit';
async function aesEncryptString(data: string): Promise<string> {
let symKey = await genSymKeyByData(new Uint8Array(buffer.from('aeskey0123456789', 'utf-8').buffer));
let plainText: cryptoFramework.DataBlob = {
data: new Uint8Array(buffer.from(data, 'utf-8').buffer)
};
let encryptText = await encryptMessagePromise(symKey, plainText);
return new util.Base64Helper().encodeToString(encryptText.data)
}
async function aesDecryptString(data: string): Promise<string> {
let symKey = await genSymKeyByData(new Uint8Array(buffer.from('aeskey0123456789', 'utf-8').buffer))
let uint8ArrayDecryptString = new util.Base64Helper().decodeSync(data)
let plainText: cryptoFramework.DataBlob = {
data: uint8ArrayDecryptString
};
let decryptText = await decryptMessagePromise(symKey, plainText)
return new util.Base64Helper().encodeToString(decryptText.data)
}
// 加密方法
async function encryptMessagePromise(symKey: cryptoFramework.SymKey, plainText: cryptoFramework.DataBlob) {
let cipher = cryptoFramework.createCipher('AES128|CBC|PKCS7');
let iv = genIvParamsSpec();
await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, iv);
let cipherData = await cipher.doFinal(plainText);
return cipherData;
}
// 解密方法
async function decryptMessagePromise(symKey: cryptoFramework.SymKey, cipherText: cryptoFramework.DataBlob) {
let decoder = cryptoFramework.createCipher('AES128|CBC|PKCS7');
let iv = genIvParamsSpec();
await decoder.init(cryptoFramework.CryptoMode.DECRYPT_MODE, symKey, iv);
let decryptData = await decoder.doFinal(cipherText);
return decryptData;
}
function genIvParamsSpec() {
let ivBlob: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from('0123456789101112', 'utf-8').buffer) };
let ivParamsSpec: cryptoFramework.IvParamsSpec = {
algName: "IvParamsSpec",
iv: ivBlob
};
return ivParamsSpec;
}
async function genSymKeyByData(symKeyData: Uint8Array) {
let symKeyBlob: cryptoFramework.DataBlob = { data: symKeyData };
let aesGenerator = cryptoFramework.createSymKeyGenerator('AES128');
let symKey = await aesGenerator.convertKey(symKeyBlob);
return symKey
}
function main() {
let encryptString: string = ''
aesEncryptString('This is a test').then((data) => {
encryptString = data;
console.info(`encryptString = ${encryptString}`)
aesDecryptString(encryptString).then((data) => {
console.info(`test string base64 = ${data}`)
let stringUint8Array = new util.Base64Helper().decodeSync(data)
let decoder = util.TextDecoder.create('utf-8');
let testString = decoder.decodeToString(stringUint8Array);
console.info(`test string = ${testString}`)
}).catch((error: BusinessError) => {
console.error(`DecryptString failed, error code: ${error.code}, error message: ${error.message}`);
})
})
}
打印结果如下:
encryptString = aqHCyoI0dFwQ873GtpLSpw==
test string base64 = VGhpcyBpcyBhIHRlc3Q=
test string = This is a test
更多关于HarmonyOS鸿蒙Next中使用AES对称密钥(CBC模式)加解密解密一个长的base64字符串的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中,使用AES-CBC模式加解密长Base64字符串需导入@ohos.security.cryptoFramework
。创建对称密钥生成器,指定AES算法和CBC模式,生成密钥。使用cipher
模块初始化加解密实例,设置密钥和参数(如IV向量)。对Base64字符串先解码为Uint8Array,再分段处理数据。加密后结果可编码为Base64输出;解密时反向操作,Base64解码后传入解密接口还原数据。注意数据对齐和错误处理。
在HarmonyOS Next中实现AES-CBC模式加解密长base64字符串,可以按照以下步骤:
-
密钥与IV生成:
- 使用
KeyGenerator
生成AES密钥 - 通过
IvParameterSpec
生成16字节IV向量
- 使用
-
加密流程:
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParameterSpec); byte[] encrypted = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8)); String base64Encrypted = Base64.getEncoder().encodeToString(encrypted);
-
解密流程:
cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec); byte[] decoded = Base64.getDecoder().decode(base64Encrypted); byte[] decrypted = cipher.doFinal(decoded); String result = new String(decrypted, StandardCharsets.UTF_8);
-
长字符串处理:
- 对于超长数据,建议分段处理(每次处理≤16MB)
- 使用
Cipher.update()
进行流式处理 - 最后调用
doFinal()
完成操作
-
注意事项:
- 确保IV在加解密时保持一致
- 使用相同的密钥和填充模式
- 考虑内存管理,及时清理敏感数据
建议使用华为提供的HUKS(HarmonyOS Universal Keystore Service)进行密钥安全管理,避免硬编码密钥。