讲师中心 微信公众号
AI工具推荐 视频效率加速

Java 中字节流怎么利用管道过滤器流 FilterInputStream 编写自定义的加解密流

陌萱大大_1065

陌萱大大_1065

发布时间:2026-07-28 12:57:59

|

945人浏览过

|

来源于php中文网

原创

Java中自定义加解密字节流需继承FilterInputStream(解密输入)或FilterOutputStream(加密输出),重写read/write方法实现透明加解密,关键在于流方向、缓冲管理、IV一致性及异常处理。

java 中字节流怎么利用管道过滤器流 filterinputstream 编写自定义的加解密流

Java 中可以通过继承 FilterInputStream(或 FilterOutputStream)编写自定义加解密字节流,核心是重写 read() 和 read(byte[], int, int) 方法,在读取原始数据后、返回给调用方前进行加密或解密处理。注意:加密流通常用于**解密输入**(即从加密源读取并透明解密),解密流对应“解密”,而“加密输出”应继承 FilterOutputStream;但常被统称为“加解密流”,关键在方向与职责清晰。

一、明确流方向:解密输入流 vs 加密输出流

FilterInputStream 的子类天然适用于“解密输入”场景:它包装一个底层 InputStream(如文件、网络流),每次 read() 返回的字节已是解密后的明文。反之,若要加密写入,应继承 FilterOutputStream,在 write() 时对明文字节加密后再写入底层流。

  • ✅ 解密输入流(推荐继承 FilterInputStream):构造时传入加密的源流,read() 返回解密后数据
  • ❌ 不要用 FilterInputStream 实现“加密读取”(读明文再加密无意义)
  • ⚠️ 若需“加密写入”,必须另写 EncryptingOutputStream extends FilterOutputStream

二、实现一个 AES 解密输入流(基于 FilterInputStream)

以 AES/CBC/PKCS5Padding 为例,需在构造时传入密钥、IV,并初始化 Cipher 为 DECRYPT_MODE。由于 CipherInputStream 已内置支持,这里展示**手动控制解密逻辑**的自定义写法(便于理解原理和定制):

  • 使用 ByteArrayInputStream 缓存已解密的明文字节,避免每次 read() 都触发完整块解密
  • 重写 read():先检查缓存是否有可用字节;若空,则从底层流读取加密块(如 16 字节 AES 块),解密后填入缓存,再返回首字节
  • 重写 read(byte[] b, int off, int len):同样优先从缓存取,不足时再触发解密填充
  • 注意处理流末尾(padding 填充、最后一块可能不完整)、异常(Cipher.init() 失败、底层流 EOF)

三、关键细节与避坑点

自定义加解密流易出错,以下几点直接影响正确性与性能:

Java Maven Code Review
Java Maven Code Review

审查Java Maven项目(ZIP压缩包或GitLab仓库URL),检查代码规范、命名、模块边界、可维护性问题以及重复代码。

下载

立即学习“Java免费学习笔记(深入)”;

  • 缓冲区管理必须严格:不能跳过或重复解密同一段密文;建议用 ByteBuffer 或字节数组 + 游标(pos/limit)管理缓存
  • IV 必须与加密端一致:若加密时随机生成 IV 并前置写入,解密流需先读取前 N 字节作为 IV;否则需外部传入固定 IV
  • 不要在 read() 中抛出未声明异常:所有 CryptoException 应包装为 IOException(因 InputStream.read() 只声明抛出 IOException)
  • 关闭流时释放 Cipher 资源:虽 Cipher 本身无 close,但可重写 close() 确保底层流被关闭

四、简单示例:XOR 解密输入流(轻量演示)

XOR 因其可逆性适合教学演示,无需复杂算法库:

public class XorDecryptInputStream extends FilterInputStream {
    private final byte key;
    private int bufferedByte = -1; // 缓存单字节解密结果

    public XorDecryptInputStream(InputStream in, byte key) {
        super(in);
        this.key = key;
    }

    @Override
    public int read() throws IOException {
        int c = super.read();
        if (c == -1) return -1;
        return c ^ key;
    }

    @Override
    public int read(byte[] b, int off, int len) throws IOException {
        int n = super.read(b, off, len);
        if (n <= 0) return n;
        for (int i = off; i < off + n; i++) {
            b[i] ^= key;
        }
        return n;
    }
}

使用:new XorDecryptInputStream(new FileInputStream("enc.dat"), (byte)0x55) —— 即可透明读取 XOR 加密的文件。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

10037

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

7182

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

6312

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1084

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

908

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

1336

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2649

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

19971

2023.08.03

C++运算符基础入门
C++运算符基础入门

本专题详细讲解了C++运算符的类型、语法与使用方法,涵盖算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、条件运算符及其他特殊运算符,并通过代码示例解析优先级与结合性。

0

2026.10.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn