#docx #crypto #xlsx #openxml #powerpoint

office-crypto

纯Rust库,用于解密受密码保护的MS Office文件

1个不稳定版本

0.1.0 2023年1月18日

#2117解析器实现

Download history 98/week @ 2024-03-24 61/week @ 2024-03-31 35/week @ 2024-04-07 134/week @ 2024-04-14 136/week @ 2024-04-21 7/week @ 2024-04-28 23/week @ 2024-05-05 93/week @ 2024-05-12 122/week @ 2024-05-19 99/week @ 2024-05-26 139/week @ 2024-06-02 88/week @ 2024-06-09 103/week @ 2024-06-16 52/week @ 2024-06-23 46/week @ 2024-06-30 65/week @ 2024-07-07

271 每月下载次数

MIT 许可证

51KB
995

office-crypto

crates.io docs

纯Rust库,用于解密受密码保护的MS Office文件。

https://docs.rs/office-crypto

示例

此包公开了两个函数:decrypt_from_filedecrypt_from_bytes,它们确实做了它们所说的。然后,结果字节可以被任何MS Office解析器解释,例如 docxcalamine

use docx::DocxFile;
use office_crypto::decrypt_from_file;
use std::io::Cursor;

let decrypted: Vec<u8> = decrypt_from_file("protected.docx", "Password1234_").unwrap();

let docx = DocxFile::from_reader(Cursor::new(decrypted)).unwrap();
let docx = docx.parse().unwrap();

// Now we can access the docx content

格式

  • ECMA-376 (敏捷加密/标准加密)
    • MS-DOCX (OOXML) (Word 2007及以后)
    • MS-XLSX (OOXML) (Excel 2007及以后)
    • MS-PPTX (OOXML) (PowerPoint 2007及以后)
  • Office二进制文档RC4 CryptoAPI
    • MS-DOC (Word 2002, 2003, 2004)
    • MS-XLS (Excel 2002, 2003, 2004)
    • MS-PPT (PowerPoint 2002, 2003, 2004)
  • ECMA-376 (可扩展加密)

尚未实现非SHA512哈希函数。这仅影响敏捷加密文件,但到目前为止,我还没有找到不使用SHA512的。

性能

在M1 Pro上测量

running 3 tests
test bench_agile_sha512       ... bench:  27,106,487 ns/iter (+/- 505,175)
test bench_agile_sha512_large ... bench:  71,372,716 ns/iter (+/- 3,915,458)
test bench_standard           ... bench:   6,379,766 ns/iter (+/- 100,688)

测试文件大小

  • bench_agile_sha512 => 25 KB
  • bench_agile_sha512_large => 7.1 MB
  • bench_standard => 7 KB

请注意,Word的最新版本将创建一个敏捷加密文档。

致谢

此包本质上是从 msoffcryptoolefile 中移植了OOXML特定的功能。

依赖关系

~4.5MB
~90K SLoC