java - 关闭 CipherInputStream 的替代方法

标签 java inputstream encryption objectinputstream

我遇到了麻烦,因为我需要关闭 de CIS(否则我不会得到最后 16 个字节),但我不能,因为我通过套接字使用它:

cis = new CipherInputStream(new ObjectInputStream(socket.getInputStream));

(不完全是这样,但它的构造方式就是这样)。

因此,如果我关闭套接字,程序就会尝试使用它,然后我会得到一个异常...

非常感谢!

最佳答案

您不需要关闭CipherInputStream来读取最后一个数据 block 。这没有任何意义。

发生的情况是,您的 CipherInputStream 已读取最终密文 block 中的所有数据,但在底层流上的 read() 调用中被阻止。检测到流结束会触发 CipherInputStream 在其密码上调用 doFinal() 而不是 update()。通常,会发生这种情况,因为已到达流末尾,在您的情况下,因为套接字已关闭。

如果您想避免关闭套接字,您需要知道密文的长度。这可能来自 HTTP header ,或您创建的用于传输加密数据的某些其他协议(protocol)。

使用一个类来扩展 FilterInputStream,该类跟踪已消耗了多少字节(不要忘记 skip() 方法),并在读取指定长度的密文时从 read() 方法返回 -1。重写派生类中的 close() 方法,以便它不会关闭基础流。

关于java - 关闭 CipherInputStream 的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16305495/

相关文章:

javascript - 简单的非对称加密算法

amazon-web-services - 无法部署到 Tomcat - 没有 httpd 进程

java - Spring MVC : bind request attribute to controller method parameter

java - 推荐一本关于Java与x509安全通信的书

java - Pgp 签名+加密然后解密+验证

java - 在核心java中,从用户获取输入并将其插入mysql数据库时,显示错误sql错误

Java - 当不需要写入文件时 - 我应该使用输入流还是输出流?

java - Struts2 下载期间自动插入空格

java - 如何在Java中旋转128位数字

java - 如何解密密文分区 - AES、Java