我正在为SSH服务器编写代码,无法通过连接的Elliptic Curve Diffie-Hellman Key Exchange Reply部分。客户端也会关闭连接并说“主机密钥与提供的签名不匹配”。
我使用putty作为客户端,PIC微控制器正在运行服务器代码。
来自RFC 5656 [SSH ECC算法集成]:
“哈希H是通过在a上应用算法HASH形成的 连接以下内容:
string V_C, client's identification string (CR and LF excluded)
string V_S, server's identification string (CR and LF excluded)
string I_C, payload of the client's SSH_MSG_KEXINIT
string I_S, payload of the server's SSH_MSG_KEXINIT
string K_S, server's public host key
string Q_C, client's ephemeral public key octet string
string Q_S, server's ephemeral public key octet string
mpint K, shared secret
“
主机密钥算法和密钥交换算法分别为ecdsa-sha2-nistp256和ecdh-sha2-nistp256。
引用RFC 4251进行数据类型表示,以及openSHH(openBSD)中的源代码,这就是我连接的内容。
连接后我用SHA256哈希,因为我使用的是NISTP256。 SHA256输出32个字节,这是曲线的大小,因此我采用整个SHA256输出并对其执行签名算法。
我永远无法从邮件串联中获得正确的签名。
我知道我的签名算法是正确的,因为给定消息哈希输出我可以得到正确的签名。 我知道我的共享秘密是正确的,因为我获得与在线共享秘密计算器相同的输出。 我知道SHA256是正确的,因为我使用在线计算器获得相同的结果。
这使我假设错误在交换哈希的串联中。
非常感谢任何帮助,谢谢。
答案 0 :(得分:0)
ECDSA签名生成是非确定性的,即输入的一部分是散列,输入的一部分由随机字节组成。所以无论你做什么,你总会得到一个不同的签名。这样就可以了,因为签名验证仍然有效。
获得重复签名的唯一方法是弄乱随机数生成器(在测试期间,您不希望使用相同的随机数对两个值进行签名:您将公开私钥!)。