我使用 JSCH 0.1.53 连接到使用 1024 位 RSA 密钥的远程 SSH 服务器。当我们还使用 1024 位 RSA 密钥时,我们能够成功连接到远程服务器,但是当我们生成更强的 2048 位密钥时,我们就无法连接了。我们收到一条错误消息,内容为“素数大小必须是 64 的倍数,并且范围只能从 512 到 2048”,并且源自对 DHGEX.java (Diffie-Hellman Group EXchange) 的调用。
我们正在运行 Java 1.8,并且错误消息正确指定了 2048 的最大位大小,所以问题不在于 Java 1.6 和 1.7 中 1024 位的 JCE 密钥限制。我们已经通过 openssl rsa -text -noout -in id_rsa 和 ssh-keygen -lf id_rsa.pub 确认我们的私钥和公钥实际上都是 2048 位。
由于一切看起来都很好,我开始在 JSCH 代码中添加调试行并重新编译 JAR,我最终能够确定在密钥交换期间传递给我们的模数实际上是 2047 位长。现在,2047 位的长度本质上并不意味着您没有生成 2048 位的密钥,或者它的强度不如实际包含 2048 位的密钥,它只是意味着您碰巧得到了相乘的两个素数到第一位是 0 的东西。所以这是预期的行为(有时),JCE 检查可能应该是 (n % 64 == 0 || n % 64 == 63)。但是 JCE 在这一点上是一个坚持者,因此它拒绝了这个密钥,因为它不是它认为有效的长度。 …