论文:PacketPatch:面向基于字节特征的加密流量分类的对抗性数据包实际生成与部署
作者:Yuwei Xu, Yuanyuan Xu, Yunpeng Bai, Jiahui Chen, Kehui Song, Jie Cao, Qiao Xiang, Guang Cheng
单位:东南大学、紫金山实验室、天津工业大学、女王大学、厦门大学
状态:已接收/审稿中(Elsevier)
PacketPatch 是一种实用的方案,用于生成针对基于字节特征的加密流量分类(B-ETC)模型的对抗性网络数据包,旨在保护用户隐私。与现有依赖不切实际的白盒假设或引入过多开销的方法不同,PacketPatch 在严格的黑盒条件下运行,同时保持实时性能和数据包可用性。

Pad1 → arg min(最大程度破坏原始特征)Pad2 → arg max(生成与随机头对齐的特征)PacketPatch/
├── README.md # 项目概览(本文件)
├── LICENSE # MIT 许可
├── requirements.txt # Python 依赖
├── bert_base_config.json # BERT 模型配置(12 层,768 维,12 注意力头)
│
├── packet_adv/ # ★ 核心实验代码
│ ├── README.md # 核心模块使用指南
│ ├── adv_fine_tuning_cls.py # 步骤 1:训练 PatchGenerator(SpanBERT)
│ ├── generate.py # 步骤 2:生成对抗性数据包
│ └── gen_onnx.py # 步骤 3(可选):ONNX/TensorRT 加速
│
├── uer/ # UER(Universal Encoder Representations)框架
│ ├── README.md # 框架文档
│ ├── encoders/ # 编码器实现(Transformer、RNN、CNN)
│ ├── layers/ # 网络层(嵌入、注意力、前馈网络)
│ ├── targets/ # 训练目标(MLM、NSP、Span-MBM 等)
│ ├── models/ # 模型定义
│ ├── utils/ # 实用工具(分词器、优化器、数据加载)
│ ├── model_builder.py # 模型构建
│ ├── model_loader.py # 预训练权重加载
│ ├── model_saver.py # 模型检查点保存
│ ├── trainer.py # 训练循环实现
│ └── opts.py # 命令行参数定义
│
├── dataset/ # 数据集文档
│ └── README.md # 数据集描述、下载链接、预处理
│
├── image/ # 架构与结果图
│ └── README.md # 图说明
│
└── tools/ # 实用工具
└── README.md # 工具说明与用法
# 克隆此仓库
git clone https://github.com/your-org/PacketPatch.git
cd PacketPatch
# 安装依赖
pip install -r requirements.txt
要求:
PacketPatch 基于 ET-BERT。从 ET-BERT 仓库 下载以下内容:
pretrained_model.bin — ET-BERT 预训练权重encryptd_vocab.txt — 字节对编码的词汇表文件数据集:我们在三个公开数据集上进行了评估。下载链接与预处理说明请参见 dataset/README.md。
| 数据集 | 类别数 | 场景 |
|---|---|---|
| ISCX-TOR | 16 | Tor 匿名流量 |
| ISCX-VPN | 11 | VPN 加密隧道 |
| USTC | 20 | 恶意软件 + 良性流量 |
cd packet_adv
# 首先编辑 adv_fine_tuning_cls.py:
# - 更新数据集路径(第 47-50 行)
# - 更新预训练模型路径(第 73-75 行)
# - 设置正确的 num_classes(第 56 行)
# - 设置正确的训练集大小(第 878 行)
python adv_fine_tuning_cls.py
训练后的检查点将保存在指定的日志目录中(例如 span_2seg_cls_log/)。
cd packet_adv
# 首先编辑 generate.py:
# - 更新测试数据路径(第 42-44 行)
# - 将 --load_model_path 指向训练后的检查点(第 68-69 行)
# - 设置 BWO(带宽开销比例,第 60 行,默认为 0.1)
# - 通过 'fun' 参数选择生成策略(第 50 行)
python generate.py
cd packet_adv
# 首先编辑 gen_onnx.py:
# - 更新模型检查点路径(第 132 行)
# - 更新输出路径(第 145、207 行)
# - 选择精度模式:'fp16' 或 'int8'(第 21 行)
python gen_onnx.py
fun 参数)PacketPatch 的 PatchGenerator 通过两个自监督任务进行训练:
判断两个输入数据包是否属于同一流量类别。这使模型具备判别性特征提取能力。
损失:二分类交叉熵
利用双向上下文重建连续的掩码字节跨度。这使模型具备上下文感知的字节序列生成能力。
损失:负对数似然
总损失:Loss = Loss_SCP + Loss_Span-MBM

| 阶段 | 时间(毫秒/数据包) |
|---|---|
| 数据包预处理 | 0.054 |
| 扰动生成 | 9.626 |
| 数据包重构 | 0.398 |
| 总计 | 10.078 |
PacketPatch 在严格黑盒假设下优于以下白盒基线方法:

如果您在研究中使用 PacketPatch,请引用我们的论文:
@article{xu2025packetpatch,
title = {PacketPatch: Practical Generation and Deployment of Adversarial Packets for Byte-Feature-Based Encrypted Traffic Classification},
author = {Yuwei Xu and Yuanyuan Xu and Yunpeng Bai and Jiahui Chen and Kehui Song and Jie Cao and Qiao Xiang and Guang Cheng},
journal = {Elsevier},
year = {2025},
}
本项目采用 MIT 许可协议 — 详见 LICENSE 文件。
如有问题或咨询,请联系通讯作者或在 GitHub 上提交 issue。
本项目基于 ET-BERT 框架构建,该框架提供了预训练模型和 UER(Universal Encoder Representations)训练框架。感谢 ET-BERT 作者的宝贵贡献。
| 参数 | 文件 | 行号 | 描述 | 默认值 |
|---|
BWO | generate.py | 60 | 带宽开销比例 | 0.1(10%) |
fun | generate.py | 50 | 生成策略 | 'fun5' |
n_epochs | adv_fine_tuning_cls.py | 53 | 训练轮数 | 50 |
batch_size | adv_fine_tuning_cls.py | 54 | 批量大小 | 32 |
num_classes | adv_fine_tuning_cls.py | 56 | 流量类别数 | 取决于数据集 |
learning_rate | adv_fine_tuning_cls.py | 94-95 | 学习率 | 2e-5 |
seq_length | adv_fine_tuning_cls.py | 92-93 | 输入序列长度 | 256 |
| 策略 | 说明 |
|---|
fun1 | 单段,argmin 选择 |
fun2 | 双段,两者均使用 argmax |
fun3 | 双段,固定 50/50 分割,Pad1 argmin + Pad2 argmax |
fun4 | 双段,随机分割,Pad1 argmin + Pad2 argmax |
fun5(默认) | 双段带随机虚拟头,Pad1 argmin + Pad2 argmax |
fun6 | 双段带虚拟头,NSP 引导策略 |
random | 随机基线 |
random_dummy_head | 随机替换头基线 |
random_pad | 随机填充基线 |