Skip to content

Office Permission Gates โ€” Visual Map

Strength Legend

Badge Level Meaning
๐Ÿ”ด Real Encryption Content is ciphertext โ€” must recover the password or key to read anything
๐ŸŸก Verifier Only Content is plaintext โ€” the gate stores a hash/verifier that can be stripped by editing the file
๐ŸŸข Cleartext / Decode Password is stored in the file (readable or trivially reversible)
โšช PKI / Not Password Protected by certificate, external service, or keyless obfuscation โ€” no password to guess

Product ร— Gate Matrix

Product Open / Encrypt Modify / Write Sheet / Section Protect Workbook / Structure Protect VBA Lock Digital Signature IRM / RMS
Word .doc ๐Ÿ”ด๐ŸŸข ๐ŸŸข โ€” โ€” ๐ŸŸก โšช โšช
Word .docx ๐Ÿ”ด ๐ŸŸก โ€” โ€” ๐ŸŸก โšช โšช
Excel .xls ๐Ÿ”ด๐ŸŸข ๐ŸŸก ๐ŸŸก ๐ŸŸก ๐ŸŸก โšช โ€”
Excel .xlsx/.xlsb ๐Ÿ”ด ๐ŸŸก ๐ŸŸก ๐ŸŸก ๐ŸŸก โšช โ€”
PowerPoint .ppt ๐Ÿ”ด ๐ŸŸข โ€” โ€” ๐ŸŸก โšช โ€”
PowerPoint .pptx ๐Ÿ”ด ๐ŸŸก โ€” โ€” ๐ŸŸก โšช โ€”
OneNote .one ๐Ÿ”ด โ€” โ€” โ€” โ€” โ€” โ€”
Outlook .pst ๐ŸŸข โ€” โ€” โ€” โ€” โ€” โ€”
Access .mdb ๐ŸŸข โ€” โ€” โ€” ๐ŸŸก โ€” โ€”
Access .accdb ๐Ÿ”ด โ€” โ€” โ€” ๐ŸŸก โ€” โ€”
OpenDocument .odt/.ods/.odp ๐Ÿ”ด โ€” ๐ŸŸก โ€” โ€” โ€” โ€”
Visio .vsd ๐Ÿ”ด โ€” โ€” โ€” ๐ŸŸก โšช โ€”
Visio .vsdx ๐Ÿ”ด โ€” โ€” โ€” ๐ŸŸก โšช โ€”
Project .mpp ๐ŸŸขโ€  ๐ŸŸขโ€  โ€” โ€” ๐ŸŸก โ€” โ€”
Publisher .pub โ€”โ€  โ€” โ€” โ€” ๐ŸŸก โ€” โ€”
Money .mny ๐Ÿ”ดโ€  โ€” โ€” โ€” โ€” โ€” โ€”
Access .mdw ๐ŸŸขโ€  โ€” โ€” โ€” โ€” โ€” โ€”
InfoPath .xsn โ€” โ€” โ€” โ€” โ€” โšช โ€”
  • ๐Ÿ”ด๐ŸŸข on .doc/.xls = XOR obfuscation (๐ŸŸข reversible) coexists with RC4 encryption (๐Ÿ”ด real) โ€” the scheme depends on the file's encryption flags
  • .xls Modify is ๐ŸŸก (16-bit verifier), not ๐ŸŸข โ€” unlike Word/PowerPoint, Excel does not store the modify password in cleartext
  • Outlook .pst Open is ๐ŸŸข because the "password" is a CRC-32 advisory gate that encrypts nothing
  • Access .mdb Open is ๐ŸŸข because the password is XOR-masked with a fixed/date key (instant decode)
  • โ€  = OUT-OF-CORPUS โ€” no [MS-*] spec documents the protection mechanism; details from community RE only
  • Visio open encryption uses the same [MS-OFFCRYPTO] algorithms as Word/Excel/PPT (agile for .vsdx, RC4 CryptoAPI for .vsd)
  • Visio Lock* shape cells are UI-level flags, not cryptographic gates โ€” no password involved
  • InfoPath has NO file-level encryption โ€” only a designMode="protected" UI flag and optional digital signatures

Algorithm ร— Product Matrix

Which algorithms are used by which products. โœ“ = used, โ€” = not applicable.

๐Ÿ”ด Real Encryption

