HarmonyOS Next非对称密钥加解密算法深度剖析

本文旨在深入探讨华为鸿蒙HarmonyOS Next系统(截止目前API12)中非对称密钥加解密算法的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。
在当今数字化的浪潮中,数据的安全性和完整性成为了至关重要的考量因素。HarmonyOS Next系统中的非对称密钥加解密算法在保障数据安全方面扮演着举足轻重的角色,特别是在判断数据来源及确保数据完整性方面,为我们的数字世界筑牢了一道坚固的防线。

一、非对称密钥加解密基础

非对称密钥加解密,简单来说,就是使用公钥和私钥这一对密钥进行加密和解密操作。公钥可以公开,任何人都可以使用它来加密数据,但只有持有对应私钥的人才能解密这些数据。这种机制在HarmonyOS Next中有广泛的应用场景。
在判断数据来源方面,当我们收到一份加密数据时,如果能够使用已知的公钥成功解密,那么我们就可以确信这份数据是由持有对应私钥的一方发送的。这就好比你有一把特制的锁(公钥),只有拥有对应钥匙(私钥)的人才能将东西锁在里面(加密),而你可以用这把锁来验证东西是不是那个人放进去的(解密)。在实际应用中,比如在设备与服务器之间的通信中,服务器可以将自己的公钥发送给设备,设备使用公钥对数据进行加密后发送给服务器,服务器再用私钥解密,这样就能确保数据是来自于合法的设备。
在确保数据完整性方面,非对称密钥加解密算法结合数字签名技术,可以防止数据在传输过程中被篡改。发送方使用私钥对数据的摘要(一种数据的特征值)进行签名,接收方收到数据后,使用发送方的公钥对签名进行验证,如果验证成功,说明数据在传输过程中没有被篡改。这就像是给数据加上了一个独一无二的“指纹”,只要“指纹”没有被破坏,数据就是完整的。

二、RSA算法核心

(一)填充模式特点与使用规则

RSA算法是一种非常重要的非对称加密算法,在HarmonyOS Next中提供了多种填充模式,每种模式都有其独特的特点和使用规则。

  1. PKCS1填充模式
       - 特点:这是一种较为常用的填充模式,对应于RFC3447规范中的RSAES - PKCS1 - V1_5模式。在进行加密时,它会将源数据转化为Encryption block(EB),并且对输入数据的长度有一定要求,即输入的数据最大长度 <= RSA钥模 - 11。
       - 使用规则:当我们使用PKCS1填充模式进行RSA运算时,需要先将源数据按照规定的格式进行转换。例如,在加密一个文件时,要确保文件内容的长度符合要求,然后使用私钥进行加密,加密后的密文长度与RSA钥模一样长。在解密时,使用公钥进行解密操作,同样会得到与原始数据长度相关的结果。
  2. PKCS1_OAEP填充模式
       - 特点:此模式需要设置两个摘要(md和mgf1_md),提供了更高的安全性。它对应于RFC3447规范中的RSAES - OAEP模式。在加密时,输入的数据必须小于RSA钥模 - md摘要长度 - mgf1_md摘要长度 - 2(摘要长度以字节为单位)。
       - 使用规则:假设我们要加密一份重要的合同文档,首先要选择合适的摘要算法(如SHA256),然后根据算法计算出摘要长度,确保文档内容长度满足上述要求。在创建Cipher实例时,需要指定填充模式为PKCS1_OAEP,并传入摘要和掩码摘要等参数。加密后的密文长度同样与RSA钥模一致。解密时,需要使用相同的参数进行初始化,然后对密文进行解密操作。
  3. OnlySign模式
       - 特点:RSA签名不做摘要仅签名功能。对待签名数据有特定的长度要求,并且根据填充模式和是否设置摘要算法而有所不同。
       - 使用规则:如果使用PKCS1填充模式且不设置摘要算法(NoHash),数据需要小于RSA密钥长度 - 11;若设置了摘要算法,则待签名的数据必须是对应的摘要数据。例如,在对一个小型配置文件进行签名时,如果采用PKCS1填充模式且设置了SHA256摘要算法,那么要先计算文件的SHA256摘要值,然后将其作为待签名数据进行签名操作。
  4. Recover模式
       - 特点:提供签名恢复原始数据功能。使用时需要与签名时的参数保持一致,特别是填充模式和摘要算法。
       - 使用规则:在对已签名的数据进行恢复操作时,首先要确保使用的公钥与签名时的私钥相对应,并且在创建Verify实例时,要使用与签名时相同的填充模式和摘要算法。例如,在验证一个已签名的消息并尝试恢复原始数据时,要按照签名时的参数设置进行初始化,然后进行恢复操作。

(二)代码示例展示

  1. PKCS1填充模式下的签名验签示例
import {
   
    cryptoFramework } from '@kit.CryptoArchitectureKit';
import {
   
    buffer } from '@kit.ArkTS';
// 生成RSA密钥对
async function generateRSAKeyPair() {
   
   
    let keyGenAlg = "RSA1024";
    let generator = cryptoFramework.createAsyKeyGenerator(keyGenAlg);
    return await generator.generateKeyPair();
}
// 使用PKCS1填充模式进行签名
async function signMessagePKCS1(priKey, plainText) {
   
   
    let signAlg = "RSA1024|PKCS1|SHA256";
    let signer = cryptoFramework.createSign(signAlg);
    await signer.init(priKey);
    await signer.update(plainText);
    return await signer.sign(null);
}
// 使用PKCS1填充模式进行验签
async function verifyMessagePKCS1(pubKey, cipherText, signData) {
   
   
    let verifyAlg = "RSA1024|PKCS1|SHA256";
    let verifier = cryptoFramework.createVerify(verifyAlg);
    await verifier.init(pubKey);
    await verifier.update(cipherText);
    return await verifier.verify(signData);
}
async function main() {
   
   
    try {
   
   
        // 生成密钥对
        let keyPair = await generateRSAKeyPair();
        // 要签名的消息
        let message = "This is a test";
        let plainText: cryptoFramework.DataBlob = {
   
    data: new Uint8Array(buffer.from(message, 'utf-8').buffer) };
        // 签名
        let signData = await signMessagePKCS1
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值