非对称密钥生成和转换规格
============

当前章节说明系统支持的算法及其对应规格。密钥生成指定规格的方式有两种：

*   字符串参数：以字符串的形式描述开发者需要生成的密钥规格。
    
*   密钥参数：使用密钥的详细密码学信息，构造密钥对象。
    

对于每种算法采用哪种方式，将会在具体的每个算法规格中介绍。

#### RSA

RSA（Rivest–Shamir–Adleman），当前支持使用字符串参数和密钥参数两种方式生成RSA密钥。

#### \[h2\]使用字符串参数生成

以字符串参数生成RSA密钥，具体的“字符串参数”由“RSA密钥类型”和“素数个数”使用符号“|”拼接而成，用于在创建非对称密钥生成器时，指定密钥规格。

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/39/v3/dmAwDoS2TlWwaoTa1YinWg/note_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260612T073356Z&HW-CC-Expire=86400&HW-CC-Sign=26BCDFE4E64D27AD9C88BC1ED9C63CAEDA324A28EECED1D4843598310558AA54)

生成RSA非对称密钥时，默认素数为2，PRIMES\_2参数可省略。

| RSA密钥类型 | 素数个数 | 字符串参数 | API版本 |
| :-- | :-- | :-- | :-- |
| RSA512 | 2 | RSA512|PRIMES\_2 | 9+ |
| RSA768 | 2 | RSA768|PRIMES\_2 | 9+ |
| RSA1024 | 2 | RSA1024|PRIMES\_2 | 9+ |
| RSA1024 | 3 | RSA1024|PRIMES\_3 | 9+ |
| RSA2048 | 2 | RSA2048|PRIMES\_2 | 9+ |
| RSA2048 | 3 | RSA2048|PRIMES\_3 | 9+ |
| RSA3072 | 2 | RSA3072|PRIMES\_2 | 9+ |
| RSA3072 | 3 | RSA3072|PRIMES\_3 | 9+ |
| RSA4096 | 2 | RSA4096|PRIMES\_2 | 9+ |
| RSA4096 | 3 | RSA4096|PRIMES\_3 | 9+ |
| RSA4096 | 4 | RSA4096|PRIMES\_4 | 9+ |
| RSA8192 | 2 | RSA8192|PRIMES\_2 | 9+ |
| RSA8192 | 3 | RSA8192|PRIMES\_3 | 9+ |
| RSA8192 | 4 | RSA8192|PRIMES\_4 | 9+ |
| RSA8192 | 5 | RSA8192|PRIMES\_5 | 9+ |

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/47/v3/YMRjPnmAT2ej2tr9YKH4BA/caution_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260612T073356Z&HW-CC-Expire=86400&HW-CC-Sign=852088CAE3B268D46DE1C110DD07BF494D5C51C24294F71C542650FA00008FBE)

使用同步接口生成RSA2048、RSA3072、RSA4096和RSA8192非对称密钥会增加耗时。

系统对主线程有时间限制，耗时较长会导致失败。建议生成大位数密钥时，使用异步接口或[使用多线程并发能力](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/multi-thread-concurrency-overview)。

创建RSA非对称密钥生成器时，若用于随机生成密钥，生成的RSA密钥规格与创建时指定的密钥规格一致；若用于密钥转换，生成的RSA密钥规格与转换时指定的密钥数据规格一致。

#### \[h2\]使用密钥参数生成

从API version 10开始，支持使用密钥参数生成RSA密钥。

RSA密钥参数，涉及三个整数，包括：

*   n：模数（Modulus），是私钥和公钥的公共参数。
    
*   sk：私钥指数（privateExponent），公式中常写作d。
    
*   pk：公钥指数（publicExponent），公式中常写作e。
    

创建非对称密钥生成器时，支持根据指定的公钥和私钥参数生成RSA密钥，具体情况见下表：

*   √：表示需要指定这一列中的具体属性，来构成密钥参数。
    
*   ×：表示这一列中的具体属性对应某种密钥参数，但是当前不支持通过该密钥参数生成密钥。
    

