我在通过 mina-sshd 组件使用 arcfour256 算法连接目标设备时遇到了数据包解码长度异常的问题
mina-sshd 版本:2.9.2
问题现象
- 我尝试了 arcfour128 以及另外一些安全高一些的算法通过mina-sshd组件进行连接操作,目前可以正常连接;
- 使用 arcfour256 算法时直接通过 xshell 客户端去连接目标设备是正常的,但是使用 mina-sshd 组件去连接就会出现异常;
- 使用 arcfour256 算法时,通过 mina-sshd 组件去连接目标设备的场景下,我切换了目标设备的openssh版本,5.3和7.4都无法正常连接、切换不同网段的目标设备进行连接也无法正常连接;
- 最后还有一个有意思的现象是在上面失败的场景下,去连接腾讯云服务器上的openssh7.4服务端是可以正常连接的
异常信息调用栈
Exception in thread "main" org.apache.sshd.common.SshException: [ssh-connection]: Failed (IllegalArgumentException) to execute: Bad arguments at org.apache.sshd.common.future.AbstractSshFuture.lambda$verifyResult$2(AbstractSshFuture.java:146) at org.apache.sshd.common.future.AbstractSshFuture.formatExceptionMessage(AbstractSshFuture.java:206) at org.apache.sshd.common.future.AbstractSshFuture.verifyResult(AbstractSshFuture.java:145) at org.apache.sshd.client.future.DefaultAuthFuture.verify(DefaultAuthFuture.java:56) at org.apache.sshd.client.future.DefaultAuthFuture.verify(DefaultAuthFuture.java:35) at org.apache.sshd.common.future.VerifiableFuture.verify(VerifiableFuture.java:121) at sshTools.SshClientTool.createConnect(SshClientTool.java:213) at sshTools.SshClientTool.main(SshClientTool.java:70) Caused by: java.lang.IllegalArgumentException: Bad arguments at javax.crypto.Cipher.update(Cipher.java:1941) at org.apache.sshd.common.cipher.BaseCipher.update(BaseCipher.java:122) at org.apache.sshd.common.session.helpers.AbstractSession.decode(AbstractSession.java:1644) at org.apache.sshd.common.session.helpers.AbstractSession.messageReceived(AbstractSession.java:505) at org.apache.sshd.common.session.helpers.AbstractSessionIoHandler.messageReceived(AbstractSessionIoHandler.java:64) at org.apache.sshd.common.io.nio2.Nio2Session.handleReadCycleCompletion(Nio2Session.java:409) at org.apache.sshd.common.io.nio2.Nio2Session$1.onCompleted(Nio2Session.java:382) at org.apache.sshd.common.io.nio2.Nio2Session$1.onCompleted(Nio2Session.java:377) at org.apache.sshd.common.io.nio2.Nio2CompletionHandler.lambda$completed$0(Nio2CompletionHandler.java:38) at java.security.AccessController.doPrivileged(Native Method) at org.apache.sshd.common.io.nio2.Nio2CompletionHandler.completed(Nio2CompletionHandler.java:37) at sun.nio.ch.Invoker.invokeUnchecked(Invoker.java:126) at sun.nio.ch.Invoker$2.run(Invoker.java:218) at sun.nio.ch.AsynchronousChannelGroupImpl$1.run(AsynchronousChannelGroupImpl.java:112) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:750)
我在进行代码调试时发现:
当接收到第八个数据包的时候,该方法内的 updatelen 变成了-8,难道是由于 inCipherSize(加密块的大小)可能不适用于流加密算法??(如 arcfour256,也就是 RC4),因为流加密算法不使用块概念。具体不是很清楚