来自 OpenSSL `genrsa` 的加密 RSA PEM 格式是什么?
What is the encrypted RSA PEM format from OpenSSL `genrsa`?
我有一些加密的私钥和密码,我想在没有 OpenSSL 的情况下加载到 .NET 中,但我找不到它们的格式和规范。
我可以从 PEM 解析和解码二进制数据,本来我以为我会得到 PKCS#8,但似乎不是这样。
创建它们的 OpenSSL 命令如 openssl genrsa -des3 -out test.key 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 -inform PEM
..我假设这两个 "headers" 是显着特征,但格式是什么?共同价值观是什么?
RFC 1421 好像是这么叫的 headers "encapsulated header",不然我没找到。
这是 OpenSSL 的 'traditional' 或 'legacy' 格式的私钥文件(或几个文件之一,具体取决于您的计数方式)。它记录在手册页中,在您的系统或 on the web 中,用于相关例程——名义上 man 3 PEM_{read,write}{,_bio}_{RSA,DSA,EC}PrivateKey
尽管此页面在许多名称下被复制或符号链接——在 'PEM ENCRYPTION FORMAT' 部分.简而言之,使用从密码派生的密钥(盐等于 IV 或其一部分,这是不寻常的,只有一次迭代,很弱)。使用的 password-based 密钥派生函数 EVP_BytesToKey
有自己的手册页。
这是不是 PKCS8。除了以不同于 PKCS8 加密(正式的 EncryptedPrivateKeyInfo
)的方式加密之外,您在解密后获得的 clear 数据(或者如果您不加密开始,例如genrsa
没有 -$cipher
) 不是 PKCS8-clear PrivateKeyInfo
。它是一种 algorithm-dependent 数据格式;对于 RSA,它是 PKCS1 appendix A.1.2 中定义的格式,而对于 DSA 和 EC,它具有此处不相关的其他格式。
OpenSSL 也 支持 PKCS8 私钥文件,明文和加密,具有不同的 PEM 类型:BEGIN/END PRIVATE KEY
和 BEGIN/END ENCRYPTED PRIVATE KEY
但 不是BEGIN/END {RSA,DSA,EC} PRIVATE KEY
。对于 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 版本,但它可能值得一看。
如果没有,或者如果您不能使用它,您可以通过添加 mostly-fixed header; 将(解密的)PKCS1 格式转换为 PKCS8;在 ASN.1 术语中,PKCS8 是一个包装器,其中包含一些元数据以及一个 OCTET STRING,其中包含用于 RSA 的 PKCS1 编码。我没有针对此的 dotnet 解决方案,但您可以使用我在 Algid parse error, not a sequence and perhaps Converting a string private key to PrivateKey type 的链接列表从 Java 改编。
我有一些加密的私钥和密码,我想在没有 OpenSSL 的情况下加载到 .NET 中,但我找不到它们的格式和规范。
我可以从 PEM 解析和解码二进制数据,本来我以为我会得到 PKCS#8,但似乎不是这样。
创建它们的 OpenSSL 命令如 openssl genrsa -des3 -out test.key 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 -inform PEM
..我假设这两个 "headers" 是显着特征,但格式是什么?共同价值观是什么?
RFC 1421 好像是这么叫的 headers "encapsulated header",不然我没找到。
这是 OpenSSL 的 'traditional' 或 'legacy' 格式的私钥文件(或几个文件之一,具体取决于您的计数方式)。它记录在手册页中,在您的系统或 on the web 中,用于相关例程——名义上 man 3 PEM_{read,write}{,_bio}_{RSA,DSA,EC}PrivateKey
尽管此页面在许多名称下被复制或符号链接——在 'PEM ENCRYPTION FORMAT' 部分.简而言之,使用从密码派生的密钥(盐等于 IV 或其一部分,这是不寻常的,只有一次迭代,很弱)。使用的 password-based 密钥派生函数 EVP_BytesToKey
有自己的手册页。
这是不是 PKCS8。除了以不同于 PKCS8 加密(正式的 EncryptedPrivateKeyInfo
)的方式加密之外,您在解密后获得的 clear 数据(或者如果您不加密开始,例如genrsa
没有 -$cipher
) 不是 PKCS8-clear PrivateKeyInfo
。它是一种 algorithm-dependent 数据格式;对于 RSA,它是 PKCS1 appendix A.1.2 中定义的格式,而对于 DSA 和 EC,它具有此处不相关的其他格式。
OpenSSL 也 支持 PKCS8 私钥文件,明文和加密,具有不同的 PEM 类型:BEGIN/END PRIVATE KEY
和 BEGIN/END ENCRYPTED PRIVATE KEY
但 不是BEGIN/END {RSA,DSA,EC} PRIVATE KEY
。对于 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 版本,但它可能值得一看。
如果没有,或者如果您不能使用它,您可以通过添加 mostly-fixed header; 将(解密的)PKCS1 格式转换为 PKCS8;在 ASN.1 术语中,PKCS8 是一个包装器,其中包含一些元数据以及一个 OCTET STRING,其中包含用于 RSA 的 PKCS1 编码。我没有针对此的 dotnet 解决方案,但您可以使用我在 Algid parse error, not a sequence and perhaps Converting a string private key to PrivateKey type 的链接列表从 Java 改编。