计算ecdsa-sha2-nistp256

时间:2018-04-27 20:29:51

标签: ssh digital-signature

我正在为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)中的源代码,这就是我连接的内容。

  1. 4字节,然后是V_C的长度,接着是V_C
  2. 4个字节,然后是V_S的长度,接着是V_S
  3. I_C长度为4个字节,后跟I_C(有效负载从消息代码到随机填充的开始)
  4. I_S长度为4个字节,后跟I_S(有效负载从消息代码到随机填充的开始)
  5. 4个字节,长度为K_S,后跟K_S(对于K_S,我使用了相同的字节组来计算指纹)
  6. Q_C长度为4字节,后跟Q_C(我使用长度为65 - 04 || X坐标|| Y坐标的未压缩字符串)
  7. 4个字节,长度为Q_S,后跟Q_S
  8. 4个字节,长度为K,后跟K(长度为32或33,取决于是否设置了前导位。如果设置,则K前面加上00字节)
  9. 连接后我用SHA256哈希,因为我使用的是NISTP256。 SHA256输出32个字节,这是曲线的大小,因此我采用整个SHA256输出并对其执行签名算法。

    我永远无法从邮件串联中获得正确的签名。

    我知道我的签名算法是正确的,因为给定消息哈希输出我可以得到正确的签名。 我知道我的共享秘密是正确的,因为我获得与在线共享秘密计算器相同的输出。 我知道SHA256是正确的,因为我使用在线计算器获得相同的结果。

    这使我假设错误在交换哈希的串联中。

    非常感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分:0)

ECDSA签名生成是非确定性的,即输入的一部分是散列,输入的一部分由随机字节组成。所以无论你做什么,你总会得到一个不同的签名。这样就可以了,因为签名验证仍然有效。

获得重复签名的唯一方法是弄乱随机数生成器(在测试期间,您不希望使用相同的随机数对两个值进行签名:您将公开私钥!)。