跳到主要内容

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

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

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

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

RSA

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

使用字符串参数生成

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

生成RSA非对称密钥时,默认素数为2,PRIMES_2参数可省略。

RSA密钥类型素数个数字符串参数API版本
RSA5122RSA512PRIMES_2
RSA7682RSA768PRIMES_2
RSA10242RSA1024PRIMES_2
RSA10243RSA1024PRIMES_3
RSA20482RSA2048PRIMES_2
RSA20483RSA2048PRIMES_3
RSA30722RSA3072PRIMES_2
RSA30723RSA3072PRIMES_3
RSA40962RSA4096PRIMES_2
RSA40963RSA4096PRIMES_3
RSA40964RSA4096PRIMES_4
RSA81922RSA8192PRIMES_2
RSA81923RSA8192PRIMES_3
RSA81924RSA8192PRIMES_4
RSA81925RSA8192PRIMES_5

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

系统对主线程有时间限制,耗时较长会导致失败。建议生成大位数密钥时,使用异步接口或使用多线程并发能力

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

使用密钥参数生成

从API版本10开始,支持使用密钥参数生成RSA密钥。

RSA密钥参数,涉及三个整数,包括:

  • n:模数(Modulus),是私钥和公钥的公共参数。
  • sk:私钥指数(privateExponent),公式中常写作d。
  • pk:公钥指数(publicExponent),公式中常写作e。

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

  • √:表示需要指定这一列中的具体属性,来构成密钥参数。
  • ×:表示这一列中的具体属性对应某种密钥参数,但是当前不支持通过该密钥参数生成密钥。
参数名公共参数公钥参数私钥参数公私钥对参数
n××
pkN/AN/A
skN/AN/A×

根据上表:

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

ECC

ECC(Elliptic Curve Cryptography),是一种基于椭圆曲线数学的公钥密码算法。

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

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

使用字符串参数生成

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

非对称密钥算法密钥长度(bit)曲线名字符串参数API版本
ECC224NID_secp224r1ECC2249+
ECC256NID_X9_62_prime256v1ECC2569+
ECC384NID_secp384r1ECC3849+
ECC521NID_secp521r1ECC5219+
ECC160NID_brainpoolP160r1ECC_BrainPoolP160r111+
ECC160NID_brainpoolP160t1ECC_BrainPoolP160t111+
ECC192NID_brainpoolP192r1ECC_BrainPoolP192r111+
ECC192NID_brainpoolP192t1ECC_BrainPoolP192t111+
ECC224NID_brainpoolP224r1ECC_BrainPoolP224r111+
ECC224NID_brainpoolP224t1ECC_BrainPoolP224t111+
ECC256NID_brainpoolP256r1ECC_BrainPoolP256r111+
ECC256NID_brainpoolP256t1ECC_BrainPoolP256t111+
ECC320NID_brainpoolP320r1ECC_BrainPoolP320r111+
ECC320NID_brainpoolP320t1ECC_BrainPoolP320t111+
ECC384NID_brainpoolP384r1ECC_BrainPoolP384r111+
ECC384NID_brainpoolP384t1ECC_BrainPoolP384t111+
ECC512NID_brainpoolP512r1ECC_BrainPoolP512r111+
ECC512NID_brainpoolP512t1ECC_BrainPoolP512t111+
ECC256NID_secp256k1ECC_Secp256k114+

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

使用密钥参数生成

从API版本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
pkN/AN/A
skN/AN/A

  • 当前ECC只支持Fp域,因此fieldType固定为"Fp"。fieldType和p构成了属性field,当前field只支持ECFieldFp
  • g和pk为ECC曲线上的点,属于Point类型,需要指定具体的X和Y坐标。

使用曲线名生成密钥参数

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

  • 曲线名为要求输入的字符串参数,支持的曲线名请参考ECC密钥字符串参数表中的“曲线名”一列。
  • 生成的公共密钥参数可以直接用于随机生成公私钥,也可用于构造公钥、私钥及公私钥对密钥参数。

DSA

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

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

约束与限制

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

系统对主线程有时间限制,耗时较长会导致失败。建议生成大位数密钥时,使用异步接口或使用多线程并发能力

使用字符串参数生成

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

非对称密钥算法密钥长度(bit)字符串参数API版本
DSA1024DSA102410+
DSA2048DSA204810+
DSA3072DSA307210+

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

系统对主线程有时间限制,耗时较长会导致失败。建议生成大位数密钥时,使用异步接口或使用多线程并发能力

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

使用密钥参数生成

从API版本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×
pkN/AN/A
skN/AN/A×

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

SM2

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

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

使用字符串参数生成

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

非对称密钥算法密钥长度(bit)曲线名字符串参数API版本
SM2256NID_sm2SM2_25610+

使用密钥参数生成

从API版本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
pkN/AN/A
skN/AN/A

  • 当前SM2只支持Fp域,因此fieldType固定为"Fp"。fieldType和p构成了属性field,当前field只支持ECFieldFp
  • g和pk为SM2曲线上的点,属于Point类型,需要指定具体X,Y坐标。

使用曲线名生成密钥参数

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

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

Ed25519

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

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

使用字符串参数生成

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

非对称密钥算法字符串参数API版本
Ed25519Ed2551911+

使用密钥参数生成

从API版本11开始,支持使用密钥参数生成Ed25519密钥。

Ed25519密钥参数包括:

  • sk:私钥,一个 32 字节的随机值。
  • pk:公钥,一个 32 字节的值,从私钥派生而来。

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

  • √:表示需要指定这一列中的具体属性,来构成密钥参数。
参数名公钥参数私钥参数公私钥对参数
pkN/A
skN/A

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

X25519

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

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

使用字符串参数生成

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

非对称密钥算法字符串参数API版本
X25519X2551911+

使用密钥参数生成

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

X25519密钥参数包括:

  • sk:私钥,一个 32 字节的随机值。
  • pk:公钥,一个 32 字节的值,从私钥派生而来。

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

  • √:表示需要指定这一列中的具体属性,来构成密钥参数。
参数名公钥参数私钥参数公私钥对参数
pkN/A
skN/A

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

DH

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

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

使用字符串参数生成

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

非对称密钥算法知名安全素数群参数密钥长度(bit)字符串参数API版本
DHmodp15361536DH_modp153611+
DHmodp20482048DH_modp204811+
DHmodp30723072DH_modp307211+
DHmodp40964096DH_modp409611+
DHmodp61446144DH_modp614411+
DHmodp81928192DH_modp819211+
DHffdhe20482048DH_ffdhe204811+
DHffdhe30723072DH_ffdhe307211+
DHffdhe40964096DH_ffdhe409611+
DHffdhe61446144DH_ffdhe614411+
DHffdhe81928192DH_ffdhe819211+

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

使用密钥参数生成

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

DH密钥参数,包括:

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

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

  • √:表示需要指定这一列中的具体属性,来构成密钥参数。
参数名公共参数公钥参数私钥参数公私钥对参数
p
g
l
pkN/AN/A
skN/AN/A

使用素数长度和私钥长度生成公共密钥参数

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

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

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