簡體   English   中英

如何在 C# 中加載私有 ecdsa 密鑰 es256?

[英]How to load private ecdsa key es256 in c#?

我使用以下命令生成私有和公共 ES256 密鑰:

創建私鑰:openssl ecparam -genkey -name prime256v1 -noout -out private.pem

創建公鑰:openssl ec -in private.pem -pubout -out public.pem

現在我得到了以下私鑰:

----- BEGIN EC PRIVATE KEY ----- MHcCAQEEIFkxqdXoVAGSSc55u0muepwVRr3ARWzLMO0ywW7qhEeIoAoGCCqGSM49 AwEHoUQDQgAEFXuuZeDJN9dvjCwKy40 / coi3NVto97qELhiRSObbhX3mUSvxpPeK fVv3 / fVCjt9CeGuwYvkQPHmRfx0EFjAI8A == ----- END EC PRIVATE KEY -----

以及以下公鑰:

-----開始公開密鑰----- MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEFXuuZeDJN9dvjCwKy40/coi3NVto 97qELhiRSObbhX3mUSvxpPeKfVv3/GuVCjRyt9-----A-KEYjRj8vC-----

我想將這些密鑰加載到 c# 中的 ecdsa 實例中。 我使用以下代碼執行此操作:

public ECDsaSecurityKey LoadPrivateKey()
    {
        byte[] privateKey = Convert.FromBase64String(PRIVATE_KEY);
        try
        {
            ECDsa? privateKeyEcDsa = ECDsa.Create();

            if (privateKeyEcDsa == null)
            {
                throw new CryptographicException(message: "Key not created");
            }

            privateKeyEcDsa.ImportPkcs8PrivateKey(source: privateKey, bytesRead: out _);

            return new ECDsaSecurityKey(privateKeyEcDsa);
        }
        catch (CryptographicException exception)
        {    
            throw;
        }
    }

和公鑰:

     public ECDsaSecurityKey LoadPublicKey()
        {
byte[] publicKey = Convert.FromBase64String(PUBLIC_KEY);
            try
            {
                ECDsa? publicKeyEcDsa = ECDsa.Create();

                if (publicKeyEcDsa == null)
                {
                    throw new CryptographicException(message: "Key not created");
                }

                publicKeyEcDsa.ImportSubjectPublicKeyInfo(source: publicKey, bytesRead: out _);

                return new ECDsaSecurityKey(publicKeyEcDsa);
            }
            catch (CryptographicException exception)
            {
                this._logger.LogError("Something went wrong while loading EcDsa public key: " + exception.Message);

                throw;
            }
        }

當我運行單元測試時,事情不起作用,引發錯誤: 在此處輸入圖片說明

我不確定為什么這不起作用? openssl 命令是否生成正確的密鑰對類型?

編輯:在這個網站上,當我選擇 ES256 私鑰是不同的: https ://kjur.github.io/jsjws/tool_jwt.html

例子:

----- BEGIN PRIVATE KEY ----- MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgEbVzfPnZPxfAyxqE ZV05laAoJAl + / 6Xt2O4mOB611sOhRANCAASgFTKjwJAAU95g ++ / vzKWHkzAVmNMI tB5vTjZOOIwnEb70MsWZFIyUFD1P9Gwstz4 + akHX7vI8BH6hHmBmfeQl ----- END PRIVATE KEY -----

我用 OpenSSL 生成的私鑰最后添加了兩個相等:

----- BEGIN EC PRIVATE KEY ----- MHcCAQEEIFkxqdXoVAGSSc55u0muepwVRr3ARWzLMO0ywW7qhEeIoAoGCCqGSM49 AwEHoUQDQgAEFXuuZeDJN9dvjCwKy40 / coi3NVto97qELhiRSObbhX3mUSvxpPeK fVv3 / fVCjt9CeGuwYvkQPHmRfx0EFjAI8A == ----- END EC PRIVATE KEY -----

所以我想我在使用 open ssl 時做錯了什么。

私鑰具有 SEC1 格式而不是 PKCS#8 格式,即必須通過ImportECPrivateKey()完成導入。

公鑰是 X.509/SPKI 密鑰,因此ImportSubjectPublicKeyInfo()是正確的。

這兩種方法都需要 DER 編碼的密鑰,即沒有頁眉和頁腳以及 Base64 解碼的正文。

如果考慮到這一點,代碼就可以工作(至少在我的機器上)。

這些方法在 .NET Core 3.x 和 .NET 5.0 中可用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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