加入下方官方优快云班级,得鸿蒙礼盒
本期活动时间: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 密钥。具体实现步骤如下:
- 使用算法框架 cryptoFramework 生成aes-128的密钥。
- 使用算法框架 cryptoFramework 生成RSA-1024的密钥对。
- 使用 RSA 公钥加密 AES 密钥后,将密文单独保存。
- 使用 AES 密钥加密数据后进行传输。
- 使用 RSA 解密AES密钥,获取AES密钥。
- 使用 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))
}

被折叠的 条评论
为什么被折叠?



