当前位置: 首页 > 知识库问答 >
问题:

OpenSSL`genrsa`中的加密RSA PEM格式是什么?

杜辰龙
2023-03-14

我有一些加密的私钥和密码短语,我想加载进去。NET没有OpenSSL,但我很难找到它们的格式和规范。

我可以解析和解码来自PEM的二进制数据,最初我以为我会得到PKCS#8,但事实似乎并非如此。

创建它们的OpenSSL命令是OpenSSL genrsa-des3-out test。键2048生成如下文件:

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,7EF293A7B0C43A20

bwz7TPBN2Xr6AxW9y7PRkaQjXYOS3bireDgyD0lBfKMqQ9AV2oTNUcrI2MtaquBH
QaK+bZY0XBpviceXPrfl73cFrBLBZM7/QhyxINWvcuJiq/hyHFwkT/kEOPWg3g+B
6hIKnMiKcObrU2BVHzt9kuiAneRZob9KwohvIHKpD15y0b0Gm8djBTXBAMgDbyIR
vvQvOrWcyTGLhZs+xq07Bv+tpl9ben8RJcOLVb/xBiaoucvUA/jzyT4BcaZmeeNZ
+tSR8B4R0/AWvK5nTpHtDA/5VKWdrGy5HZPNqLOzKO9IMY6xbFrNnPs9/EwufZsi
USLQ/U5/4qdJ/uOMuOuzb0IHTbwMYfsi66Dv0tnCkp6Fmd0ZIGSQvXESQebCbSuJ
mSc3XgpbWK9C0WqHt5jwYs6Ta3TTwXw8aeDWAcyyHCfvcQRUoWWPEverqrZ6u9Ub
Q6+50qkrHqK0JLTclVj5ty1doWRmcu9tyKRpzQuULo9MPkJDYAxrzzbOzMEXrOVM
oKgK/lJSjFx2dHkyTA4Puuu8jyAj99tyhuVCr8G13voB3RdgglKuyAtIamaI8gPU
n13ysFtZv60oWbmP3obeRw3GJvuLkBUOkEGXxCaEmqHhSfA20bnXLPO5iGVHLoiI
Uiv0G+9+726A4GIGJBxVq0I1mt9IMXpqopiyuz22v4dKDJ5MHmtqyt3RalRfki6B
yJh51O46duyKedaWK94P9ZOpVdUcxsPMzJ9UmPW+L/r+N/tQlP54deK86Pq73LrS
9UIQ8A2QMylU0BvpXNLg5w08C3mAzKA4h+QBUL0RMe6JCk1wipKzDJ7oeNh0r/EN
JgMAi1Fxra1PjvPRNG7iYBSiyYoO75W8BIBPW0py6v72mzWQ8Dx9kcH+Xdr5vWfW
aagBTwv17zpfcLtuhmT6FVSg0A1iIQHM6TDjhRq+cJxH4ioaLZNHFxCXNhGa5c2g
E4KOtZPdnCubNinCdzZn0B5KNgKkCVSlm4o6bRrfdqrBLzBBlTTA3mkJgxQYbDzW
W6ET5LZTbJkozSi2nRehyLvLV/FUlIKneyRqQdLFksH82/3R+CW0jsGei+qB8XMY
9ssfQ7ccsvzfCHlss/g/v3uKCwOhTZ3yzo2IA16w4hftlw7IwT4jfOF73CRYILg+
C8Iw2+VMGZmEgDdwJt3TdSB95MDY/WJGwCR7fiat1oMP/uhGqhNyuswnZTq/gWMH
rDJfELbv8HAQfYuh2I3/HDmwjyUi8FkWPpbKhcOHQB8pk3zZTERk3NtV6iAYSG+V
rxEIj3yB3zjn5+9QFOEAU6edqigeM1UKdH5jUUc3hi+C4evzR1xbomDp3JQyw0PB
Jlj2tFMhDhj4thmltBKs1ZwUAd7ei7gvgvQq2vJB1zmwxHS/8g83lryOUHU9zQTF
8SObmYEEmUzy7I5CgvKcePQkRqeZD4x4nsf3Q09NvljrXaWGJjLH+Xjzg3h7fR5b
GvrX7EyyEdFwf3z1tcA/VcFnIQptLTDcjlpxou16WaM1F/OVQ/OGNJnG1xHbVwTv
cDNbpyoP5xERAYSp2YpFTVGJG43tcdDhLjZMN7WGHIb4Qc5Gm1JabxPtys2YnLhB
-----END RSA PRIVATE KEY-----

据我所知,Base64编码的数据是无效的DER/ASN,我找到的工具只是说数据是无效的,包括openssl asn1parse-通知PEM...我假设这两个“标题”是显著的特征,但是格式是什么?有哪些共同的价值观?

RFC 1421似乎将这些报头称为"封装报头",否则我没有找到它们。