| 参数名 | 公共参数 | 公钥参数 | 私钥参数 | 公私钥对参数 |
| :-- | :-- | :-- | :-- | :-- |
| n | × | √ | × | √ |
| pk | N/A | √ | N/A | √ |
| sk | N/A | N/A | × | √ |

根据上表：

*   RSA不支持通过指定公共参数（n）来随机生成密钥。
    
*   RSA不支持通过指定私钥参数（n, sk）来生成私钥。
    

#### ECC

ECC（Elliptic Curve Cryptography），是一种基于椭圆曲线数学的公钥密码算法。

椭圆曲线算法可以看作是定义在特殊集合下数的运算，当前算法库支持的ECC密钥均为Fp域的椭圆曲线，p为素数，Fp域也称素数域。

支持使用字符串参数和密钥参数生成ECC密钥，还支持通过曲线名生成公共密钥参数。

#### \[h2\]使用字符串参数生成

以字符串参数生成ECC密钥，具体的“字符串参数”由“非对称密钥算法”和“密钥长度”拼接而成，用于在创建非对称密钥生成器时，指定密钥规格。

| 非对称密钥算法 | 密钥长度（bit） | 曲线名 | 字符串参数 | API版本 |
| :-- | :-- | :-- | :-- | :-- |
| ECC | 192 | NID\_X9\_62\_prime192v1 | ECC192 | 26.0.0+ |
| ECC | 224 | NID\_secp224r1 | ECC224 | 9+ |
| ECC | 256 | NID\_X9\_62\_prime256v1 | ECC256 | 9+ |
| ECC | 384 | NID\_secp384r1 | ECC384 | 9+ |
| ECC | 521 | NID\_secp521r1 | ECC521 | 9+ |
| ECC | 160 | NID\_brainpoolP160r1 | ECC\_BrainPoolP160r1 | 11+ |
| ECC | 160 | NID\_brainpoolP160t1 | ECC\_BrainPoolP160t1 | 11+ |
| ECC | 192 | NID\_brainpoolP192r1 | ECC\_BrainPoolP192r1 | 11+ |
| ECC | 192 | NID\_brainpoolP192t1 | ECC\_BrainPoolP192t1 | 11+ |
| ECC | 224 | NID\_brainpoolP224r1 | ECC\_BrainPoolP224r1 | 11+ |
| ECC | 224 | NID\_brainpoolP224t1 | ECC\_BrainPoolP224t1 | 11+ |
| ECC | 256 | NID\_brainpoolP256r1 | ECC\_BrainPoolP256r1 | 11+ |
| ECC | 256 | NID\_brainpoolP256t1 | ECC\_BrainPoolP256t1 | 11+ |
| ECC | 320 | NID\_brainpoolP320r1 | ECC\_BrainPoolP320r1 | 11+ |
| ECC | 320 | NID\_brainpoolP320t1 | ECC\_BrainPoolP320t1 | 11+ |
| ECC | 384 | NID\_brainpoolP384r1 | ECC\_BrainPoolP384r1 | 11+ |
| ECC | 384 | NID\_brainpoolP384t1 | ECC\_BrainPoolP384t1 | 11+ |
| ECC | 512 | NID\_brainpoolP512r1 | ECC\_BrainPoolP512r1 | 11+ |
| ECC | 512 | NID\_brainpoolP512t1 | ECC\_BrainPoolP512t1 | 11+ |
| ECC | 256 | NID\_secp256k1 | ECC\_Secp256k1 | 14+ |

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/88/v3/Mun9_UP6R86XJ6Ws2wK1Yw/caution_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260612T073356Z&HW-CC-Expire=86400&HW-CC-Sign=5D6494E76F6156B5BF710715E963F892272D0A3E8CAC926B805405FAA7E44358)

创建ECC非对称密钥生成器时，如果用于随机生成密钥，生成的ECC密钥规格与创建密钥生成器时指定的密钥规格一致。如果用于密钥转换，生成的ECC密钥规格与密钥转换时指定的密钥数据规格一致。

#### \[h2\]使用密钥参数生成

从API version 10开始，支持使用密钥参数生成ECC密钥。

Fp域下的ECC密钥参数包括：

*   p：素数，用于确定Fp。
    
*   a, b：确定椭圆曲线的方程。
    
*   g：椭圆曲线的一个基点(base point)，可由gx，gy表示。
    
