• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 非对称密钥生成和转换规格
2
3
4当前章节将说明系统目前支持的算法及其对应的规格。密钥生成有两种指定规格的方式,分别是:
5
6
7- 字符串参数:以字符串的形式描述开发者需要生成的密钥规格。
8
9- 密钥参数:使用密钥的详细密码学信息,构造密钥对象。
10
11
12对于每种算法采用哪种方式,将会在具体的每个算法规格中介绍。
13
14
15## RSA
16
17RSA(Rivest–Shamir–Adleman),当前支持使用字符串参数和密钥参数两种方式生成RSA密钥。
18
19
20### 使用字符串参数生成
21
22以字符串参数生成RSA密钥,具体的“字符串参数”由“RSA密钥类型”和“素数个数”使用符号“|”拼接而成,用于在创建非对称密钥生成器时,指定密钥规格。
23
24> **说明:**
25> 生成RSA非对称密钥时,默认素数为2,PRIMES_2参数可省略。
26
27| RSA密钥类型 | 素数个数 | 字符串参数 | API版本 |
28| -------- | -------- | -------- | -------- |
29| RSA512 | 2 | RSA512\|PRIMES_2 | 9+ |
30| RSA768 | 2 | RSA768\|PRIMES_2 | 9+ |
31| RSA1024 | 2 | RSA1024\|PRIMES_2 | 9+ |
32| RSA1024 | 3 | RSA1024\|PRIMES_3 | 9+ |
33| RSA2048 | 2 | RSA2048\|PRIMES_2 | 9+ |
34| RSA2048 | 3 | RSA2048\|PRIMES_3 | 9+ |
35| RSA3072 | 2 | RSA3072\|PRIMES_2 | 9+ |
36| RSA3072 | 3 | RSA3072\|PRIMES_3 | 9+ |
37| RSA4096 | 2 | RSA4096\|PRIMES_2 | 9+ |
38| RSA4096 | 3 | RSA4096\|PRIMES_3 | 9+ |
39| RSA4096 | 4 | RSA4096\|PRIMES_4 | 9+ |
40| RSA8192 | 2 | RSA8192\|PRIMES_2 | 9+ |
41| RSA8192 | 3 | RSA8192\|PRIMES_3 | 9+ |
42| RSA8192 | 4 | RSA8192\|PRIMES_4 | 9+ |
43| RSA8192 | 5 | RSA8192\|PRIMES_5 | 9+ |
44
45
46### 使用密钥参数生成
47
48从API版本10开始支持,使用密钥参数生成RSA密钥。
49
50RSA密钥参数,涉及三个整数,包括:
51
52- n:模数(Modulus),是私钥和公钥的公共参数。
53
54- sk:私钥指数(privateExponent),公式中常写作d。
55
56- pk:公钥指数(publicExponent),公式中常写作e。
57
58当创建非对称密钥生成器时,对于指定公/私钥参数生成RSA密钥的支持情况如表所示:
59
60- √:表示需要指定这一列中的具体属性,来构成密钥参数。
61
62- ×:表示这一列中的具体属性对应某种密钥参数,但是当前不支持通过该密钥参数生成密钥。
63
64|  | 公共参数 | 公钥参数 | 私钥参数 | 公私钥对参数 |
65| -------- | -------- | -------- | -------- | -------- |
66| n | × | √ | × | √ |
67| pk | - | √ | - | √ |
68| sk | - | - | × | √ |
69
70由上表可知:
71
72- RSA不支持通过指定公共参数(n)来随机生成密钥。
73
74- RSA不支持通过指定私钥参数(n, sk)来生成私钥。
75
76
77## ECC
78
79ECC(Elliptic Curve Cryptography),是一种基于椭圆曲线数学的公钥密码算法。
80
81椭圆曲线算法可以看作是定义在特殊集合下数的运算,当前算法库支持的ECC密钥均为Fp域的椭圆曲线,p为素数,Fp域也称素数域。
82
83当前支持使用字符串参数和密钥参数两种方式生成ECC密钥,且支持通过曲线名生成公共密钥参数。
84
85
86### 使用字符串参数生成
87
88以字符串参数生成ECC密钥,具体的“字符串参数”由“非对称密钥算法”和“密钥长度”拼接而成,用于在创建非对称密钥生成器时,指定密钥规格。
89
90| 非对称密钥算法 | 密钥长度(bit) | 曲线名 | 字符串参数 | API版本 |
91| -------- | -------- | -------- | -------- | -------- |
92| ECC | 224 | NID_secp224r1 | ECC224 | 9+ |
93| ECC | 256 | NID_X9_62_prime256v1 | ECC256 | 9+ |
94| ECC | 384 | NID_secp384r1 | ECC384 | 9+ |
95| ECC | 521 | NID_secp521r1 | ECC521 | 9+ |
96| ECC | 160 | NID_brainpoolP160r1 | ECC_BrainPoolP160r1 | 11+ |
97| ECC | 160 | NID_brainpoolP160t1 | ECC_BrainPoolP160t1 | 11+ |
98| ECC | 192 | NID_brainpoolP192r1 | ECC_BrainPoolP192r1 | 11+ |
99| ECC | 192 | NID_brainpoolP192t1 | ECC_BrainPoolP192t1 | 11+ |
100| ECC | 224 | NID_brainpoolP224r1 | ECC_BrainPoolP224r1 | 11+ |
101| ECC | 224 | NID_brainpoolP224t1 | ECC_BrainPoolP224t1 | 11+ |
102| ECC | 256 | NID_brainpoolP256r1 | ECC_BrainPoolP256r1 | 11+ |
103| ECC | 256 | NID_brainpoolP256t1 | ECC_BrainPoolP256t1 | 11+ |
104| ECC | 320 | NID_brainpoolP320r1 | ECC_BrainPoolP320r1 | 11+ |
105| ECC | 320 | NID_brainpoolP320t1 | ECC_BrainPoolP320t1 | 11+ |
106| ECC | 384 | NID_brainpoolP384r1 | ECC_BrainPoolP384r1 | 11+ |
107| ECC | 384 | NID_brainpoolP384t1 | ECC_BrainPoolP384t1 | 11+ |
108| ECC | 512 | NID_brainpoolP512r1 | ECC_BrainPoolP512r1 | 11+ |
109| ECC | 512 | NID_brainpoolP512t1 | ECC_BrainPoolP512t1 | 11+ |
110
111
112### 使用密钥参数生成
113
114从API版本10开始支持,使用密钥参数生成ECC密钥。
115
116Fp域下的ECC密钥参数,包括:
117
118- p:素数,用于确定Fp。
119
120- a, b:确定椭圆曲线的方程。
121
122- g:椭圆曲线的一个基点(base point),可由gx,gy表示。
123
124- n:基点g的阶(order)。
125
126- h:余因子(cofactor)。
127
128- sk:私钥,是一个随机整数,小于n。
129
130- pk:公钥,是椭圆曲线上的一个点, pk = sk \* g。
131
132当创建非对称密钥生成器时,对于指定公/私钥参数生成ECC密钥的支持情况如表所示:
133
134- √:表示需要指定这一列中的具体属性,来构成密钥参数。
135
136|  | 公共参数 | 公钥参数 | 私钥参数 | 公私钥对参数 |
137| -------- | -------- | -------- | -------- | -------- |
138| fieldType | √ | √ | √ | √ |
139| p | √ | √ | √ | √ |
140| a | √ | √ | √ | √ |
141| b | √ | √ | √ | √ |
142| g | √ | √ | √ | √ |
143| n | √ | √ | √ | √ |
144| h | √ | √ | √ | √ |
145| pk | - | √ | - | √ |
146| sk | - | - | √ | √ |
147
148> **说明:**
149> - 当前ECC只支持Fp域,因此fieldType固定为"Fp"。fieldType和p构成了属性field,当前field只支持[ECFieldFp](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#ecfieldfp10)。
150>
151> - g和pk为ECC曲线上的点,属于[Point](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#point10)类型,需要指定具体X,Y坐标。
152
153
154### 使用曲线名生成密钥参数
155
156从API版本11开始支持,使用曲线名来生成ECC公共密钥参数。
157
158
159> **说明:**
160> - 曲线名为要求输入的字符串参数,支持的曲线名请参考[ECC密钥字符串参数表](#使用字符串参数生成)中的“曲线名”一列。
161>
162> - 生成的公共密钥参数可以直接随机生成公私钥,也可用于构造公、私以及公私钥对密钥参数。
163
164
165## DSA
166
167DSA(Digital Signature Algorithm),是一种基于模算数和整数有限域离散对数难题的一种公钥密码算法,常用于数字签名和验签,不能用于加解密。
168
169当前支持使用字符串参数和密钥参数两种方式生成DSA密钥。
170
171
172### 使用字符串参数生成
173
174以字符串参数生成DSA密钥,具体的“字符串参数”由“非对称密钥算法”和“密钥长度”拼接而成,用于在创建非对称密钥生成器时,指定密钥规格。
175
176| 非对称密钥算法 | 密钥长度(bit) | 字符串参数 | API版本 |
177| -------- | -------- | -------- | -------- |
178| DSA | 1024 | DSA1024 | 10+ |
179| DSA | 2048 | DSA2048 | 10+ |
180| DSA | 3072 | DSA3072 | 10+ |
181
182
183### 使用密钥参数生成
184
185从API版本10开始支持,使用密钥参数生成DSA密钥。
186
187DSA密钥参数,包括:
188
189- p:一个素模数,比特长度为64的整数倍。
190
191- q:p-1的素因子,长度与p的长度有关。
192
193- g:g = (h ^ ((p - 1) / q)) mod p,h为满足1 < h < p -1的任意整数。
194
195- sk:私钥,为随机生成的整数,满足0 < sk < q。
196
197- pk:公钥,pk = (g ^ sk) mod p。
198
199当创建非对称密钥生成器时,对于指定公/私钥参数生成DSA密钥的支持情况如表所示:
200
201- √:表示需要指定这一列中的具体属性,来构成密钥参数。
202
203- ×:表示这一列中的具体属性对应某种密钥参数,但是当前不支持通过该密钥参数生成密钥。
204
205|  | 公共参数 | 公钥参数 | 私钥参数 | 公私钥对参数 |
206| -------- | -------- | -------- | -------- | -------- |
207| p | √ | √ | × | √ |
208| q | √ | √ | × | √ |
209| g | √ | √ | × | √ |
210| pk | - | √ | - | √ |
211| sk | - | - | × | √ |
212
213> **说明:**
214> - DSA不支持通过指定私钥参数(p, q, g, sk)来生成私钥。
215>
216> - 当使用公共参数(p, q, g)来生成DSA密钥对时,DSA密钥长度至少需要1024位。
217
218
219## SM2
220
221SM2,是一种基于椭圆曲线的公钥密码算法。采用的Fp域上的椭圆曲线。
222
223当前支持使用字符串参数和密钥参数两种方式生成SM2密钥,且支持通过曲线名生成公共密钥参数。
224
225
226### 使用字符串参数生成
227
228当前支持以字符串参数生成SM2密钥,具体的“字符串参数”由“非对称密钥算法”和“密钥长度”使用符号“_”拼接而成,用于在创建非对称密钥生成器时,指定密钥规格。
229
230| 非对称密钥算法 | 密钥长度(bit) | 曲线名 | 字符串参数 | API版本 |
231| -------- | -------- | -------- | -------- | -------- |
232| SM2 | 256 | NID_sm2 | SM2_256 | 10+ |
233
234
235### 使用密钥参数生成
236
237从API版本11开始支持,使用密钥参数生成SM2密钥。
238
239Fp域下的SM2密钥参数,包括:
240
241- p:素数,用于确定Fp。
242
243- a, b:确定椭圆曲线的方程。
244
245- g:椭圆曲线的一个基点(base point),可由gx,gy表示。
246
247- n:基点g的阶(order)。
248
249- h:余因子(cofactor)。
250
251- sk:私钥,是一个随机整数,小于n。
252
253- pk:公钥,是椭圆曲线上的一个点, pk = sk \* g。
254
255当创建非对称密钥生成器时,对于指定公/私钥参数生成SM2密钥的支持情况如表所示:
256
257- √:表示需要指定这一列中的具体属性,来构成密钥参数。
258
259|  | 公共参数 | 公钥参数 | 私钥参数 | 公私钥对参数 |
260| -------- | -------- | -------- | -------- | -------- |
261| fieldType | √ | √ | √ | √ |
262| p | √ | √ | √ | √ |
263| a | √ | √ | √ | √ |
264| b | √ | √ | √ | √ |
265| g | √ | √ | √ | √ |
266| n | √ | √ | √ | √ |
267| h | √ | √ | √ | √ |
268| pk | - | √ | - | √ |
269| sk | - | - | √ | √ |
270
271> **说明:**
272> - 当前SM2只支持Fp域,因此fieldType固定为"Fp"。fieldType和p构成了属性field,当前field只支持[ECFieldFp](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#ecfieldfp10)。
273>
274> - g和pk为SM2曲线上的点,属于[Point](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#point10)类型,需要指定具体X,Y坐标。
275
276
277### 使用曲线名生成密钥参数
278
279从API版本11开始支持,使用曲线名来生成SM2公共密钥参数。
280
281
282> **说明:**
283> - 曲线名为要求输入的字符串参数,支持的曲线名为"NID_sm2"。
284>
285> - 生成的公共密钥参数可以直接随机生成公私钥,也可用于构造公、私以及公私钥对密钥参数。
286
287
288## Ed25519
289
290Ed25519算法是一个基于 EdDSA 算法的数字签名算法,密钥长度为256位,使用 Edwards 曲线来实现,不能用于加解密,一般用于数字签名和验签。
291
292当前支持使用字符串参数和密钥参数两种方式生成Ed25519密钥。
293
294
295### 使用字符串参数生成
296
297以字符串参数生成Ed25519密钥,用于在创建非对称密钥生成器时,指定密钥规格。
298
299| 非对称密钥算法 | 字符串参数 | API版本 |
300| -------- | -------- | -------- |
301| Ed25519 | Ed25519 | 11+ |
302
303
304### 使用密钥参数生成
305
306从API版本11开始支持,使用密钥参数生成Ed25519密钥。
307
308Ed22519密钥参数,包括:
309
310- sk:私钥,一个 32 字节的随机值。
311
312- pk:公钥,一个 32 字节的值,从私钥派生而来。
313
314当创建非对称密钥生成器时,对于指定公/私钥参数生成Ed25519密钥的支持情况如表所示:
315
316- √:表示需要指定这一列中的具体属性,来构成密钥参数。
317
318|  | 公钥参数 | 私钥参数 | 公私钥对参数 |
319| -------- | -------- | -------- | -------- |
320| pk | √ | - | √ |
321| sk | - | √ | √ |
322
323> **说明:**
324> Ed25519密钥参数没有公共参数,不支持通过公共参数生成密钥。
325
326
327## X25519
328
329X25519算法是一种 Diffie-Hellman 密钥交换算法,用于密钥协商。
330
331当前支持使用字符串参数和密钥参数两种方式生成X25519密钥。
332
333
334### 使用字符串参数生成
335
336以字符串参数生成X25519密钥,用于在创建非对称密钥生成器时,指定密钥规格。
337
338| 非对称密钥算法 | 字符串参数 | API版本 |
339| -------- | -------- | -------- |
340| X25519 | X25519 | 11+ |
341
342
343### 使用密钥参数生成
344
345从API版本11开始支持,使用密钥参数生成X25519密钥。
346
347X22519密钥参数,包括:
348
349- sk:私钥,一个 32 字节的随机值。
350
351- pk:公钥,一个 32 字节的值,从私钥派生而来。
352
353当创建非对称密钥生成器时,对于指定公/私钥参数生成X25519密钥的支持情况如表所示:
354
355- √:表示需要指定这一列中的具体属性,来构成密钥参数。
356
357|  | 公钥参数 | 私钥参数 | 公私钥对参数 |
358| -------- | -------- | -------- | -------- |
359| pk | √ | - | √ |
360| sk | - | √ | √ |
361
362> **说明:**
363> X25519没有公共密钥参数,不支持通过公共参数生成密钥。
364
365
366## DH
367
368DH(Diffie–Hellman key exchange),是一种密钥协商算法,只涉及公钥的交换,它可以提供前向安全性,即使在通信渠道被监听的情况下,也不会暴露双方的私钥。
369
370当前支持使用字符串参数和密钥参数两种方式生成DH密钥,且支持根据素数长度和私钥长度生成公共密钥参数。
371
372
373### 使用字符串参数生成
374
375以字符串参数生成DH密钥,具体的“字符串参数”由“非对称密钥算法”和“知名安全素数群参数”使用符号“_”拼接而成,用于在创建非对称密钥生成器时,指定密钥规格。
376
377| 非对称密钥算法 | 知名安全素数群参数 | 密钥长度(bit) | 字符串参数 | API版本 |
378| -------- | -------- | -------- | -------- | -------- |
379| DH | modp1536 | 1536 | DH_modp1536 | 11+ |
380| DH | modp2048 | 2048 | DH_modp2048 | 11+ |
381| DH | modp3072 | 3072 | DH_modp3072 | 11+ |
382| DH | modp4096 | 4096 | DH_modp4096 | 11+ |
383| DH | modp6144 | 6144 | DH_modp6144 | 11+ |
384| DH | modp8192 | 8192 | DH_modp8192 | 11+ |
385| DH | ffdhe2048 | 2048 | DH_ffdhe2048 | 11+ |
386| DH | ffdhe3072 | 3072 | DH_ffdhe3072 | 11+ |
387| DH | ffdhe4096 | 4096 | DH_ffdhe4096 | 11+ |
388| DH | ffdhe6144 | 6144 | DH_ffdhe6144 | 11+ |
389| DH | ffdhe8192 | 8192 | DH_ffdhe8192 | 11+ |
390
391
392### 使用密钥参数生成
393
394从API版本11开始支持,使用密钥参数生成DH密钥。
395
396DH密钥参数,包括:
397
398- p:一个足够大的素数,用作有限域的模数。它被所有通信双方共享。
399
400- g:g是DH算法的生成元,是素数p的原根。它被所有通信双方共享。
401
402- l:length,表示私钥长度,以bit为单位。当l为0时,代表不指定私钥长度。
403
404- sk:私钥,一个随机生成的私钥值。
405
406- pk:公钥,通过使用公共参数(p 和 g)和私钥进行计算得到。
407
408当创建非对称密钥生成器时,对于指定公/私钥参数生成DH密钥的支持情况如表所示:
409
410- √:表示需要指定这一列中的具体属性,来构成密钥参数。
411
412|  | 公共参数 | 公钥参数 | 私钥参数 | 公私钥对参数 |
413| -------- | -------- | -------- | -------- | -------- |
414| p | √ | √ | √ | √ |
415| g | √ | √ | √ | √ |
416| l | √ | √ | √ | √ |
417| pk | - | √ | - | √ |
418| sk | - | - | √ | √ |
419
420
421### 使用素数长度和私钥长度生成公共密钥参数
422
423从API版本11开始支持,使用素数长度和私钥长度生成DH公共密钥参数。
424
425如果素数长度与安全素数组素数长度一致,则选用对应的知名安全素数群,对应关系如表所示:
426
427| 素数长度(bit) | 知名安全素数群 |
428| -------- | -------- |
429| 2048 | ffdhe2048 |
430| 3072 | ffdhe3072 |
431| 4096 | ffdhe4096 |
432| 6144 | ffdhe6144 |
433| 8192 | ffdhe8192 |
434
435- 素数p的比特长度必须大于等于512,小于等于10000。
436
437- 私钥长度l为可选参数,默认为0,l值的设置范围需大于2\*(96+(素数P位数-1)/1024\*16)。
438
439- 生成的公共密钥参数可以直接随机生成公私钥,也可用于构造公、私以及公私钥对密钥参数。
440
441- 生成非知名群的密钥参数较为耗时,建议优先选用知名安全素数群。
442