共有1个答案

江阳夏
2023-03-14

这是OpenSSL的“传统”或“传统”格式的私钥文件(或几种格式中的一种,取决于您的计算方式)。它被记录在手册页中,在您的系统或网络上,用于“PEM加密格式”部分中的相关例程——名义上的man 3 PEM_{read,write}{,_bio}{RSA,DSA,EC}PrivateKey,尽管该页面在许多名称下重复或符号链接。简单地说,使用从密码派生的密钥(salt等于IV或其一部分,这是不寻常的,并且只有一次迭代,这是很弱的)对数据进行加密(在本例中,使用选定的对称算法,即DES3 aka DESE aka triple DES,使用CBC和IV)。所使用的基于密码的密钥派生函数,EVP_BytesToKey,有自己的手册页。

这不是PKCS8。除了加密方式不同于PKCS8加密(正式称为EncryptedPrivateKeyInfo)之外,解密后获得的清晰数据(或者如果不加密,例如不加密-$cipher)不是PKCS8 clearPrivateKeyInfo。相反,它是一种依赖于算法的数据格式;对于RSA,它是PKCS1附录A.1.2中定义的格式,对于DSA和EC,它有其他与此无关的格式。

OpenSSL还支持PKCS8私钥文件,包括明文和加密文件,它们具有不同的PEM类型:BEGIN/END PRIVATE KEYBEGIN/END encrypted PRIVATE KEY,但不支持BEGIN/END{RSA,DSA,EC}私钥。有关API,请参见相同的手册页。您可以在命令行中使用

openssl pkcs8 -topk8 <tradfile >pk8file [-nocrypt | -v1 pbcipher | -v2 plaincipher]`
# since 1.0.0 in 2010 you can add -iter N
# or since 1.0.0 simply
openssl pkey <tradfile >pk8file [-$cipher]

PKCS8更标准(也更可互换),也更安全,因此推荐使用——正如前面注释部分中的同一手册页所述。

BouncyCastle的Java版本支持bcpkix中的OpenSSL PEM格式。我不知道dotnet版本的版本,但它可能值得一看。

如果没有,或者无法使用,可以通过添加一个基本固定的头将(解密的)PKCS1格式转换为PKCS8;在ASN。1术语,PKCS8是一个包装器,包含一些元数据和一个八位字符串,其中包含RSA的PKCS1编码。我没有一个dotnet解决方案来解决这个问题,但您可能可以使用我在Algid parse error的链接列表,而不是序列,或者将字符串私钥转换为PrivateKey类型,从Java进行调整。

 类似资料:
  • 问题内容: 背景 在Linux上使用以下命令在OpenSSL上生成RSA密钥, 创建了以下内容: Java下的以下代码6, 输出以下内容: 问题 如何在通过Java代码创建的私钥和公钥周围放置“盔甲”? 为什么通过Java代码生成的每一行密钥都比OpenSSL输出的密钥长? 有什么区别吗?其他团队正在使用的一种工具在使用上述Java代码生成的私钥对消息签名时失败。但是,该工具使用OpenSSL生成

  • 似乎以下两个命令(来自LibreSSL的openssl)都会生成私钥。他们之间有区别吗?如果没有,为什么有两种方法来生成私钥?谢谢

  • 我正在尝试使用带有相同密钥和 iv 的 AES 加密相同的文本。我使用 bash 方法和 ruby 的 openssl stdlib,并对加密结果进行 b64 编码。但结果不同!我试图理解为什么。这是我所做的: 红宝石(1.9.3-p448) 砰砰�� -iv参数设置为上面计算的iv_hex值。 ========================================= 我仔细检查了静脉注

  • 下面的是一段密码,我也知道解密后是什么?但是怎么知道他是什么加密算法生成的? 61LaNaqd2rmtAxAsJs94hw==

  • 问题内容: 我正在写一种加密会话密钥的方法。它需要这样做,以便可以通过已成功测试的其他程序解密密钥。解密程序无法更改。我受困的是使我的加密工作与解密例程保持一致。 首先让我给出解密例程。请记住,这不能改变: 这是我正在编写的加密例程。我生成base64编码的文本,但最终无法解密。值得注意的是,我已验证解密例程正确获取了加密例程的结果(两者之间没有握手问题)。 我真的被卡住了。任何帮助表示赞赏。谢谢

  • 我有这样的情况,我使用OpenSSL生成了一个公钥/私钥对,供gdcmanon使用,遵循他们网站上列出的说明。具体地说,我使用以下命令为gdcmanon生成密钥 然后,我就能够按照他们的指示,加密一个文件,使用 这在c.init(cipher.decrypt_mode,key)行失败; 我已经为Java6安装了JCE(我正在使用)。我不知道我做错了什么。谁能给我指出正确的方向吗。 谢谢