首页 > 解决方案 > System.Security.Cryptography 的 DeriveKeyFromHash() 实际上做了什么?

问题描述

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

标签: c#.netcryptographysystem.security

解决方案


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

对于 prepend 和 append 中的每一个,null 值都被视为空值。

corefx 非 Windows 实现


推荐阅读