office-crypto
Pure Rust library to decrypt password-protected MS Office files.
Example
This crate exposes two functions: decrypt_from_file and decrypt_from_bytes, which do exactly what they say they do. The resulting bytes can then be interpreted by any MS Office parser like docx-rs or calamine.
use read_docx;
use decrypt_from_file;
let path = "protected.docx";
let decrypted = decrypt_from_file.unwrap;
let docx = read_docx.unwrap;
Formats
- ECMA-376 (Agile Encryption/Standard Encryption)
- MS-DOCX (OOXML) (Word 2007-Present)
- MS-XLSX (OOXML) (Excel 2007-Present)
- MS-PPTX (OOXML) (PowerPoint 2007-Present)
- [-] Office Binary Document RC4 CryptoAPI
- MS-DOC (Word 2002, 2003, 2004)
- MS-XLS (Excel 2002, 2003, 2004)
- MS-PPT (PowerPoint 2002, 2003, 2004)
- ECMA-376 (Extensible Encryption)
Non-SHA512 hash functions are not yet implemented. This only affects Agile encrypted files, but I have yet to find one that doesn't use SHA512.
Performance
Measured on an M4 Max:
test bench_agile_sha512 ... bench: 15,029,308 ns/iter (+/- 372,423)
test bench_agile_sha512_large ... bench: 45,220,041 ns/iter (+/- 3,078,352)
test bench_standard ... bench: 3,080,678 ns/iter (+/- 95,020)
test bench_doc97_rc4_cryptoapi ... bench: 42,690 ns/iter (+/- 1,393)
File sizes for tests:
bench_agile_sha512=> 25 KBbench_agile_sha512_large=> 7.1 MBbench_standard=> 7 KBbench_doc97_rc4_cryptoapi=> 23 KB
Note that the latest version of Word will create an Agile encrypted document.
Acknowledgements
This crate is essentially a port of the OOXML-specific features from msoffcrypto and olefile.