*   n：基点g的阶(order)。
    
*   h：余因子(cofactor)。
    
*   sk：私钥，是一个随机整数，小于n。
    
*   pk：公钥，是椭圆曲线上的一个点， pk = sk \* g。
    

创建非对称密钥生成器时，支持使用指定的公钥和私钥参数生成ECC密钥，具体情况见下表：

*   √：表示需要指定这一列中的具体属性，来构成密钥参数。

| 参数名 | 公共参数 | 公钥参数 | 私钥参数 | 公私钥对参数 |
| :-- | :-- | :-- | :-- | :-- |
| fieldType | √ | √ | √ | √ |
| p | √ | √ | √ | √ |
| a | √ | √ | √ | √ |
| b | √ | √ | √ | √ |
| g | √ | √ | √ | √ |
| n | √ | √ | √ | √ |
| h | √ | √ | √ | √ |
| pk | N/A | √ | N/A | √ |
| sk | N/A | N/A | √ | √ |

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/bf/v3/uHryAqHOQjCMhfHr_J_7gg/note_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260612T073356Z&HW-CC-Expire=86400&HW-CC-Sign=10B3EBE14A887D173DBF237E58504C25CF7E20E487D862955CED3AA6CE8E9A2D)

*   当前ECC只支持Fp域，因此fieldType固定为"Fp"。fieldType和p构成了属性field，当前field只支持[ECFieldFp](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-cryptoframework#ecfieldfp10)。
    
*   g和pk为ECC曲线上的点，属于[Point](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-cryptoframework#point10)类型，需要指定具体的X和Y坐标。
    

#### \[h2\]使用曲线名生成密钥参数

从API version 11开始，支持使用曲线名来生成ECC公共密钥参数。

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/7/v3/jpUn4iqbSpGOhROBIZU0cw/note_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260612T073356Z&HW-CC-Expire=86400&HW-CC-Sign=07E84D5BEFB5CDE4AC4A720E15A474839D7F5CC98B678C6E24EAD16CF885CF01)

*   曲线名为要求输入的字符串参数，支持的曲线名请参考[ECC密钥字符串参数表](#使用字符串参数生成-1)中的“曲线名”一列。
    
*   生成的公共密钥参数可以直接用于随机生成公私钥，也可用于构造公钥、私钥及公私钥对密钥参数。
    

#### DSA

DSA（Digital Signature Algorithm），是一种基于模运算和整数有限域离散对数难题的公钥密码算法，常用于数字签名和验签，不能用于加解密。

当前支持使用字符串参数和密钥参数两种方式生成DSA密钥。

#### \[h2\]约束与限制

使用同步接口生成DSA2048或DSA3072非对称密钥，或者处理明文长度超过2048位，会导致耗时增加。

系统对主线程有时间限制，耗时较长会导致失败。建议生成大位数密钥时，使用异步接口或[使用多线程并发能力](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/multi-thread-concurrency-overview)。

#### \[h2\]使用字符串参数生成

使用字符串参数生成DSA密钥，具体的“字符串参数”由“非对称密钥算法”和“密钥长度”拼接而成，用于在创建非对称密钥生成器时，指定密钥规格。

| 非对称密钥算法 | 密钥长度（bit） | 字符串参数 | API版本 |
| :-- | :-- | :-- | :-- |
| DSA | 1024 | DSA1024 | 10+ |
| DSA | 2048 | DSA2048 | 10+ |
| DSA | 3072 | DSA3072 | 10+ |

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/19/v3/UWTM8_OOQ2G4uWDlWEnzRw/caution_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260612T073356Z&HW-CC-Expire=86400&HW-CC-Sign=0143494C4B55975077BD7B303571B2CEC5798FAF360E3ECF99E8899D285DDCED)

使用同步接口生成DSA2048、DSA3072非对称密钥或明文长度超过2048位会导致耗时增加。

系统对主线程有时间限制，耗时较长会导致失败。建议生成大位数密钥时，使用异步接口或[使用多线程并发能力](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/multi-thread-concurrency-overview)。

创建的DSA非对称密钥生成器用于随机生成密钥时，生成的密钥规格与创建时指定的密钥规格一致。用于密钥转换时，生成的密钥规格与转换时指定的密钥数据规格一致。

#### \[h2\]使用密钥参数生成

从API version 10开始支持，使用密钥参数生成DSA密钥。

DSA密钥参数，包括：

*   p：一个素模数，比特长度为64的整数倍。
    
*   q：p-1的素因子，长度与p的长度有关。
    
*   g：g = (h ^ ((p - 1) / q)) mod p，h为满足1 < h < p -1的任意整数。
    
*   sk：私钥，为随机生成的整数，满足0 < sk < q。
    
*   pk：公钥，pk = (g ^ sk) mod p。
    

当创建非对称密钥生成器时，支持根据指定的公钥和私钥参数生成DSA密钥，具体情况参见下表：

*   √：表示需要指定这一列中的具体属性，来构成密钥参数。
    
*   ×：表示这一列中的具体属性对应某种密钥参数，但是当前不支持通过该密钥参数生成密钥。
    

| 参数名 | 公共参数 | 公钥参数 | 私钥参数 | 公私钥对参数 |
| :-- | :-- | :-- | :-- | :-- |
| p | √ | √ | × | √ |
| q | √ | √ | × | √ |
| g | √ | √ | × | √ |
| pk | N/A | √ | N/A | √ |
| sk | N/A | N/A | × | √ |

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/5d/v3/UJ2-3hV4TdmKeyrU_rAeYw/note_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260612T073356Z&HW-CC-Expire=86400&HW-CC-Sign=F336C23FBE1FB107B9CFF527805601EFBCD5C98E21AA2B3E480A0537E83072E3)

