Java IOException,使用SealeObject.getObject()时流标头无效

Java IOException,使用SealeObject.getObject()时流标头无效,java,ioexception,secret-key,Java,Ioexception,Secret Key,我正在尝试使用SealeObject通过RMI连接发送数据 目标是一个SealedObject,密码是预先初始化的(据我所知,这是正确的),但当我运行以下代码时,我得到一个IOException,其中包含消息 invalid stream header: 52FAA4D1 其中54FAA4D1每次都是不同的8个字符的十六进制字符串 有问题的代码是 target.getObject(cipher); 目标和密码都不是空的-所以我认为问题在于如何设置密码。密钥在客户端和服务器上的创建方式完全相同

我正在尝试使用SealeObject通过RMI连接发送数据

目标是一个SealedObject,密码是预先初始化的(据我所知,这是正确的),但当我运行以下代码时,我得到一个IOException,其中包含消息

invalid stream header: 52FAA4D1
其中54FAA4D1每次都是不同的8个字符的十六进制字符串

有问题的代码是

target.getObject(cipher);
目标和密码都不是空的-所以我认为问题在于如何设置密码。密钥在客户端和服务器上的创建方式完全相同,因此我处于停滞状态

密码是使用

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

//Do this to get the same parameters as were used on the client side
cipher.init(Cipher.ENCRYPT_MODE, this.key);
AlgorithmParameters parameters = cipher.getParameters();

//Set to decrypt mode using the same parameters
byte[] iv = parameters.getParameterSpec(IvParameterSpec.class).getIV();
cipher.init(Cipher.DECRYPT_MODE, this.key, new IvParameterSpec(iv));
我试过使用中间部分和不使用中间部分,但两者都不起作用

如果我在第二次调用cipher.init()时删除了其中的最后一个参数,我会得到一个InvalidKeyException,如果我完全删除中间部分,只使用cipher.getParameters.getParameterSpec(IVParameterSpec.class).getIV();我得到一个NullPointerException


所以,是的,完全卡住了-任何帮助,即使理解问题是什么,都会得到感激。

当您在客户端调用
cipher.init(cipher.ENCRYPT\u MODE,key)
时,会生成一个随机IV。在服务器上,对
ciper.init
的第一次调用只是生成一个与传入消息不匹配的不同的随机IV,因此
getObject
只能看到无意义的内容


您需要使用与加密消息相同的IV来解密每条消息。在这种情况下,您可能只需在密码前面加上IV。然后将IV读入服务器上的字节数组,并使用它初始化解密。

这一行是怎么回事
AlgorithmParameters cipher.getParameters()哎呀,这就是我抄写而不是复制+粘贴的结果。我实际上设置了变量参数=cipher.getParameters();(以上已更正)以便使用相同的参数进行解密。实际上,我并没有在这里加密任何东西-加密是在客户端完成的:但我认为参数与密钥相同?我认为在上面的代码部分target.getObject(cipher).With
cipher.init(cipher.encrypt\u MODE,key)
之前还有其他东西在读取密码,我相信会生成一个随机IV来加密消息。您需要在服务器上使用相同的IV进行解密。这可能会起作用-尽管我无法判断这是否导致了另一个错误,或者只是让我在代码中进一步跌跌撞撞地找到了一个已经存在的错误。。。。我会进一步调查的。