3

我正在尝试使用 SealedObjects 通过 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

所以,是的,完全卡住了——任何有助于理解问题所在的帮助都将不胜感激。

4

1 回答 1

4

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

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

于 2012-03-06T03:10:52.790 回答