*   DSA不支持通过指定私钥参数（p, q, g, sk）来生成私钥。
    
*   当使用公共参数（p, q, g）来生成DSA密钥对时，DSA密钥长度至少需要1024位。
    

#### SM2

SM2是一种基于椭圆曲线的公钥密码算法，采用Fp域上的椭圆曲线。

当前支持使用字符串参数和密钥参数生成SM2密钥，并支持通过曲线名生成公共密钥参数。

#### \[h2\]使用字符串参数生成

当前支持以字符串参数生成SM2密钥，具体的“字符串参数”由“非对称密钥算法”和“密钥长度”使用符号“\_”拼接而成，用于在创建非对称密钥生成器时，指定密钥规格。

| 非对称密钥算法 | 密钥长度（bit） | 曲线名 | 字符串参数 | API版本 |
| :-- | :-- | :-- | :-- | :-- |
| SM2 | 256 | NID\_sm2 | SM2\_256 | 10+ |

#### \[h2\]使用密钥参数生成

从API version 11开始，支持使用密钥参数生成SM2密钥。

Fp域下的SM2密钥参数包括：

*   p：素数，用于确定Fp。
    
*   a, b：确定椭圆曲线的方程。
    
*   g：椭圆曲线的一个基点(base point)，可由gx，gy表示。
    
*   n：基点g的阶(order)。
    
*   h：余因子(cofactor)。
    
*   sk：私钥，是一个随机整数，小于n。
    
*   pk：公钥，是椭圆曲线上的一个点，pk = sk \* g。
    

当创建非对称密钥生成器时，支持根据指定的公钥和私钥参数生成SM2密钥，具体支持情况如表所示：

*   √：表示需要指定这一列中的具体属性，来构成密钥参数。

| 参数名 | 公共参数 | 公钥参数 | 私钥参数 | 公私钥对参数 |
| :-- | :-- | :-- | :-- | :-- |
| fieldType | √ | √ | √ | √ |
| p | √ | √ | √ | √ |
| a | √ | √ | √ | √ |
| b | √ | √ | √ | √ |
| g | √ | √ | √ | √ |
| n | √ | √ | √ | √ |
| h | √ | √ | √ | √ |
| pk | N/A | √ | N/A | √ |
| sk | N/A | N/A | √ | √ |

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/a/v3/Qbh6Q0-dS1OWJr3fyNZcqg/note_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260612T073356Z&HW-CC-Expire=86400&HW-CC-Sign=CDDA1C299CF388523C14DDC3AC19A7D598CF180A493D56C35B850589E9217308)

