• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 非对称密钥加解密算法规格
2
3
4当前章节将说明系统目前支持的算法及其对应的规格。
5
6
7对于每种算法采用支持的加密模式,将会在具体的每个算法规格中介绍。
8
9
10## RSA
11
12[RSA](crypto-asym-key-generation-conversion-spec.md#rsa)为非对称加密算法,加密长度需要在固定长度进行,在实际应用中,数据量可能无法达到固定的长度要求,此时可以通过不同的填充模式进行数据填充。
13
14算法库目前提供了RSA加解密常用的三种模式有:
15
16- [NoPadding](#填充模式为nopadding):不带填充,输入的数据必须与RSA钥模(即RSA模数n的字节长度)一样长;输出数据长度与RSA钥模一样长。
17
18- [PKCS1](#填充模式为pkcs1):即RFC3447规范中的RSAES-PKCS1-V1_5模式,对应OpenSSL中的RSA_PKCS1_PADDING。
19
20  在进行RSA运算时需要将源数据D转化为Encryption block(EB),加密时,输入的数据最大长度 <= RSA钥模 - 11;输出数据长度与RSA钥模一样长。
21
22- [PKCS1_OAEP](#填充模式为pkcs1_oaep):即RFC3447规范中的RSAES-OAEP模式,对应OpenSSL中的RSA_PKCS1_OAEP_PADDING。
23
24  此模式需要设置两个摘要(md和mgf1_md),加密时,输入的数据必须小于RSA钥模 - md摘要长度 - mgf1_md摘要长度 - 2(摘要长度以字节为单位);输出数据长度与RSA钥模一样长。
25
26  此模式还可额外设置pSource字节流来定义OAEP填充的编码输入,并且可以获取PKCS1_OAEP的相关参数(如表所示)。
27
28  | PKCS1_OAEP的相关参数 | 说明 |
29  | -------- | -------- |
30  | md | 摘要算法。 |
31  | mgf | 掩码生成算法,目前仅支持MGF1。 |
32  | mgf1_md | MGF1算法中使用的摘要算法。 |
33  | pSource | 字节流,用于编码输入。 |
34
35
36### 填充模式为NoPadding
37
38以字符串参数完成RSA加解密,具体的“字符串参数”由“非对称密钥类型”和“填充模式 NoPadding”使用符号“|”拼接而成,用于在创建非对称加解密实例时,指定算法规格。
39
40| 非对称密钥类型 | 字符串参数 | API版本 |
41| -------- | -------- | -------- |
42| RSA512 | RSA512\|NoPadding | 9+ |
43| RSA768 | RSA768\|NoPadding | 9+ |
44| RSA1024 | RSA1024\|NoPadding | 9+ |
45| RSA2048 | RSA2048\|NoPadding | 9+ |
46| RSA3072 | RSA3072\|NoPadding | 9+ |
47| RSA4096 | RSA4096\|NoPadding | 9+ |
48| RSA8192 | RSA8192\|NoPadding | 9+ |
49| RSA | RSA\|NoPadding | 10+ |
50
51如表中最后一行所示,为了兼容由密钥参数生成的密钥,RSA加解密参数输入密钥类型时支持不带长度,加解密运算取决于实际输入的密钥长度。
52
53
54### 填充模式为PKCS1
55
56以字符串参数完成RSA加解密,具体的“字符串参数”由“非对称密钥类型”和“填充模式 PKCS1”使用符号“|”拼接而成,用于在创建非对称加解密实例时,指定算法规格。
57
58| 非对称密钥类型 | 字符串参数 | API版本 |
59| -------- | -------- | -------- |
60| RSA512 | RSA512\|PKCS1 | 9+ |
61| RSA768 | RSA768\|PKCS1 | 9+ |
62| RSA1024 | RSA1024\|PKCS1 | 9+ |
63| RSA2048 | RSA2048\|PKCS1 | 9+ |
64| RSA3072 | RSA3072\|PKCS1 | 9+ |
65| RSA4096 | RSA4096\|PKCS1 | 9+ |
66| RSA8192 | RSA8192\|PKCS1 | 9+ |
67| RSA | RSA\|PKCS1 | 10+ |
68
69如表中最后一行所示,为了兼容由密钥参数生成的密钥,RSA加解密参数输入密钥类型时支持不带长度,加解密运算取决于实际输入的密钥长度。
70
71
72### 填充模式为PKCS1_OAEP
73
74以字符串参数完成RSA加解密,具体的“字符串参数”由“非对称密钥类型”、“填充模式 PKCS1_OAEP”、摘要、掩码摘要,使用符号“|”拼接而成,用于在创建非对称加解密实例时,指定算法规格。
75
76如表所示,各取值范围(即[]中的内容)中,只能选取一项完成字符串拼接。
77
78举例说明,当需要非对称密钥类型为RSA2048、填充模式为PKCS1_OAEP、摘要算法为SHA256、掩码摘要为MGF1_SHA256的RSA密钥,其字符串参数为"RSA2048|PKCS1_OAEP|SHA256|MGF1_SHA256"。
79
80> **说明:**
81> 输入的数据必须小于RSA钥模 - md摘要长度 - mgf1_md摘要长度 - 2。比如,当RSA密钥为512位时,不支持SHA512。
82
83| 非对称密钥类型 | 填充模式 | 摘要 | 掩码摘要 | API版本 |
84| -------- | -------- | -------- | -------- | -------- |
85| RSA512 | PKCS1_OAEP | MD5 | [MGF1_MD5\|MGF1_SHA1\|MGF1_SHA224\|MGF1_SHA256] | 9+ |
86| RSA512 | PKCS1_OAEP | SHA1 | [MGF1_MD5\|MGF1_SHA1\|MGF1_SHA224\|MGF1_SHA256] | 9+ |
87| RSA512 | PKCS1_OAEP | SHA224 | [MGF1_MD5\|MGF1_SHA1\|MGF1_SHA224\|MGF1_SHA256] | 9+ |
88| RSA768 | PKCS1_OAEP | MD5 | [MGF1_MD5\|MGF1_SHA1\|MGF1_SHA224\|MGF1_SHA256\|MGF1_SHA384\|MGF1_SHA512] | 9+ |
89| RSA768 | PKCS1_OAEP | SHA1 | [MGF1_MD5\|MGF1_SHA1\|MGF1_SHA224\|MGF1_SHA256\|MGF1_SHA384\|MGF1_SHA512] | 9+ |
90| RSA768 | PKCS1_OAEP | SHA224 | [MGF1_MD5\|MGF1_SHA1\|MGF1_SHA224\|MGF1_SHA256\|MGF1_SHA384\|MGF1_SHA512] | 9+ |
91| RSA768 | PKCS1_OAEP | SHA256 | [MGF1_MD5\|MGF1_SHA1\|MGF1_SHA224\|MGF1_SHA256\|MGF1_SHA384] | 9+ |
92| RSA1024 | PKCS1_OAEP | MD5 | [MGF1_MD5\|MGF1_SHA1\|MGF1_SHA224\|MGF1_SHA256\|MGF1_SHA384\|MGF1_SHA512] | 9+ |
93| RSA1024 | PKCS1_OAEP | SHA1 | [MGF1_MD5\|MGF1_SHA1\|MGF1_SHA224\|MGF1_SHA256\|MGF1_SHA384\|MGF1_SHA512] | 9+ |
94| RSA1024 | PKCS1_OAEP | SHA224 | [MGF1_MD5\|MGF1_SHA1\|MGF1_SHA224\|MGF1_SHA256\|MGF1_SHA384\|MGF1_SHA512] | 9+ |
95| RSA1024 | PKCS1_OAEP | SHA256 | [MGF1_MD5\|MGF1_SHA1\|MGF1_SHA224\|MGF1_SHA256\|MGF1_SHA384\|MGF1_SHA512] | 9+ |
96| RSA1024 | PKCS1_OAEP | SHA384 | [MGF1_MD5\|MGF1_SHA1\|MGF1_SHA224\|MGF1_SHA256\|MGF1_SHA384\|MGF1_SHA512] | 9+ |
97| RSA2048 | PKCS1_OAEP | MD5 | [MGF1_MD5\|MGF1_SHA1\|MGF1_SHA224\|MGF1_SHA256\|MGF1_SHA384\|MGF1_SHA512] | 9+ |
98| RSA2048 | PKCS1_OAEP | SHA1 | [MGF1_MD5\|MGF1_SHA1\|MGF1_SHA224\|MGF1_SHA256\|MGF1_SHA384\|MGF1_SHA512] | 9+ |
99| RSA2048 | PKCS1_OAEP | SHA224 | [MGF1_MD5\|MGF1_SHA1\|MGF1_SHA224\|MGF1_SHA256\|MGF1_SHA384\|MGF1_SHA512] | 9+ |
100| RSA2048 | PKCS1_OAEP | SHA256 | [MGF1_MD5\|MGF1_SHA1\|MGF1_SHA224\|MGF1_SHA256\|MGF1_SHA384\|MGF1_SHA512] | 9+ |
101| RSA2048 | PKCS1_OAEP | SHA384 | [MGF1_MD5\|MGF1_SHA1\|MGF1_SHA224\|MGF1_SHA256\|MGF1_SHA384\|MGF1_SHA512] | 9+ |
102| RSA2048 | PKCS1_OAEP | SHA512 | [MGF1_MD5\|MGF1_SHA1\|MGF1_SHA224\|MGF1_SHA256\|MGF1_SHA384\|MGF1_SHA512] | 9+ |
103| RSA3072 | PKCS1_OAEP | MD5 | [MGF1_MD5\|MGF1_SHA1\|MGF1_SHA224\|MGF1_SHA256\|MGF1_SHA384\|MGF1_SHA512] | 9+ |
104| RSA3072 | PKCS1_OAEP | SHA1 | [MGF1_MD5\|MGF1_SHA1\|MGF1_SHA224\|MGF1_SHA256\|MGF1_SHA384\|MGF1_SHA512] | 9+ |
105| RSA3072 | PKCS1_OAEP | SHA224 | [MGF1_MD5\|MGF1_SHA1\|MGF1_SHA224\|MGF1_SHA256\|MGF1_SHA384\|MGF1_SHA512] | 9+ |
106| RSA3072 | PKCS1_OAEP | SHA256 | [MGF1_MD5\|MGF1_SHA1\|MGF1_SHA224\|MGF1_SHA256\|MGF1_SHA384\|MGF1_SHA512] | 9+ |
107| RSA3072 | PKCS1_OAEP | SHA384 | [MGF1_MD5\|MGF1_SHA1\|MGF1_SHA224\|MGF1_SHA256\|MGF1_SHA384\|MGF1_SHA512] | 9+ |
108| RSA3072 | PKCS1_OAEP | SHA512 | [MGF1_MD5\|MGF1_SHA1\|MGF1_SHA224\|MGF1_SHA256\|MGF1_SHA384\|MGF1_SHA512] | 9+ |
109| RSA4096 | PKCS1_OAEP | MD5 | [MGF1_MD5\|MGF1_SHA1\|MGF1_SHA224\|MGF1_SHA256\|MGF1_SHA384\|MGF1_SHA512] | 9+ |
110| RSA4096 | PKCS1_OAEP | SHA1 | [MGF1_MD5\|MGF1_SHA1\|MGF1_SHA224\|MGF1_SHA256\|MGF1_SHA384\|MGF1_SHA512] | 9+ |
111| RSA4096 | PKCS1_OAEP | SHA224 | [MGF1_MD5\|MGF1_SHA1\|MGF1_SHA224\|MGF1_SHA256\|MGF1_SHA384\|MGF1_SHA512] | 9+ |
112| RSA4096 | PKCS1_OAEP | SHA256 | [MGF1_MD5\|MGF1_SHA1\|MGF1_SHA224\|MGF1_SHA256\|MGF1_SHA384\|MGF1_SHA512] | 9+ |
113| RSA4096 | PKCS1_OAEP | SHA384 | [MGF1_MD5\|MGF1_SHA1\|MGF1_SHA224\|MGF1_SHA256\|MGF1_SHA384\|MGF1_SHA512] | 9+ |
114| RSA4096 | PKCS1_OAEP | SHA512 | [MGF1_MD5\|MGF1_SHA1\|MGF1_SHA224\|MGF1_SHA256\|MGF1_SHA384\|MGF1_SHA512] | 9+ |
115| RSA8192 | PKCS1_OAEP | MD5 | [MGF1_MD5\|MGF1_SHA1\|MGF1_SHA224\|MGF1_SHA256\|MGF1_SHA384\|MGF1_SHA512] | 9+ |
116| RSA8192 | PKCS1_OAEP | SHA1 | [MGF1_MD5\|MGF1_SHA1\|MGF1_SHA224\|MGF1_SHA256\|MGF1_SHA384\|MGF1_SHA512] | 9+ |
117| RSA8192 | PKCS1_OAEP | SHA224 | [MGF1_MD5\|MGF1_SHA1\|MGF1_SHA224\|MGF1_SHA256\|MGF1_SHA384\|MGF1_SHA512] | 9+ |
118| RSA8192 | PKCS1_OAEP | SHA256 | [MGF1_MD5\|MGF1_SHA1\|MGF1_SHA224\|MGF1_SHA256\|MGF1_SHA384\|MGF1_SHA512] | 9+ |
119| RSA8192 | PKCS1_OAEP | SHA384 | [MGF1_MD5\|MGF1_SHA1\|MGF1_SHA224\|MGF1_SHA256\|MGF1_SHA384\|MGF1_SHA512] | 9+ |
120| RSA8192 | PKCS1_OAEP | SHA512 | [MGF1_MD5\|MGF1_SHA1\|MGF1_SHA224\|MGF1_SHA256\|MGF1_SHA384\|MGF1_SHA512] | 9+ |
121| RSA | PKCS1_OAEP | 符合长度要求的摘要算法 | MGF1_符合长度要求的摘要算法 | 10+ |
122
123如表中最后一行所示,为了兼容由密钥参数生成的密钥,RSA加解密参数输入密钥类型时支持不带长度,加解密运算取决于实际输入的密钥长度。
124
125
126### 获取/设置OAEP填充模式的参数
127
128从API版本10开始支持RSA使用PKCS1_OAEP填充模式时,获取、设置相关参数,“√”表示支持对获取或设置该参数。
129
130| OAEP参数 | 枚举值 | 获取 | 设置 |
131| -------- | -------- | -------- | -------- |
132| md | OAEP_MD_NAME_STR | √ | - |
133| mgf | OAEP_MGF_NAME_STR | √ | - |
134| mgf1_md | OAEP_MGF1_MD_STR | √ | - |
135| pSource | OAEP_MGF1_PSRC_UINT8ARR | √ | √ |
136
137
138## SM2
139
140[SM2](crypto-asym-key-generation-conversion-spec.md#sm2)为非对称加密算法,加密长度需要在固定长度进行。算法库目前支持以GM/T 0009-2012定义的格式加密或解密数据。
141
142SM2非对称加密的结果由C1,C2,C3三部分组成。其中C1是根据生成的随机数计算出的椭圆曲线点,C2是密文数据,C3是通过指定摘要算法计算的值。
143
144当前支持以字符串参数完成SM2加解密,具体的“字符串参数”由“非对称密钥类型(加解密算法+密钥长度)”、“摘要算法”使用符号“|”拼接而成,用于在创建对称加解密实例时,指定算法规格。
145
146如表所示,各取值范围(即[]中的内容)中,只能选取一项完成字符串拼接。SM2算法和密钥长度中间采用符号“_”拼接。
147
148举例说明,当密钥长度为256bit、摘要算法为MD5的SM2密钥,其字符串参数为"SM2_256|MD5"。
149| 非对称密钥类型 | 摘要算法 | API版本 |
150| -------- | -------- | -------- |
151| SM2_256 | [MD5\|SHA1\|SHA224\|SHA256\|SHA384\|SHA512\|SM3] | 10+ |
152| SM2 | [MD5\|SHA1\|SHA224\|SHA256\|SHA384\|SHA512\|SM3] | 10+ |
153
154如表中最后一行所示,为了兼容由密钥参数生成的密钥,SM2加解密参数输入密钥类型时支持不带长度,加解密运算取决于实际输入的密钥长度。
155
156
157### 获取SM2摘要算法参数
158
159从API版本11开始支持SM2获取摘要算法参数,“√”表示支持对获取或设置该参数。
160
161| SM2加解密参数 | 枚举值 | 获取 | 设置 |
162| -------- | -------- | -------- | -------- |
163| md | SM2_MD_NAME_STR | √ | - |
164