c# - 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);
解决方案
它只计算Hash(prepend || Z || append)
,其中 Z 是共享密钥的 X 坐标。
对于 prepend 和 append 中的每一个,null 值都被视为空值。
推荐阅读
- elasticsearch - 如何仅返回嵌套字段中的匹配对象,而不是整个对象?
- css - REACT-IconButton 在 flexlayout 中不可见
- angularjs - 为什么 URL 在单独执行而不是在 forkJoin 中时给出响应?
- c# - 当我键入`@`时如何制作一个文本框光标自动转到文本框的开头C#
- python - 登录ubuntu之前如何在python守护进程中使用DBUS
- swift - iOS 14 Widget 每天自动刷新
- sql - 如何避免收到消息 ORA-00979:不是 GROUP BY 表达式
- complex-event-processing - Esper / NEsper EPL 事件声明
- javascript - 解禁命令 Discord.js V12
- react-native - 反应本机导航 v5 导航选项卡在底部栏内