*   当前SM2只支持Fp域，因此fieldType固定为"Fp"。fieldType和p构成了属性field，当前field只支持[ECFieldFp](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-cryptoframework#ecfieldfp10)。
    
*   g和pk为SM2曲线上的点，属于[Point](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-cryptoframework#point10)类型，需要指定具体X，Y坐标。
    

#### \[h2\]使用曲线名生成密钥参数

从API version 11开始，支持使用曲线名称生成SM2公钥参数。

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/69/v3/Kq_9ex8ASVe-T9GKVPBD4Q/note_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260612T073356Z&HW-CC-Expire=86400&HW-CC-Sign=209EF181CE42A285D61A846C34035D940D50E167986226526E130D794A241899)

*   曲线名为要求输入的字符串参数，支持的曲线名为"NID\_sm2"。
    
*   生成的公共密钥参数可以直接随机生成公私钥，也可用于构造公、私以及公私钥对密钥参数。
    

#### Ed25519

Ed25519算法是基于EdDSA算法的数字签名算法，密钥长度为256位，采用Edwards曲线实现。该算法不支持加解密，主要用于数字签名和验证。

当前支持使用字符串参数和密钥参数生成Ed25519密钥。

#### \[h2\]使用字符串参数生成

使用字符串参数生成 Ed25519 密钥，以在创建非对称密钥生成器时指定密钥规格。

| 非对称密钥算法 | 字符串参数 | API版本 |
| :-- | :-- | :-- |
| Ed25519 | Ed25519 | 11+ |

#### \[h2\]使用密钥参数生成

从API version 11开始，支持使用密钥参数生成Ed25519密钥。

Ed25519密钥参数包括：

*   sk：私钥，一个 32 字节的随机值。
    
*   pk：公钥，一个 32 字节的值，从私钥派生而来。
    

当创建非对称密钥生成器时，支持根据指定的公钥和私钥参数生成Ed25519密钥，具体情况见下表：

*   √：表示需要指定这一列中的具体属性，来构成密钥参数。

| 参数名 | 公钥参数 | 私钥参数 | 公私钥对参数 |
| :-- | :-- | :-- | :-- |
| pk | √ | N/A | √ |
| sk | N/A | √ | √ |

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/ce/v3/bTNqOz5IR6eMromYCUZBVA/note_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260612T073356Z&HW-CC-Expire=86400&HW-CC-Sign=FCC9067CF83D307F6DD642C1657CB39E7C599628DE91DC4F7371083BD3A319C3)

Ed25519密钥参数没有公共参数，不支持通过公共参数生成密钥。

#### X25519

X25519算法是一种 Diffie-Hellman 密钥交换算法，用于密钥协商。

支持使用字符串参数和密钥参数生成X25519密钥。

#### \[h2\]使用字符串参数生成

使用字符串参数生成X25519密钥，指定密钥规格。

| 非对称密钥算法 | 字符串参数 | API版本 |
| :-- | :-- | :-- |
| X25519 | X25519 | 11+ |

#### \[h2\]使用密钥参数生成

从API version 11开始支持使用密钥参数生成X25519密钥。

X25519密钥参数包括：

*   sk：私钥，一个 32 字节的随机值。
    
*   pk：公钥，一个 32 字节的值，从私钥派生而来。
    

当创建非对称密钥生成器时，指定公/私钥参数生成X25519密钥的支持情况如表所示。

*   √：表示需要指定这一列中的具体属性，来构成密钥参数。

| 参数名 | 公钥参数 | 私钥参数 | 公私钥对参数 |
| :-- | :-- | :-- | :-- |
| pk | √ | N/A | √ |
| sk | N/A | √ | √ |

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/28/v3/sKqDip_tT4WiNktdLUBjpA/note_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260612T073356Z&HW-CC-Expire=86400&HW-CC-Sign=037BFAF7C042A206D28C811D07BD6D9BE699A5AF1C287344F89243E09951A1FB)

X25519没有公共密钥参数，不支持通过公共参数生成密钥。

#### DH

DH（Diffie–Hellman key exchange），是一种密钥协商算法，只涉及公钥的交换，它可以提供前向安全性，即使在通信渠道被监听的情况下，也不会暴露双方的私钥。

