Skip to content

Decrypt your first .pca file

By the end of this tutorial you’ll have decrypted a .pca file, extracted the panel’s network address and AES-128 ControllerKey, and confirmed the key isn’t wrong by spot-checking the embedded customer-name field.

You don’t need a panel for this. The .pca file already contains everything.

  • A .pca file from PC Access. These come from the Account → Save As menu in PC Access 3, or you’ll find one in Documents/HAI/PC Access/ on any machine PC Access has been installed on.
  • Python 3.14 or newer.
  • 5 minutes.

If you don’t have a .pca file of your own and just want to see the mechanics, you can synthesize one with the mock panel — but the headline moment of this tutorial is seeing your actual panel’s hostname pop out of the bytes, so go find a real one if you can.

Terminal window
uvx --from omni-pca omni-pca version

This pulls the omni-pca package into a temporary venv and runs the version subcommand. If that prints omni-pca 2026.5.10 (or newer), you’re done with install.

If you’d rather install permanently:

Terminal window
uv tool install omni-pca
omni-pca version
Terminal window
uvx --from omni-pca omni-pca decode-pca '/path/to/Your House.pca' \
--field controller_key

You should see 32 hex characters and nothing else. Something like:

6ba7b4e9b4656de3cd7edd4c650cdb09

That’s your panel’s AES-128 session-derivation key. Hold onto it — it’s the credential the HA integration (and any other Omni-Link client) needs.

The same command takes other field names if you need them:

Terminal window
omni-pca decode-pca '/path/to/Your.pca' --field host # 192.168.1.x
omni-pca decode-pca '/path/to/Your.pca' --field port # 4369

The CLI defaults to redacting account fields (name, address, phone) so you don’t accidentally leak PII into a log. To sanity-check that the decryption worked rather than landed on noise, pass --include-pii:

Terminal window
omni-pca decode-pca '/path/to/Your.pca' --include-pii | head -10

You should see your real customer-info fields in plaintext. If those match what you set up in PC Access, the decryption is correct. If they look like random bytes, the file is corrupted or the wrong key was selected — file an issue with the byte length and a hexdump of the first 16 bytes.

The .pca file is not AES-encrypted, despite PC Access shipping AES code for the wire protocol. It’s a Borland-Pascal LCG keystream XORed byte-by-byte. The CLI tried two known cipher keys (KEY_PC01 and KEY_EXPORT), picked the one whose decrypted first bytes match the expected PCA03 magic header, then walked the resulting plaintext to find the Connection.NetworkAddress, Connection.NetworkPort, and Connection.ControllerKey fields.

The full byte-level format is on the file format reference page if you want to see what’s in there.