将RSA Public.pem文件转换为pkcs8



使用以下命令创建RSA公钥-私钥对-

私钥-

openssl genrsa -out private-key.pem 512

公钥

openssl rsa -in private-key.pem -pubout -out public-key.pem

使用以下命令将private-key.pemPEM转换为pkcs8(工作完全正常)-

openssl pkcs8 -topk8 -inform PEM -outform DER -in private-key.pem -nocrypt > my_key

但是是否可以使用如下命令将public-key.pem从PEM转换为pkcs8

openssl pkcs8 -topk8 -inform PEM -outform DER -in public-key.pem -nocrypt > my_key.pub

获取以下错误-

openssl pkcs8 -topk8 -inform PEM -outform DER -in public-key.pem -nocrypt > my_key.pub
unable to load key
4525680300:error:09FFF06C:PEM routines:CRYPTO_internal:no start line:/AppleInternal/Library/BuildRoots/66382bca-8bca-11ec-aade-6613bcf0e2ee/Library/Caches/com.apple.xbs/Sources/libressl/libressl-2.8/crypto/pem/pem_lib.c:684:Expecting: ANY PRIVATE KEY

"无法加载密钥"期望:ANY PRIVATE KEY";

喜欢将其用于基于RSA的JWT过程,如

PKCS8不是公钥的标准这就是为什么Java,包括您链接的代码,使用PKCS8EncodedKeySpec作为私有密钥,而使用X509EncodedKeySpec——而不是PKCS8——作为公钥。

要创建Java想要的X.509(SPKI)DER公钥,请使用

openssl rsa -pubin -in public.pem -outform der -out public.der

或与提取步骤结合

openssl rsa -in private.pem -pubout -outform der -out public.der

此外,您应该知道512位RSA非常弱,而且在25年前是可破解的;我最近没有检查过,但现在它可能几分钟后就会坏掉。但这与编程或开发无关,因此也不属于主题,除非如果您想将其用于JWT/JWS/JWE,这些JWA/JWS/JWE使用JWA RFC7518中的算法,以及RSA签名(3.3和3.5)和密钥传输(4.2),文档要求密钥为"2048位或更大"。


添加以供评论:genrsa命令的最后一个参数是密钥的大小(以位为单位);您的genrsa ... 512生成512。例如,openssl rsa -in private.pem -text -noout可以看到这一点(您并不真正需要-noout,这只是减少了混乱)。替换例如2048将生成2048比特密钥,这是当今最常见的标准(也是最常见的实际值),尽管有些人仍然使用稍小的值,一些人更喜欢使用更大的值来防止传统技术中比预期更快的改进(但不是量子技术,如果在实际规模上实现量子技术,预计将打破RSA的所有实际大小,并需要更改为完全不同的算法)。

我猜你实际上看到了文件的大小(它总是以字节为单位显示)。这与密钥的大小(以位为单位测量)大不相同,但永远不会是256,而且很少是512(即偶然等于模数的位大小)。

传统/对称密码的第一(也是从根本上)密钥大多"只是比特"(尽管DES通过使用奇偶校验混淆了这一点),但RSA等公钥/非对称算法的密钥更复杂。RSA密钥对(OpenSSL的私钥实际上是一个密钥对,这就是为什么你可以从中提取公钥)以模n开始,但也包含两个指数(e和d)、两个素数因子(p和q)和几个"CRT"分量(dp、dq和qinv)。有关详细信息,请参阅重新发布为RFC8017 et pred的维基百科或PKCS1,特别是3.2和A.1.2。RSA密钥的大小通常由其模数(仅以位为单位)来衡量,但完整的密钥对要大几倍,尽管公钥仅略大于模数。

其次,OpenSSL用于存储密钥(仅密钥对或公钥)的文件包含的不仅仅是实际密钥;它们包含大小因格式而异的元数据,在某些情况下是超编码和/或加密的,这增加了大小(尽管您的示例不使用加密),并且文件以字节为单位进行测量。首先,OpenSSL使用抽象语法符号一(又名ASN.1)和特别是区分编码规则(又名DER)表示所有非对称密钥(链接到那里);对于RSA密钥,这些是上面链接的RFC8017 A.1.2和A.1.1中的ASN.1结构。ASN.1 DER是一种可变长度编码,512位RSA密钥的RSAPrivateKey结构通常在317-321字节的范围内变化,尽管它可能(很少)更少(但永远不会更多)。

对于私钥(keypairs),OpenSSL有两种主要格式,有几种变体或子格式。对于DER中的"传统"格式,它只需编写PKSC1 RSAPrivateKey结构;在PEM中,如果不加密,它首先用换行符将PKCS1结构转换为base64,然后添加头和尾行,总字节数通常为487-498。PEM格式可以加密,这使得它更长。对于算法通用的PKCS8形式,如果在DER中未加密,它有效地将在这种情况下为26字节的头添加到PKCS1结构,通常给出343-347字节,其转换为520-532字节的PEM;加密的PKCS8,在DER或PEM中都支持,更大。这些都不是256。

公钥OpenSSL的OTOH(至少在大多数命令行中)只使用一种格式,有两种变体;由X.509定义的SubjectPublicKeyInfo结构中来自PKCS1(上面链接)的RSAPublicKey结构,如PKIX RFC5280 4.1所子集。对于512位RSA,结果是DER中的94个字节或PEM中的182-186个字节(均未加密)。同样不是256。