Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
DHGEX在Java8下使用2048位密钥失败,但使用1024位密钥成功_Java_Public Key Encryption_Jsch_Diffie Hellman - Fatal编程技术网

DHGEX在Java8下使用2048位密钥失败,但使用1024位密钥成功

DHGEX在Java8下使用2048位密钥失败,但使用1024位密钥成功,java,public-key-encryption,jsch,diffie-hellman,Java,Public Key Encryption,Jsch,Diffie Hellman,我使用JSCH 0.1.53连接到远程SSH服务器,该服务器使用1024位RSA密钥。当我们还使用1024位RSA密钥时,我们能够成功连接到远程服务器,但当我们生成更强的2048位密钥时,我们就无法连接。我们收到一条错误消息,内容为“prime size必须是64的倍数,并且只能在512到2048之间”,该消息源于对DHGEX.java(Diffie-Hellman组交换)的调用 我们正在运行Java1.8,错误消息正确地指定了2048的最大位大小,因此问题不在于Java1.6和1.7中的102

我使用JSCH 0.1.53连接到远程SSH服务器,该服务器使用1024位RSA密钥。当我们还使用1024位RSA密钥时,我们能够成功连接到远程服务器,但当我们生成更强的2048位密钥时,我们就无法连接。我们收到一条错误消息,内容为“prime size必须是64的倍数,并且只能在512到2048之间”,该消息源于对DHGEX.java(Diffie-Hellman组交换)的调用

我们正在运行Java1.8,错误消息正确地指定了2048的最大位大小,因此问题不在于Java1.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在这一点上是一个坚持者,所以它拒绝使用这个键,因为它认为这个键的长度不是有效的

基于此,我认为我已经发现了问题:远程服务器生成了一个2048位的密钥,该密钥只包含2047位,因此他们只需要生成一个新密钥(并一直这样做,直到得到一个真正是2048位的密钥为止)。但是当我问他们的管理员这件事时,他们坚持说他们使用的是1024位的密钥,事实上,当您使用SSH时,您在已知的\u hosts文件中得到的就是这个密钥。所以这似乎并不是原因

因此我开始记录缓冲区的内容,其中包含他们发送给我们的内容,并提取p和g值(模数和组),我发现在短短几天的测试中,有33个不同的模数值,当以64进制或10进制编码时,所有字符的区别仅在于最后几个字符。Modulii值被重用,有时只重用一次,有时重用十几次,但有许多不同的值,因此键既不是一次性生成的,也不是一次性生成并永远重用的

这是在任何情况下的预期行为(让服务器发送许多数字非常接近的不同密钥,具有一些重用但有许多唯一的值),尤其是当客户端使用2048位密钥而服务器使用1024位密钥时的预期行为?我对Diffie Hellman group exchange一无所知,除了从上周开始调查以来读到的内容之外,所以也许这就是它的工作原理,但对我来说似乎很奇怪

此外,SSH标准是否规定了在此类情况下应如何生成密钥?我还没有发现远端使用的是什么SSH服务器(我怀疑是OpenSSH,但不确定也不知道是什么版本),但我希望有某种标准强制使用与请求大小相同的密钥(介于1^(n-1)和1^n-1之间),远程服务器可能有一个强制执行此操作的选项,或者我可以提交一个针对它们的bug,让它们更改行为。我可能还会提交一个针对JDK的bug,允许使用n-1位的键,第一位使用0填充

任何人能给予的任何指导都将不胜感激

我还将此问题发布到JSCH邮件列表:

更新:

进一步阅读后,我认为Diffie Hellman的前向保密特性意味着每个会话(源:)将使用不同的素数(通常来自存储在/etc/ssl/moduli等位置的预生成集),并且使用的素数实际上不是RSA密钥(源:),因此,看到许多不同的p值这一事实似乎不再令人担忧。我仍然感到惊讶的是,它们的价值如此接近,但也许这也是意料之中的


远端使用Solaris SSH 1.1.4(据我所知,它基于OpenSSH)作为SSH守护进程。作为Diffie-Hellman密钥交换的一部分,是否预期该守护进程将传递2047位素数,是否可以采取任何措施使其发送2048位素数?

我们修复了类似的症状:

Security.insertProviderAt(new BouncyCastleProvider(), 1)
我们使用的是Jsch 0.1.54和saw:

java.security.InvalidalgorithParameterException:DH密钥大小必须是64的倍数,并且只能在512到4096(含)之间。不支持特定密钥大小2047


可能相关的是

我通过禁用使用Diffie-Hellman组密钥交换变体的密钥交换算法来解决这个问题@BrianLow似乎通过使用BouncyCastle而不是JDK的内置安全提供程序来解决这个问题


我认为这两个都是解决不了根本问题的解决办法(在JDK中,对于他们接受的密钥大小或OpenSSH中的密钥大小,它们似乎是一个错误)。但是,我和我的项目都没有花足够的时间和金钱来强迫一方或另一方拥有这个问题的所有权。

你安装了文件吗?我没有,我也没有看到任何让我认为有必要安装的文件。通过使用JUnit测试,我能够使用2048位密钥运行引发异常的代码(在com.jcraft.jsch.jce.DH对象上填充p和g,然后对其调用getE()),它运行时没有问题,但在使用从远程服务器接收的2047位密钥运行时失败。