Algorithm Word .doc Word .docx Excel .xls Excel .xlsx/.xlsb PPT .ppt PPT .pptx OneNote .one Outlook .pst Access .mdb Access .accdb ODF
ECMA-376 Agile โ€” โœ“ โ€” โœ“ โ€” โœ“ โœ“ โ€” โ€” โœ“ โ€”
ECMA-376 Standard โ€” โœ“ โ€” โœ“ โ€” โœ“ โœ“ โ€” โ€” โ€” โ€”
RC4 CryptoAPI + SHA-1 โœ“ โ€” โœ“ โ€” โœ“ โ€” โœ“ โ€” โ€” โ€” โ€”
RC4 + MD5 Legacy โœ“ โ€” โœ“ โ€” โ€” โ€” โ€” โ€” โ€” โ€” โ€”
XOR Obfuscation โœ“ โ€” โœ“ โ€” โ€” โ€” โ€” โ€” โ€” โ€” โ€”
ODF Encryption (PBKDF2 / Argon2id) โ€” โ€” โ€” โ€” โ€” โ€” โ€” โ€” โ€” โ€” โœ“

๐ŸŸก Protection Verifiers

Algorithm Word .doc Word .docx Excel .xls Excel .xlsx/.xlsb PPT .ppt PPT .pptx OneNote .one Outlook .pst Access .mdb Access .accdb ODF
ISO Protection Hash โ€” โœ“ โ€” โœ“ โ€” โœ“ โ€” โ€” โ€” โ€” โ€”
Word 2007 Legacy KDF โ€” โœ“ โ€” โ€” โ€” โ€” โ€” โ€” โ€” โ€” โ€”
VBA Project Password โœ“ โœ“ โœ“ โœ“ โœ“ โœ“ โ€” โ€” โœ“ โœ“ โ€”
16-bit Verifier (Method 1) โœ“ โ€” โœ“ โ€” โ€” โ€” โ€” โ€” โ€” โ€” โ€”

๐ŸŸข โšช Non-Cryptographic

Algorithm Word .doc Word .docx Excel .xls Excel .xlsx/.xlsb PPT .ppt PPT .pptx OneNote .one Outlook .pst Access .mdb Access .accdb ODF
๐ŸŸข Cleartext Passwords โœ“ โ€” โ€” โ€” โœ“ โ€” โ€” โ€” โ€” โ€” โ€”
๐ŸŸข PST CRC-32 โ€” โ€” โ€” โ€” โ€” โ€” โ€” โœ“ โ€” โ€” โ€”
๐ŸŸข Jet XOR (fixed/date key) โ€” โ€” โ€” โ€” โ€” โ€” โ€” โ€” โœ“ โ€” โ€”
๐ŸŸข ULS 3DES (fixed key) โ€” โ€” โ€” โ€” โ€” โ€” โ€” โ€” โ€” โ€” โ€”
๐Ÿ”ด MSISAM (MD5/SHA-1 + RC4) โ€” โ€” โ€” โ€” โ€” โ€” โ€” โ€” โ€” โ€” โ€”
โšช PST Body Cipher (keyless) โ€” โ€” โ€” โ€” โ€” โ€” โ€” โœ“ โ€” โ€” โ€”
โšช IRM / RMS (certificate) โœ“ โœ“ โœ“ โœ“ โ€” โ€” โ€” โ€” โ€” โ€” โ€”
โšช Digital Signatures (PKI) โœ“ โœ“ โœ“ โœ“ โœ“ โœ“ โ€” โ€” โ€” โ€” โ€”

File Detection Decision Tree

