Zum Inhalt

Cryptomator-Tresorformat 8 (moderner Modus von Krywerk)

Zusammengefasst am 2026-10-12 aus der offiziellen Dokumentation und dem MIT-lizenzierten Quellcode (cryptolib/cryptofs). Grundlage für kw-format. Quellen am Ende.

Dateien im Tresor-Stammordner

  • vault.cryptomator – JWT, signiert mit HMAC (HS256; HS384/HS512 werden akzeptiert), Schlüssel = Verschlüsselungs-Masterkey ‖ MAC-Masterkey (64 Byte). Header: kid = "masterkeyfile:masterkey.cryptomator", typ = "JWT", alg = "HS256". Payload: format = 8, shorteningThreshold = 220, jti = zufällige UUID, cipherCombo = "SIV_GCM".
  • masterkey.cryptomator – JSON: version (999, veraltet), scryptSalt (Base64), scryptCostParam (32768), scryptBlockSize (8), primaryMasterKey und hmacMasterKey (je 32 Byte, mit AES Key Wrap RFC 3394 unter dem KEK verpackt), versionMac = HMAC-SHA256(MAC-Masterkey, version als uint32 Big-Endian). KEK = scrypt(Passwort UTF-8, Salt, N, r, p = 1, 32 Byte).
  • d/ – Datenordner.

Ordner

  • Ordner-ID: Stamm = "", sonst zufälliger ASCII-String ≤ 36 Zeichen (UUID).
  • dirIdHash = Base32(SHA-1(AES-SIV(encKey, macKey, UTF-8(dirId)))) (RFC 4648, 32 Zeichen).
  • Physischer Ordner: d/ + erste 2 Zeichen + / + restliche 30 Zeichen. Alle Ordner liegen flach.
  • Ein Ordner-Eintrag ist ein Ordner <name>.c9r mit der Datei dir.c9r, die die Ordner-ID im Klartext (UTF-8) enthält.
  • Optional dirid.c9r im physischen Ordner: die eigene Ordner-ID, verschlüsselt wie eine Datei (Wiederherstellungshilfe, keine Sicherheitsfunktion).

Namen

  • Klartextname → Unicode NFC → UTF-8 → AES-SIV (RFC 5297; Aufruf encrypt(encKey, macKey, …) = S2V/CMAC mit MAC-Key, CTR mit Enc-Key) mit Associated Data = UTF-8 der Eltern-Ordner-ID → Base64url mit Padding → Endung .c9r.
  • Ist der Name inkl. .c9r länger als 220 Zeichen: Ordner Base64url(SHA-1(UTF-8(langer Name))) + ".c9s" mit name.c9s (langer Name als UTF-8) und – bei Dateien – contents.c9r, bei Ordnern dir.c9r, bei Symlinks symlink.c9r.

Dateiinhalt

  • Header (68 Byte): Nonce (12) ‖ AES-256-GCM(Masterkey-Enc, Nonce, ohne AAD)(Payload 40 Byte) ‖ Tag (16). Payload = 8 Byte 0xFF (reserviert, früher Dateigröße) ‖ Inhaltsschlüssel (32 Byte, zufällig).
  • Inhalt in Blöcken zu 32 KiB Klartext; Block = Nonce (12, zufällig) ‖ AES-256-GCM(Inhaltsschlüssel) (Klartext) ‖ Tag (16), also bis 32 768 + 28 Byte. AAD = Blocknummer (uint64 Big-Endian) ‖ Header-Nonce. Nur der letzte Block darf kürzer sein. Leere Datei = nur Header.

Quellen

  • https://docs.cryptomator.org/en/latest/security/architecture/ (Vault-Konfiguration, Masterkey-Datei)
  • https://docs.cryptomator.org/security/vault/ (Header, Inhalt, Ordner, Namen, Kürzung, dirid.c9r)
  • cryptolib v2/FileNameCryptorImpl.java, FileContentCryptorImpl.java, FileHeaderCryptorImpl.java
  • cryptofs common/Constants.java, LongFileNameProvider.java, CryptoPathMapper.java, DirectoryIdLoader.java, DirectoryIdBackup.java