System.Security.Cryptography的DeriveKeyFromHash()实际做什么?

时间:2019-07-23 00:56:53

标签: c# .net cryptography system.security

我正在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);

1 个答案:

答案 0 :(得分:1)

它仅计算Hash(prepend || Z || append),其中Z是共享机密的X坐标。

对于每个前置和追加,空值都被视为空。

The corefx non-Windows implementation