我正在 C# 应用程序和用 C 编程的嵌入式设备之间实现安全交换。 System.Security.Cryptography 没有关于其任何加密算法“在幕后”做什么的文档。为了在 C 中实现相同的东西,我需要知道这一点,为此我有更多的基本库。具体来说,我想知道 ECDiffieHellman.DeriveKeyFromHash(HashAlgorithmName.SHA256) 做了什么。
我尝试过跟踪 API,但它以调用 ncrypt.h 中的非托管 NCryptDeriveKey 结束。
该方法似乎不是简单地执行共享密钥的 SHA256 哈希。我在 C 端做了这个,我得到了不同的值。我知道在 C# 端收到的公钥是有效的,否则之前的方法会引发异常。我猜数据是按照一些 NIST 文件的规定附加或附加的,但情况是这样吗?还是我还缺少其他东西?
编辑:原来我在 C 端做错了什么。对 C# 行为的额外确认有助于缩小搜索范围。
ECDiffieHellmanCng ecdh = new ECDiffieHellmanCng(myEccKeys);
//This would throw an exception if PeerRawPublicKey was invalid.
var PeerPublicKey = ECDiffieHellmanCngPublicKey.FromByteArray(PeerRawPublicKey.ToArray(), CngKeyBlobFormat.EccPublicBlob);
//How is keyMaterial generated?
byte[] keyMaterial = ecdh.DeriveKeyFromHash(PeerPublicKey, HashAlgorithmName.SHA256, null, null);