无CRT分量的RSA私钥DER编码成功但EVP_PKCS82PKEY解码失败原因咨询
问题原因与解决方案
为什么编码成功但解码失败
这是OpenSSL对RSAPrivateKey结构的编码、解码校验逻辑不一致导致的,结合RFC 8017的规范定义可以明确原理:
规范中RSAPrivateKey的ASN.1定义如下:
RSAPrivateKey ::= SEQUENCE { version Version, modulus INTEGER, -- n publicExponent INTEGER, -- e privateExponent INTEGER, -- d prime1 INTEGER, -- p prime2 INTEGER, -- q exponent1 INTEGER, -- d mod (p-1) exponent2 INTEGER, -- d mod (q-1) coefficient INTEGER, -- (inverse of q) mod p otherPrimeInfos OtherPrimeInfos OPTIONAL }当version取值为0时,代表这是双素数RSA私钥,规范要求必须携带
prime1到coefficient的所有CRT相关字段,仅多素数私钥(version=1)才允许使用末尾可选的otherPrimeInfos字段。
- 编码阶段宽松校验:OpenSSL的ASN.1编码(i2d系列)逻辑只校验已填入字段的合法性,不会强制检查必选字段是否完整。只要你构造的RSA结构体中已有的字段格式正确,哪怕CRT字段全为NULL、不符合规范要求,也会正常完成编码输出DER内容。
- 解码阶段严格校验:你调用的
EVP_PKCS82PKEY内部会调用d2i系列解码函数,这部分逻辑是严格按照ASN.1定义做字段完整性校验的。当解析到version字段为0时,会强制要求后续出现p、q等所有CRT字段,只要缺任意一个就会抛出field missing错误,终止解码流程。
修复方案
如果你需要实现不带CRT分量的私钥正常编解码,可选择以下两种方案:
- 补全CRT字段后编码:如果你的私钥已经有n、e、d三个核心字段,可以通过这三个字段计算出p、q等CRT分量,编码时填入所有字段,生成符合RFC规范的私钥结构,解码时就不会报错。
- 手动解析私钥绕过校验:如果必须使用无CRT分量的私钥结构,可以不要直接调用
EVP_PKCS82PKEY解码,自己手动解析DER结构提取n、e、d字段,构造RSA结构体后再赋值给EVP_PKEY使用。
内容的提问来源于stack exchange,提问作者Brahmaji Kommanaboyina
相关产品推荐
相关产品推荐

