我正在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);
答案 0 :(得分:1)
它仅计算Hash(prepend || Z || append)
,其中Z是共享机密的X坐标。
对于每个前置和追加,空值都被视为空。