HarmonyOS5 便捷生活类——实现高效且安全的RSA与AES混合加密过程

加入下方官方优快云班级,得鸿蒙礼盒

一起拿鸿蒙礼盒,戳我戳我!!

本期活动时间:2025年8月1日-12月31日

如有问题欢迎私聊我呀!


问题现象

基于HarmonyOS 5.0开发的物联网应用,在有限的设备资源计算能力、存储容量下,如何实现高效且安全的RSA与AES混合加密过程,同时保证设备的实时响应性能?

背景知识

  • 适用场景:

    RSA 更适合用于加密小数据量(如对称密钥)和身份验证(如数字签名)。

    AES 更适合用于加密大量数据(如文件、通信流)。

  • RSA密钥长度:

    1024位:这是目前主流的推荐长度,适用于大多数应用场景。

    2048位:适用于对安全性要求更高的场景,如金融或政府领域。

    3072位和4096位:适用于极高安全需求的场景,但计算效率会显著降低。

    密钥生成时间:密钥长度增加一倍,密钥对生成的时间可能增加16倍。

    加密和解密操作:公钥加密操作时长增加4倍,私钥解密操作时长增加8倍。

  • AES密钥长度:

    128位(16字节):适用于大多安全场景。

    192位(24字节):提供更高的安全性,适用于对安全性要求较高的场景。

    256位(32字节):提供最高级别的安全性,适用于对安全性要求极高的场景。

    安全性:密钥长度越长,安全性越高,但计算开销也越大。

    性能:较短的密钥(如128位)在性能上更具优势,适合对性能要求较高的场景。

    兼容性:128位密钥被广泛支持,而192位和256位密钥在某些环境中可能需要额外配置。

解决方案

结合背景知识,在实现RSA和AES混合加密过程中,我们可以选择AES-128加密实际数据,RSA-1024用于安全传输 AES 密钥。具体实现步骤如下:

  1. 使用算法框架 cryptoFramework 生成aes-128的密钥。
  2. 使用算法框架 cryptoFramework 生成RSA-1024的密钥对。
  3. 使用 RSA 公钥加密 AES 密钥后,将密文单独保存。
  4. 使用 AES 密钥加密数据后进行传输。
  5. 使用 RSA 解密AES密钥,获取AES密钥。
  6. 使用 AES 密钥解密数据后进行传输。

完整示例参考如下:

import { cryptoFramework } from '@kit.CryptoArchitectureKit';
import { buffer } from '@kit.ArkTS';

// 生成RSA密钥对
function genKeyPairByData(pubKeyData: Uint8Array, priKeyData: Uint8Array) {
let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKeyData };
let priKeyBlob: cryptoFramework.DataBlob = { data: priKeyData };
let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024');
let keyPair = rsaGenerator.convertKeySync(pubKeyBlob, priKeyBlob);
console.info('convertKeySync success');
return keyPair;
}

// 生成AES密钥
function genSymKeyByData(symKeyData: Uint8Array) {
let symKeyBlob: cryptoFramework.DataBlob = { data: symKeyData };
let aesGenerator = cryptoFramework.createSymKeyGenerator('AES128');
let symKey = aesGenerator.convertKeySync(symKeyBlob);
console.info('convertKeySync success');
return symKey;
}

// 使用RSA公钥加密AES密钥
function encryptAESKey(publicKey: cryptoFramework.PubKey, plainText: cryptoFramework.DataBlob) {
let cipher = cryptoFramework.createCipher('RSA1024|PKCS1');
cipher.initSync(cryptoFramework.CryptoMode.ENCRYPT_MODE, publicKey, null);
let encryptData = cipher.doFinalSync(plainText);
return encryptData;
}


// 使用AES密钥加密数据
function encryptMessage(symKey: cryptoFramework.SymKey, plainText: cryptoFramework.DataBlob) {
let cipher = cryptoFramework.createCipher('AES128|ECB|PKCS7');
cipher.initSync(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, null); // ECB模式params为null。
let cipherData = cipher.doFinalSync(plainText);
return cipherData;
}

// 使用RSA解密AES密钥
function decryptAESKey(privateKey: cryptoFramework.PriKey, cipherText: cryptoFramework.DataBlob) {
let decoder = cryptoFramework.createCipher('RSA1024|PKCS1');
decoder.initSync(cryptoFramework.CryptoMode.DECRYPT_MODE, privateKey, null);
let decryptData = decoder.doFinalSync(cipherText);
return decryptData;
}

// 使用AES密钥解密数据
function decryptMessage(symKey: cryptoFramework.SymKey, cipherText: cryptoFramework.DataBlob) {
let decoder = cryptoFramework.createCipher('AES128|ECB|PKCS7');
decoder.initSync(cryptoFramework.CryptoMode.DECRYPT_MODE, symKey, null); // ECB模式params为null。
let decryptData = decoder.doFinalSync(cipherText);
return decryptData;
}

function main() {
// 创建RSA密钥对
let pkData_RSA = new Uint8Array([]);
let skData_RSA = new Uint8Array([]);
let keyPair_RSA = genKeyPairByData(pkData_RSA, skData_RSA);
let pubKey_RSA = keyPair_RSA.pubKey;
let priKey_RSA = keyPair_RSA.priKey;

// 创建AES密钥
let keyData_AES = new Uint8Array([]);

// 使用RSA公钥加密AES密钥
let plainText_AESKey: cryptoFramework.DataBlob = { data: keyData_AES };
let encryptText_AESKey = encryptAESKey(pubKey_RSA, plainText_AESKey);

// 使用AES密钥加密数据
let message = "This is a test";
let symKey = genSymKeyByData(keyData_AES);
let plainText_Mes: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from(message, 'utf-8').buffer) };
let encryptText = encryptMessage(symKey, plainText_Mes);

// 使用RSA解密AES密钥
let decryptText_AESKey = decryptAESKey(priKey_RSA, encryptText_AESKey);

// 使用RSA解密AES密钥
let symKey_by_RSA = genSymKeyByData(decryptText_AESKey.data);
let decryptText = decryptMessage(symKey_by_RSA, encryptText);
let dec_message = buffer.from(decryptText.data).toString('utf-8')
console.info('结果对比:' + (message === dec_message))
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值