我们有一个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缓冲区不同的值,因此签名不匹配
所以我的问题是哪一方错误地表示大字节的字节缓冲区?
答案 0 :(得分:0)
根据RFC4251:
块引用
panic()
因此服务器正在做的是错误的,并且paramiko正确地删除了前面的填充零。