使用以下命令创建RSA公钥-私钥对-
私钥-
openssl genrsa -out private-key.pem 512公用钥匙
openssl rsa -in private-key.pem -pubout -out public-key.pem使用以下命令将private-key.pem从PEM转换为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“无法加载密钥”:“期望:任何私钥”
发布于 2022-05-06 12:48:55
PKCS8不是公钥的标准,所以,包括您链接的代码,使用PKCS8EncodedKeySpec作为私钥,而X509EncodedKeySpec --而不是PKCS8 --用于公钥。
要创建X.509 (SPKI) DER publickey Java想要的,请使用
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 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)。有关详细信息,请参阅维基百科或PKCS1重新发布为RFC8017 et pred,特别是3.2和A.1.2。RSA密钥的大小通常是通过其模数(仅以比特为单位)来衡量的,但是完整的密钥比模数大几倍,尽管公开密钥仅略大于模数。
其次,OpenSSL用于存储密钥(仅用于密钥或公钥)的文件所包含的不仅仅是实际的密钥;它们包含的元数据大小取决于格式,在某些情况下是超编码和/或加密的,从而增加了大小(尽管您的示例不使用加密),并且文件以字节为单位进行度量。首先,OpenSSL使用摘要语法表示法--又名ASN.1表示所有非对称密钥,特别是区分编码规则,即DER (链接在那里);对于RFC8017密钥,这些是上面链接的RFC8017 A.1.2和A.1.1中的ASN.1结构。DER是一种可变长度的编码,512位RSA密钥的RSAPrivateKey结构通常在317到321字节之间变化,尽管它可以(很少)更少(但永远不会更多)。
然后,对于私钥(键盘),OpenSSL有两种主要格式,有几种变体或子格式。对于DER中的“传统”格式,它只是编写PKSC1 RSAPrivateKey结构;在PEM中,如果不加密,它首先用换行符将PKCS1结构转换为base64,然后添加标题和预告片行,总计通常为487-498字节。PEM格式可以加密,这使得它更长。对于算法-泛型PKCS8表单,如果在DER中未加密,它实际上在PKCS1结构中添加了一个26字节的标头,通常为343-347字节,将其转换为520-532字节;在DER或PEM中支持的加密PKCS8更大。这些都不是256。
OTOH用于公钥OpenSSL (至少在大多数命令行中)只使用一种格式和两个变体;由X.509由PKIX RFC5280 4.1分设置。定义的SubjectPublicKeyInfo结构中来自PKCS1的RSAPublicKey结构(链接在上面)。对于512位RSA,结果在DER中为94字节,在PEM中为182-186字节(均未加密)。再说一次不是256。
https://stackoverflow.com/questions/72106568
复制相似问题