IOException异常,使用

问题描述:

我试图用SealedObjects超过一个RMI连接IOException异常,使用

目标是SealedObject,密码预先初始化(正确的,据我发送数据SealedObject.getObject()时无效流头中号aware)的,但是当我运行下面的代码,我得到一个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

所以是的,完全卡住了 - 任何帮助赞赏甚至理解什么是问题将不胜感激。

+0

这一行发生了什么? 'AlgorithmParameters cipher.getParameters();' – takteek 2012-03-06 02:41:27

+0

哎呀,这就是我得到的抄录复制粘贴。我实际上设置了变量参数= cipher.getParameters(); (如上所述)以便使用相同的参数进行解密。我实际上并没有加密任何东西 - 加密是在客户端完成的:但我认为参数是一样的,因为密钥是一样的? – 2012-03-06 02:43:55

+0

我认为在上面的代码部分target.getObject(cipher)之前,别的东西正在读你的密码。 – 2012-03-06 02:51:03

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

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

+0

这可能会起作用 - 虽然我无法判断它是否导致了另一个错误,或者只是让我通过我的代码进一步绊倒了一个已经存在的代码....我会进一步调查。 – 2012-03-06 03:29:26