flowchart TD
  START([Open File]) --> EXT{Extension?}

  EXT -->|.doc .xls .ppt| OLE[Binary OLE/CFB]
  EXT -->|.docx .xlsx .pptx<br/>.docm .xlsm .pptm| ZIP_CHK{Is it a ZIP<br/>on disk?}
  EXT -->|.one .onetoc2| ONENOTE[OneNote Revision Store]
  EXT -->|.pst .ost| PST_CHK[PST NDB Container]
  EXT -->|.mdb| JET_CHK[Jet Header Page 0]
  EXT -->|.accdb| ACE_CHK[ACE Header Page 0]
  EXT -->|.odt .ods .odp| ODF_CHK[ODF-ZIP]

  %% Binary OLE path
  OLE --> BIN_APP{Which app?}
  BIN_APP -->|Word .doc| DOC_FLAGS{"FibBase flags<br/>fEncrypted? fObfuscated?"}
  BIN_APP -->|Excel .xls| XLS_FLAGS{"FilePass record<br/>wEncryptionType?"}
  BIN_APP -->|PPT .ppt| PPT_FLAGS{"CryptSession10<br/>Container present?"}

  DOC_FLAGS -->|"fEnc=1, fObs=1"| XOR_W[๐ŸŸข XOR Obfuscation<br/>Method 2]
  DOC_FLAGS -->|"fEnc=1, fObs=0"| DOC_VER{"EncryptionVersionInfo<br/>vMajor / vMinor?"}
  DOC_FLAGS -->|"fEnc=0"| DOC_NONE["No open encryption<br/>โ†’ check modify / protect gates"]

  DOC_VER -->|"1 / 1"| RC4MD5[๐Ÿ”ด RC4 + MD5<br/>40-bit legacy]
  DOC_VER -->|"2-4 / 2"| RC4SHA[๐Ÿ”ด RC4 CryptoAPI<br/>SHA-1]

  XLS_FLAGS -->|"0x0000"| XOR_X[๐ŸŸข XOR Obfuscation<br/>Method 1]
  XLS_FLAGS -->|"0x0001"| XLS_VER{"vMajor / vMinor?"}
  XLS_FLAGS -->|"No FilePass"| XLS_NONE["No open encryption<br/>โ†’ check VelvetSweatshop<br/>โ†’ check sheet/workbook protection"]

  XLS_VER -->|"1 / 1"| RC4MD5
  XLS_VER -->|"2-4 / 2"| RC4SHA

  PPT_FLAGS -->|Yes| RC4SHA
  PPT_FLAGS -->|No| PPT_NONE["No open encryption<br/>โ†’ check modify password"]

  %% OOXML path
  ZIP_CHK -->|"Yes (PK header)"| OOXML_PLAIN["OOXML plaintext ZIP<br/>โ†’ check protection elements<br/>in settings.xml / workbook.xml<br/>/ presentation.xml"]
  ZIP_CHK -->|"No (OLE header)"| OOXML_ENC["Encrypted OOXML<br/>โ†’ read \\EncryptionInfo stream"]

  OOXML_ENC --> ENC_MINOR{"vMinor?"}
  ENC_MINOR -->|"0x0002"| STD_ENC[๐Ÿ”ด ECMA-376 Standard<br/>AES + SHA-1 ร— 50000]
  ENC_MINOR -->|"0x0004"| AGILE_ENC[๐Ÿ”ด ECMA-376 Agile<br/>XML-driven params]
  ENC_MINOR -->|"0x0003"| EXT_ENC[โšช Extensible / IRM<br/>Not password-based]

  %% OneNote path
  ONENOTE --> ONE_CHK{"FileNodeID 0x07C<br/>present?"}
  ONE_CHK -->|Yes| ONE_BLOB["Read encryption blob<br/>โ†’ detect scheme from<br/>EncryptionVersionInfo"]
  ONE_CHK -->|No| ONE_NONE[No encryption]
  ONE_BLOB --> ENC_MINOR

  %% PST path
  PST_CHK --> PST_PW{"PidTagPstPassword<br/>0x67FF โ‰  0?"}
  PST_PW -->|Yes| PST_CRC[๐ŸŸข CRC-32 advisory<br/>password]
  PST_PW -->|No| PST_NP[No password]
  PST_CHK --> PST_BODY{"bCryptMethod?"}
  PST_BODY -->|"0x01"| PERMUTE[โšช Permutative<br/>Keyless decode]
  PST_BODY -->|"0x02"| CYCLIC[โšช Cyclic<br/>BID-keyed decode]
  PST_BODY -->|"0x00"| NONE_BODY[No body cipher]
  PST_BODY -->|"0x10"| WIP[โšช WIP/EDP<br/>OS-held key]

  %% Jet / ACE path
  JET_CHK --> JET_VER{"Engine version?"}
  JET_VER -->|Jet 3| JET3[๐ŸŸข Fixed-key XOR]
  JET_VER -->|Jet 4| JET4[๐ŸŸข Date-key XOR]

  ACE_CHK --> ACE_VER{"ACE version?"}
  ACE_VER -->|2007| ACE07[๐Ÿ”ด RC4 + hash]
  ACE_VER -->|"2010+"| ACE10[๐Ÿ”ด Agile-style<br/>SHA-512 + AES-256]

  %% MDW path
  EXT -->|.mdw .mda| MDW_CHK["Jet System DB signature"]
  MDW_CHK --> ULS[๐ŸŸข ULS 3DES decode<br/>fixed key]

  %% Money / MSISAM path
  EXT -->|.mny| MNY_CHK["MSISAM Database signature"]
  MNY_CHK --> MSISAM_FLAGS{"Flag 0x06\nat 0x298?"}
  MSISAM_FLAGS -->|Yes| MSISAM[๐Ÿ”ด MSISAM encryption<br/>MD5/SHA-1 + RC4]
  MSISAM_FLAGS -->|No| MNY_NONE[No encryption]

  %% ODF path
  ODF_CHK --> ODF_MAN{"manifest.xml<br/>encryption-data?"}
  ODF_MAN -->|"Blowfish CFB"| ODF11[๐Ÿ”ด ODF 1.1<br/>PBKDF2 1024 iters]
  ODF_MAN -->|"AES-256-CBC"| ODF12[๐Ÿ”ด ODF 1.2<br/>PBKDF2 100K iters]
  ODF_MAN -->|"AES-256-GCM"| ODF13[๐Ÿ”ด ODF 1.3<br/>Argon2id]
  ODF_MAN -->|No| ODF_PLAIN["No encryption<br/>โ†’ check table:protected<br/>/ text:protected flags"]

