簡體   English   中英

C# BouncyCastle PKCS#8

[英]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-----
  • 我嘗試使用 BouncyCastle 使用以下代碼,但它拋出 PemException:“創建加密私鑰的問題:Org.BouncyCastle.Crypto.InvalidCipherTextException:墊塊損壞”
 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
  • 但是,我通過以下代碼使用 .netcore3.1 加載完全相同的 PEM 文件:
    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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM