AES 加密输出二进制数据,直接转字符串会导致编码错误

mb688f1f0a32254
发布于 2025-8-3 16:37
浏览
0收藏

AES 加密输出二进制数据,直接转字符串会导致编码错误
import cryptoFramework from ‘@ohos.security.cryptoFramework’;
import util from ‘@ohos.util’;

// AES配置参数
const AES_CONFIG = {
algName: “AES”,
keySize: 256, // 密钥长度:128/192/256
mode: “CBC”, // 加密模式:CBC/CTR/GCM
padding: “PKCS5”, // 填充模式
iv: new Uint8Array(16).fill(0) // 初始化向量 (实际使用需随机生成)
};

// 生成随机密钥 (同步方法)
function generateAesKey(): Uint8Array {
const keyGenerator = cryptoFramework.createSymKeyGenerator(“AES”);
return keyGenerator.generateSymKey(AES_CONFIG.keySize).getEncoded();
}

// 加密:String → Base64
async function aesEncrypt(plainText: string, key: Uint8Array): Promise<string> {
// 1. 创建加密器
const cipher = cryptoFramework.createCipher({
algName: ${AES_CONFIG.algName}/${AES_CONFIG.mode}/${AES_CONFIG.padding}
});

// 2. 初始化密钥
const symKey = cryptoFramework.createSymKey(key);
await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, {
algName: “IvParamsSpec”,
iv: AES_CONFIG.iv
});

// 3. 处理中文编码
const textEncoder = new util.TextEncoder();
const dataBlob: cryptoFramework.DataBlob = {
data: textEncoder.encodeInto(plainText)
};

// 4. 执行加密
const encryptData = await cipher.doFinal(dataBlob);

// 5. 转Base64避免乱码
const base64 = new util.Base64Helper();
return base64.encodeToStringSync(encryptData.data);
}

// 解密:Base64 → String
async function aesDecrypt(cipherText: string, key: Uint8Array): Promise<string> {
// 1. Base64解码
const base64 = new util.Base64Helper();
const cipherData = base64.decodeSync(cipherText);

// 2. 创建解密器
const cipher = cryptoFramework.createCipher({
algName: ${AES_CONFIG.algName}/${AES_CONFIG.mode}/${AES_CONFIG.padding}
});

// 3. 初始化密钥
const symKey = cryptoFramework.createSymKey(key);
await cipher.init(cryptoFramework.CryptoMode.DECRYPT_MODE, symKey, {
algName: “IvParamsSpec”,
iv: AES_CONFIG.iv
});

// 4. 执行解密
const decryptData = await cipher.doFinal({ data: cipherData });

// 5. 处理中文解码
const textDecoder = new util.TextDecoder(“utf-8”);
return textDecoder.decode(decryptData.data);
}

// 使用示例
async function testAes() {
try {
const originalText = “你好HarmonyOS Next! 测试中文加密🔐”;
const aesKey = generateAesKey();

// 加密
const encrypted = await aesEncrypt(originalText, aesKey);
console.log("加密结果:", encrypted); // 输出Base64字符串

// 解密
const decrypted = await aesDecrypt(encrypted, aesKey);
console.log("解密结果:", decrypted); // 应还原原始中文

} catch (err) {
console.error(“加解密失败:”, err);
}
}

testAes();

收藏
回复
举报
回复
    相关推荐