[英]C# BouncyCastle PKCS#8
我想使用 .net 框架(不是 .netcore)加載 PEM
-----BEGIN ENCRYPTED PRIVATE KEY-----
MIHs........................................................CAAw
DAYI........................................................gZAf
Y/Iu........................................................X7DZ
ZKoE........................................................OYQQ
3ZST........................................................A2E=
-----END ENCRYPTED PRIVATE KEY-----
class Passowrd : IPasswordFinder
{
private string v;
public Passowrd(string v)
{
this.v = v;
}
public char[] GetPassword()
{
return v.ToCharArray();
}
}
var pemReader = new PemReader(new StringReader(privateKeyText), new Passowrd("PASSWORD"));
var pemObj = pemReader.ReadObject(); // this line throw PemException
var ecdsa = ECDsa.Create();
ecdsa.ImportEncryptedPkcs8PrivateKey(passSpan, privateKeyBytes, out _);
您可以使用閱讀 PEM
var pemReader = new Org.BouncyCastle.OpenSsl.PemReader(new StringReader(privateKeyText), new Passowrd("PASSWORD"));
或者
var pemReader = new Org.BouncyCastle.Utilities.IO.Pem.PemReader(new StringReader(privateKeyText));
然后閱讀內容
var pemObject = pemReader.ReadPemObject();
問題似乎與密鑰的加密有關:如果在加密密鑰時未設置選項-v2prf hmacWithSHA1
,則無法使用PemReader
讀取密鑰。
選項-v2prf
從 V1.1.0 開始存在,並指定與PKCS#5 v2.0或密鑰派生 function PBKDF2一起使用的 PRF(偽隨機函數)算法。
案例 1:創建新密鑰
以下兩個語句創建並加密密鑰:
openssl ecparam -name secp256r1 -genkey -noout -out <out-path> openssl pkcs8 -topk8 -v2 aes256 -v2prf hmacWithSHA1 -in <in-path> -out <out-path> // aes256 as of OpenSSL 1.1.0 inclusive
以這種方式生成的密鑰可以使用PemReader
成功讀取。 但是,如果缺少選項-v2prf hmacWithSHA1
,則會引發異常。
案例 2:修復已生成的密鑰
以下語句解密已加密的密鑰:
openssl pkcs8 -topk8 -nocrypt -in <in-path> -out <out-path>
如果密鑰隨后使用-v2prf hmacWithSHA1
選項集(見上文)加密,則可以使用PemReader
成功讀取密鑰。 通過這種方式,我能夠修復發布的密鑰,以便可以使用PemReader
讀取它!
在openssl pkcs8
的文檔中可以找到一個可能的(不幸的是只是膚淺的)解釋。 在那里可以閱讀有關-v2prf
選項的信息:
某些實現可能不支持自定義 PRF 算法,並且可能需要 hmacWithSHA1 選項才能工作。
有趣的是,使用 .NET Core 3.x 中的ECDsa#ImportEncryptedPkcs8PrivateKey
可以毫無問題地讀取關鍵密鑰。 要獲得完整的解釋,可能需要查看源代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.