Format Docs (per-product gate reference)

Product Extensions Doc
Word .doc .docx .docm .dotx .dotm formats/word.md
Excel .xls .xlsx .xlsm .xlsb .xltx formats/excel.md
PowerPoint .ppt .pptx .pptm .potx .ppsx formats/powerpoint.md
OneNote .one .onetoc2 formats/onenote.md
Outlook .pst .ost formats/outlook.md
Access .mdb .accdb .mdw formats/access.md
Money .mny (no format doc โ€” see MSISAM algorithm)
OpenDocument .odt .ods .odp .odg .odf .odb formats/opendocument.md

Algorithm Docs โ€” ๐Ÿ”ด Password-Derived (Crackable)

Algorithm Primary Spec Doc
ECMA-376 Agile [MS-OFFCRYPTO] ยง2.3.4.10โ€“15 algorithms/password/ecma376-agile.md
ECMA-376 Standard [MS-OFFCRYPTO] ยง2.3.4.5โ€“9 algorithms/password/ecma376-standard.md
RC4 CryptoAPI + SHA-1 [MS-OFFCRYPTO] ยง2.3.5 algorithms/password/rc4-cryptoapi-sha1.md
RC4 MD5 Legacy [MS-OFFCRYPTO] ยง2.3.6 algorithms/password/rc4-md5-legacy.md
XOR Obfuscation [MS-OFFCRYPTO] ยง2.3.7 algorithms/password/xor-obfuscation.md
ISO Protection Hash [MS-OFFCRYPTO] ยง2.4.2.4 algorithms/password/iso-protection-hash.md
Word 2007 documentProtection [MS-OE376] ยง2.1.410 algorithms/password/word2007-documentprotection.md
ODF Encryption OASIS ODF Part 3 algorithms/password/odf-encryption.md
VBA Project Password [MS-OVBA] ยง2.4.3โ€“4 algorithms/password/vba-project-password.md
PST CRC-32 [MS-PST] ยง5.3 algorithms/password/pst-crc32.md

Algorithm Docs โ€” โšช Non-Password (Not Crackable)

Algorithm Primary Spec Doc
IRM / RMS / Extensible [MS-OFFCRYPTO] ยง2.2 algorithms/non-password/irm-rms-encryption.md
Digital Signatures [MS-OFFCRYPTO] ยง2.5 algorithms/non-password/digital-signatures.md
PST Body Cipher [MS-PST] ยง5.1โ€“2 algorithms/non-password/pst-body-cipher.md
Access Jet Obfuscation OUT-OF-CORPUS algorithms/non-password/access-jet-obfuscation.md
MSISAM Page Encryption (Money) OUT-OF-CORPUS algorithms/non-password/msisam-encryption.md
ULS Workgroup Security (MDW) OUT-OF-CORPUS algorithms/non-password/uls-workgroup-security.md

Landscape Docs

Doc Purpose
landscape/spec-corpus.md 424-spec corpus triage โ€” which specs matter, which don't
landscape/prior-art.md GitHub + web tools sweep โ€” what already exists