本文同步发表于微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新

一、非对称加密

非对称加密使用一对密钥:公钥私钥。公钥用于加密,私钥用于解密,适合密钥分发和数字签名场景。

算法 特点 应用场景
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是国密合规方案。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