paramiko ssh客户端在主机密钥签名不匹配中失败

时间:2015-09-23 17:53:48

标签: python hash ssh biginteger paramiko

我们有一个SSH服务器实现,我们正在使用Paramiko客户端来测试diffie-hellman-group-exchange-shaX的主机密钥签名不匹配。我已经找出了签名不匹配的原因,但无法理解哪个侧服务器或客户端做错了什么。以下是不匹配的原因

1.Client将“min || n || max”发送给Server。

2.Server找到一个最符合客户端请求的组,然后发送        客户端“p || g”。其中p是大素数而g是发电机 现在问题发生在服务器发送大小超过1的生成器时,它在字节数组中用前面的零加上它的前面的长度加上(大数字表示)

00 00 00 04 00 00 00 02其中04是生成器长度,02是它的值。用于主机密钥签名匹配的H使用完整的字节缓冲区来进行散列。 H由

表示

H = hash(V_C || V_S || I_C || I_S || K_S || min || n || max || p || g || e || f || K)

现在,当paramiko存储生成器时,它会删除前面的零并且不存储长度 它将g转换回字节并使用len(g)预先填充字节缩减的g的长度以进行散列 使用以下例程。

def add_string(self, s):
    """                                                                                                                                                                                                                                  
    Add a string to the stream.                                                                                                                                                                                                          

    :param str s: string to add                                                                                                                                                                                                          
    """
    s = asbytes(s)
    self.add_size(len(s))
    self.packet.write(s)

这只是一个字节,因此我们基本上对g字节缓冲区进行散列如下所示 00 00 00 01 02其中01是字符串长度,02是与服务器g缓冲区不同的值,因此签名不匹配

所以我的问题是哪一方错误地表示大字节的字节缓冲区?

1 个答案:

答案 0 :(得分:0)

根据RFC4251:

  

块引用

panic()

因此服务器正在做的是错误的,并且paramiko正确地删除了前面的填充零。