我正在实现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);
它只计算Hash(prepend || Z || append)
,其中 Z 是共享密钥的 X 坐标。
对于每个前置和追加,空值被视为空。
corefx 非 Windows 实现