IOException,使用SealedObject.getObject()时无效的流标头

时间:2012-03-06 02:33:14

标签: java ioexception secret-key

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

target是一个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

所以是的,完全卡住了 - 任何帮助,甚至理解问题是什么都会受到赞赏。

1 个答案:

答案 0 :(得分:3)

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

您需要使用相同的IV来解密每条消息,就像用于加密它一样。在这种情况下,您可以将IV添加到密码之前。然后将IV读入服务器上的字节数组,并使用它来初始化解密。