鸿蒙 加解密:非对称加解密算法(二)
本文介绍了非对称加密技术中的RSA和SM2算法。RSA采用公钥/私钥机制,支持512-8192位密钥长度,提供NoPadding、PKCS1和PKCS1_OAEP三种填充模式,其中2048位密钥配合PKCS1_OAEP是推荐方案。SM2是中国国密标准算法,基于椭圆曲线密码体制,固定256位密钥长度,密文采用C1C3C2格式,支持包括SM3在内的多种摘要算法。文章详细对比了两种算法的参数配置、数据长
本文同步发表于微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新
一、非对称加密
非对称加密使用一对密钥:公钥和私钥。公钥用于加密,私钥用于解密,适合密钥分发和数字签名场景。
| 算法 | 特点 | 应用场景 |
|---|---|---|
| RSA | 最常用的非对称加密算法 | 数字签名、密钥交换、数据加密 |
| SM2 | 国密非对称算法 | 国产化场景,合规要求 |
二、RSA算法
RSA(Rivest-Shamir-Adleman)是最常用的非对称加密算法。加密长度需要在固定长度进行,当数据量不足时,需要通过不同的填充模式进行数据填充。
RSA支持的密钥长度
| 密钥长度 | 说明 |
|---|---|
| RSA512 | 512位(64字节),安全性较低 |
| RSA768 | 768位(96字节) |
| RSA1024 | 1024位(128字节),已不推荐 |
| RSA2048 | 2048位(256字节),推荐 |
| RSA3072 | 3072位(384字节) |
| RSA4096 | 4096位(512字节) |
| RSA8192 | 8192位(1024字节) |
提示:生成大位数密钥(RSA2048及以上)或明文长度超过2048时,建议使用异步接口或多线程并发能力,避免主线程超时。
RSA三种填充模式
| 填充模式 | 说明 | 输入数据限制 | 输出数据长度 |
|---|---|---|---|
| NoPadding | 不带填充 | 必须等于RSA密钥字节长度 | 等于密钥字节长度 |
| PKCS1 | RSAES-PKCS1-V1_5模式 | ≤ 密钥字节长度 - 11 | 等于密钥字节长度 |
| PKCS1_OAEP | RSAES-OAEP模式,安全性更高 | ≤ 密钥字节长度 - 2×md摘要长度 - 2 | 等于密钥字节长度 |
填充模式NoPadding
特点:输入数据必须与RSA密钥字节长度一样长。
字符串参数格式:[密钥类型]|NoPadding
| 非对称密钥类型 | 字符串参数 | API版本 |
|---|---|---|
| RSA512 | RSA512|NoPadding | 9+ |
| RSA768 | RSA768|NoPadding | 9+ |
| RSA1024 | RSA1024|NoPadding | 9+ |
| RSA2048 | RSA2048|NoPadding | 9+ |
| RSA3072 | RSA3072|NoPadding | 9+ |
| RSA4096 | RSA4096|NoPadding | 9+ |
| RSA8192 | RSA8192|NoPadding | 9+ |
| RSA | RSA|NoPadding | 10+ |
API 10+特性:支持不带密钥长度的规格,加解密运算取决于实际输入的密钥长度。
填充模式PKCS1
特点:对应OpenSSL中的RSA_PKCS1_PADDING,输入数据最大长度 = 密钥字节长度 - 11。
字符串参数格式:[密钥类型]|PKCS1
| 非对称密钥类型 | 字符串参数 | API版本 |
|---|---|---|
| RSA512 | RSA512|PKCS1 | 9+ |
| RSA768 | RSA768|PKCS1 | 9+ |
| RSA1024 | RSA1024|PKCS1 | 9+ |
| RSA2048 | RSA2048|PKCS1 | 9+ |
| RSA3072 | RSA3072|PKCS1 | 9+ |
| RSA4096 | RSA4096|PKCS1 | 9+ |
| RSA8192 | RSA8192|PKCS1 | 9+ |
| RSA | RSA|PKCS1 | 10+ |
填充模式PKCS1_OAEP
特点:对应OpenSSL中的RSA_PKCS1_OAEP_PADDING,安全性更高,需要设置摘要和掩码摘要。
OAEP相关参数:
| 参数 | 说明 |
|---|---|
| md | 摘要算法 |
| mgf | 掩码生成算法,目前仅支持MGF1 |
| mgf1_md | MGF1算法中使用的摘要算法 |
| pSource | 字节流,用于编码输入(API 10+可设置) |
字符串参数格式:[密钥类型]|PKCS1_OAEP|[摘要]|[MGF1_摘要]
示例:RSA2048|PKCS1_OAEP|SHA256|MGF1_SHA256
RSA2048示例数据长度计算
以RSA2048(密钥字节长度256)为例:
| 填充模式 | 输入数据最大字节长度 | 输出数据字节长度 |
|---|---|---|
| NoPadding | 256 | 256 |
| PKCS1 | 245(256-11) | 256 |
| PKCS1_OAEP(SHA256摘要32字节) | 190(256-2×32-2) | 256 |
RSA PKCS1_OAEP完整规格表
| 密钥长度 | 支持摘要 | 支持掩码摘要 | API版本 |
|---|---|---|---|
| RSA512 | MD5、SHA1、SHA224 | MGF1_MD5、MGF1_SHA1、MGF1_SHA224、MGF1_SHA256 | 9+ |
| RSA768 | MD5、SHA1、SHA224、SHA256 | 支持MGF1_MD5到MGF1_SHA512 | 9+ |
| RSA1024 | MD5、SHA1、SHA224、SHA256、SHA384 | 支持MGF1_MD5到MGF1_SHA512 | 9+ |
| RSA2048+ | MD5、SHA1、SHA224、SHA256、SHA384、SHA512 | 支持MGF1_MD5到MGF1_SHA512 | 9+ |
注意:当RSA密钥为512位时,不支持SHA512摘要。
获取/设置OAEP参数(API 10+)
| OAEP参数 | 枚举值 | 获取 | 设置 |
|---|---|---|---|
| md | OAEP_MD_NAME_STR | √ | - |
| mgf | OAEP_MGF_NAME_STR | √ | - |
| mgf1_md | OAEP_MGF1_MD_STR | √ | - |
| pSource | OAEP_MGF1_PSRC_UINT8ARR | √ | √ |
三、SM2国密算法
SM2是中国国家密码管理局发布的国密非对称加密算法,基于椭圆曲线密码体制(ECC)。加密结果由三部分组成:C1、C2、C3。
| 组成部分 | 说明 |
|---|---|
| C1 | 根据随机数计算出的椭圆曲线点(包含xCoordinate和yCoordinate) |
| C2 | 密文数据 |
| C3 | 通过指定摘要算法计算的杂凑值 |
支持的密钥长度
| 密钥长度 | 说明 |
|---|---|
| SM2_256 | 256位,标准SM2密钥长度 |
支持的摘要算法
| 摘要算法 | API版本 |
|---|---|
| MD5 | 10+ |
| SHA1 | 10+ |
| SHA224 | 10+ |
| SHA256 | 10+ |
| SHA384 | 10+ |
| SHA512 | 10+ |
| SM3(国密摘要) | 10+ |
字符串参数格式
格式:SM2_[密钥长度]|[摘要算法] 或 SM2|[摘要算法]
示例:
-
SM2_256|MD5 -
SM2_256|SHA256 -
SM2_256|SM3 -
SM2|SM3(API 10+,不带密钥长度)
SM2规格表
| 非对称密钥类型 | 摘要算法 | API版本 |
|---|---|---|
| SM2_256 | MD5、SHA1、SHA224、SHA256、SHA384、SHA512、SM3 | 10+ |
| SM2 | MD5、SHA1、SHA224、SHA256、SHA384、SHA512、SM3 | 10+ |
获取SM2摘要参数(API 11+)
| SM2加解密参数 | 枚举值 | 获取 | 设置 |
|---|---|---|---|
| md | SM2_MD_NAME_STR | √ | - |
SM2密文格式转换(API 12+)
SM2密文格式为国密标准的ASN.1格式,各参数组合顺序为C1C3C2。
SM2密文参数:
| 参数 | 说明 |
|---|---|
| xCoordinate | x分量,即C1_X |
| yCoordinate | y分量,即C1_Y |
| cipherTextData | 密文,即C2 |
| hashData | 杂凑值,即C3 |
支持的格式转换模式:
| SM2密文格式转换模式 | 基于参数生成SM2密文 | 从SM2密文中获取参数 |
|---|---|---|
| C1C3C2 | √ | √ |
四、字符串参数格式速查
4.1 RSA配置示例
| 场景 | 字符串参数 |
|---|---|
| RSA2048无填充 | RSA2048|NoPadding |
| RSA2048 PKCS1填充 | RSA2048|PKCS1 |
| RSA2048 OAEP(SHA256摘要) | RSA2048|PKCS1_OAEP|SHA256|MGF1_SHA256 |
| RSA2048 OAEP(SHA512摘要) | RSA2048|PKCS1_OAEP|SHA512|MGF1_SHA512 |
| 不带密钥长度的RSA | RSA|PKCS1|OAEP |
4.2 SM2配置示例
| 场景 | 字符串参数 |
|---|---|
| SM2-256 MD5摘要 | SM2_256|MD5 |
| SM2-256 SHA256摘要 | SM2_256|SHA256 |
| SM2-256 SM3摘要(国密) | SM2_256|SM3 |
| 不带密钥长度的SM2 | SM2|SM3 |
五、数据长度限制速查表
5.1 RSA2048(256字节)数据长度限制
| 填充模式 | 输入数据最大长度 | 输出数据长度 |
|---|---|---|
| NoPadding | 256字节 | 256字节 |
| PKCS1 | 245字节 | 256字节 |
| PKCS1_OAEP(SHA256) | 190字节 | 256字节 |
| PKCS1_OAEP(SHA512) | 126字节 | 256字节 |
5.2 RSA其他密钥长度计算公式
密钥字节长度 = 密钥位数 ÷ 8
| 密钥 | 字节长度 | PKCS1最大输入 | OAEP(SHA256)最大输入 |
|---|---|---|---|
| RSA1024 | 128 | 117 | 62 |
| RSA2048 | 256 | 245 | 190 |
| RSA4096 | 512 | 501 | 446 |
计算公式:
-
PKCS1:密钥字节长度 - 11
-
PKCS1_OAEP:密钥字节长度 - 2×md摘要长度 - 2
RSA vs SM2对比
| 对比项 | RSA | SM2 |
|---|---|---|
| 密钥长度 | 512-8192位 | 256位 |
| 填充模式 | NoPadding、PKCS1、PKCS1_OAEP | 固定格式 |
| 摘要算法 | 与OAEP配合 | MD5、SHA系列、SM3 |
| 应用场景 | 通用国际标准 | 国密合规场景 |
鸿蒙非对称加密支持RSA(NoPadding/PKCS1/PKCS1_OAEP)和SM2(C1C3C2格式)两种算法,通过算法|模式|摘要字符串参数配置,其中RSA2048+PKCS1_OAEP是推荐的通用方案,SM2+SM3是国密合规方案。
更多推荐




所有评论(0)