簡體   English   中英

ByteArray中的ECDiffieHellmanPublicKey(使用ECDiffieHellman NamedCurves)

[英]ECDiffieHellmanPublicKey from ByteArray (using ECDiffieHellman NamedCurves)

我正在使用通訊nodejs-> c#服務器。 我需要確保它們之間的連接安全,因此我選擇使用ECDiffieHellman作為密鑰交換機制(nodejs支持它)。 我有一些問題...只是我的知識不足,所以我上了一節課,現在我可以生成和導出密鑰,因為base64和nodejs在接受c#密鑰方面沒有問題,但另一方面c#...贏了“甚至拿不到自己的鑰匙…… error System.Security.Cryptography.CryptographicException: 'The parameter is incorrect.' 是的,我知道我做錯了,但是呢?

using (ECDiffieHellman alice = ECDiffieHellman.Create(ECCurve.NamedCurves.brainpoolP256r1))
{

    var alicePublicKey = Convert.ToBase64String(alice.PublicKey.ToByteArray());
    //NODEJS brainpoolP256r1 publickey 
    var key1 = Convert.FromBase64String("BB92GQLod55fXEhgNxwQcPQFFvph7eIjnSzdNz2PhzUAOcaPEiLBPQR6AL5pqVLFram8OtPapoBGYZn2vaGl+/U=").ToList();
    //test
    var key2 = Convert.FromBase64String(alicePublicKey);
    var keyType = new byte[] { 0x45, 0x43, 0x4B, 0x50 };
    var keyLength = new byte[] { 0x20, 0x00, 0x00, 0x00 };
    key1.RemoveAt(0);
    key1 = keyType.Concat(keyLength).Concat(key1).ToList();
    byte[] bobKeyBytes = key1.ToArray();
    ECDiffieHellmanPublicKey k = ECDiffieHellmanCngPublicKey.FromByteArray(bobKeyBytes, new CngKeyBlobFormat("ECCPUBLICBLOB")); //error  System.Security.Cryptography.CryptographicException: 'The parameter is incorrect.'
    ECDiffieHellmanPublicKey kk = ECDiffieHellmanCngPublicKey.FromByteArray(key2, new CngKeyBlobFormat("ECCPUBLICBLOB")); // error System.Security.Cryptography.CryptographicException: 'The parameter is incorrect.'
    byte[] aliceKey = alice.DeriveKeyMaterial(k);
    byte[] encryptedMessage = null;
    byte[] iv = null;
    // Send(aliceKey, "Secret message", out encryptedMessage, out iv);
}

您可以在ECDH nodejs和C#密鑰交換中找到其余的故事

您聲稱進入key1的base64內容用於brainpoolP256r1。

對該值進行解碼,我們看到它是一個以04開頭的65字節有效負載,對於帶有256位素數的曲線,它看起來像是未壓縮的點編碼。 到現在為止還挺好。

您甚至已經正確使用了BCRYPT_ECDH_PUBLIC_GENERIC_MAGIC,但是如果不指定可告訴它哪個曲線的導入屬性,就無法導入“通用命名關鍵點”。

從這一點開始加載密鑰的簡單方法是

byte[] keyX = new byte[key1.Length / 2];
byte[] keyY = new byte[keyX.Length];
Buffer.BlockCopy(key1, 1, keyX, 0, keyX.Length);
Buffer.BlockCopy(key1, 1 + keyX.Length, keyY, 0, keyY.Length);

ECParameters parameters = new ECParameters
{
    Curve = ECCurve.NamedCurves.brainpoolP256r1,
    Q =
    {
        X = keyX,
        Y = keyY,
    },
};

byte[] derivedKey;

using (ECDiffieHellman bob = ECDiffieHellman.Create(parameters))
using (ECDiffieHellmanPublicKey bobPublic = bob.PublicKey)
{
    derivedKey = alice.DeriveKeyFromHash(bobPublic, HashAlgorithmName.SHA256);
}

我已經將DeriveKeyMaterial方法擴展為DeriveKeyMaterial的默認含義,因為其他類型的ECDH不支持該方法(由於其行為特異性低)。

暫無
暫無

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

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