2 个版本

0.1.1 2022年6月18日
0.1.0 2022年6月18日

#1836加密学

MIT 许可证

42KB
816

包含 (ZIP 文件, 1KB) arrow_up.zip

Enard

Crates.io MIT

Enard 是一种加密容器格式,旨在允许对存储在不同格式(例如 ZIP 文件)中的游戏资源进行即时解密。Enard 加密了“封装”的文件,并提供了实现 Rust 的 std::io::Readstd::io::Seek 特性的读取器,使用户可以将其视为文件。实际上这意味着将 zip 库包装在 EnardReader 上非常容易,并且可以正常工作。

以下是一个示例

let key = [0x42u8; 32];
let file = File::open("example.zip.enard")?;
let e_reader = EnardReader::new(BufReader::new(file), RuntimeCipherFactory, &key)?;
let archive = ZipArchive::new(e_reader)?;
for names in archive.file_names() {
    println!("{}", name);
}

创建 Enard 文件

Enard 文件可以使用库直接创建,也可以使用 CLI 创建。

详细信息

Enard 使用流加密来加密,以便在解密时能够跳转到文件的任何位置,从而允许读取器实现 std::io::Seek 并像文件一样操作。Enard 还使用 SHA2-256 消息认证码来验证文件是否被修改。

有关文件格式的更多详细信息,请参阅 format.md

常见问题解答 (F.A.Q.)

为什么默认加密算法是 ChaCha12 而不是 ChaCha20?

默认加密算法是 ChaCha12 而不是 ChaCha20,因为本库的目的是从磁盘加载加密的游戏资源,ChaCha12 是安全和性能的良好组合。Enard 并非旨在使游戏资源无法被盗,它只是起到了威慑作用。

如果有人更改了元数据大小或数据大小字段怎么办?

这些字段都是未加密的,并且不是 MAC 的部分,这意味着攻击者可以轻松更改它们。问题是这样做会改变进入 MAC 的数据,这意味着它将无法通过认证,解密将失败。

ZIP 文件已经有加密了,为什么不用它?

首先,你可能不想使用 ZIP 文件。其次,ZIP 文件加密相对较弱,不适用于整个文件,需要一次性解密整个文件,而且许多 ZIP 实现都不支持它。

为什么不一创自己的存档格式呢?

目前有许多合理且规范明确、经过良好测试的存档格式。Enard 并非试图重新发明轮子,而是给它加上一把自行车锁。

依赖项

~1–1.7MB
~36K SLoC