支持使用字符串参数和密钥参数生成DH密钥，支持根据素数长度和私钥长度生成公共密钥参数。

#### \[h2\]使用字符串参数生成

以字符串参数生成DH密钥，具体的“字符串参数”由“非对称密钥算法”和“知名安全素数群参数”使用符号“\_”拼接而成，用于在创建非对称密钥生成器时，指定密钥规格。

| 非对称密钥算法 | 知名安全素数群参数 | 密钥长度（bit） | 字符串参数 | API版本 |
| :-- | :-- | :-- | :-- | :-- |
| DH | modp1536 | 1536 | DH\_modp1536 | 11+ |
| DH | modp2048 | 2048 | DH\_modp2048 | 11+ |
| DH | modp3072 | 3072 | DH\_modp3072 | 11+ |
| DH | modp4096 | 4096 | DH\_modp4096 | 11+ |
| DH | modp6144 | 6144 | DH\_modp6144 | 11+ |
| DH | modp8192 | 8192 | DH\_modp8192 | 11+ |
| DH | ffdhe2048 | 2048 | DH\_ffdhe2048 | 11+ |
| DH | ffdhe3072 | 3072 | DH\_ffdhe3072 | 11+ |
| DH | ffdhe4096 | 4096 | DH\_ffdhe4096 | 11+ |
| DH | ffdhe6144 | 6144 | DH\_ffdhe6144 | 11+ |
| DH | ffdhe8192 | 8192 | DH\_ffdhe8192 | 11+ |

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/3d/v3/c-XWly1rS36_2vEG8wto4Q/caution_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260612T073356Z&HW-CC-Expire=86400&HW-CC-Sign=B74431952599E55AB274B90B22A5130F55926BEABFF719430BE33C85ADDCAC1E)

创建DH非对称密钥生成器时，如果用于随机生成密钥，生成的DH密钥规格与创建密钥生成器时指定的密钥规格一致；如果用于密钥转换，生成的DH密钥规格与密钥转换时指定的密钥数据规格一致。

#### \[h2\]使用密钥参数生成

从API version 11开始支持使用密钥参数生成DH密钥。

DH密钥参数，包括：

*   p：一个足够大的素数，用作有限域的模数。它被所有通信双方共享。
    
*   g：g是DH算法的生成元，是素数p的原根。它被所有通信双方共享。
    
*   l：length，表示私钥长度，以bit为单位。当l为0时，代表不指定私钥长度。
    
*   sk：私钥，一个随机生成的私钥值。
    
*   pk：公钥，通过使用公共参数（p 和 g）和私钥进行计算得到。
    

当创建非对称密钥生成器时，对于指定公/私钥参数生成DH密钥的支持情况，如表所示。

*   √：表示需要指定这一列中的具体属性，来构成密钥参数。

| 参数名 | 公共参数 | 公钥参数 | 私钥参数 | 公私钥对参数 |
| :-- | :-- | :-- | :-- | :-- |
| p | √ | √ | √ | √ |
| g | √ | √ | √ | √ |
| l | √ | √ | √ | √ |
| pk | N/A | √ | N/A | √ |
| sk | N/A | N/A | √ | √ |

#### \[h2\]使用素数长度和私钥长度生成公共密钥参数

从API version 11开始，使用素数长度和私钥长度生成DH公共密钥参数。

如果素数长度与安全素数组的素数长度一致，则选用对应的知名安全素数群。对应关系如表所示。

| 素数长度（bit） | 知名安全素数群 |
| :-- | :-- |
| 2048 | ffdhe2048 |
| 3072 | ffdhe3072 |
| 4096 | ffdhe4096 |
| 6144 | ffdhe6144 |
| 8192 | ffdhe8192 |

*   素数p的比特长度必须大于等于512且小于等于10000。
    
*   私钥长度l为可选参数，默认为0，l值的设置范围需大于2\*(96+(素数P位数-1)/1024\*16)。
    
*   生成的公共密钥参数可以直接用于随机生成公私钥，也可以用于构造公钥、私钥或公私钥对。
    
*   生成非知名群的密钥参数耗时较长，建议优先选用知名安全素数群。