Skip to main content

A library for decrypting LTspice® and PSpice® encrypted files

Project description

SpiceCrypt

A Python library and CLI tool for decrypting encrypted SPICE model files. SpiceCrypt supports LTspice® and PSpice® encryption formats with automatic format detection, enabling engineers to use lawfully obtained models in any simulator.

Features

  • LTspice text-based format — Custom DES variant used in encrypted .CIR, .SUB, .LIB, .ASY, and other files
  • LTspice Binary File format — Two-layer XOR stream cipher identified by the <Binary File> signature
  • PSpice Modes 0–5 — Custom DES (modes 0–2) and AES-256 ECB (modes 3–5) with $CDNENCSTART/$CDNENCFINISH delimited blocks
  • PSpice Mode 4 key recovery — Brute-force recovery of the user-supplied encryption key via a hardware-accelerated Rust extension (AES-NI / ARM Crypto)
  • Automatic format detection — All formats are detected and handled transparently
  • Streaming API — Memory-efficient processing for large files
  • No runtime dependencies — Pure Python with an optional compiled Rust extension for key recovery

Installation

Install from PyPI:

pip install spice-crypt

Or with uv:

uv tool install spice-crypt

Or add as a dependency to an existing project:

uv add spice-crypt

Updating

pip install --upgrade spice-crypt    # pip
uv tool upgrade spice-crypt          # uv tool
uv lock --upgrade-package spice-crypt # uv project dependency

Requirements

  • Python 3.10 or higher
  • No runtime dependencies for decryption
  • Rust toolchain required only to build the optional extension for Mode 4 key recovery

Command Line Usage

SpiceCrypt provides the spice-crypt command. All encryption formats are auto-detected.

# Run directly without installing
uvx spice-crypt path/to/encrypted_file.lib

# Decrypt to stdout
spice-crypt path/to/encrypted_file.lib

# Decrypt to a file
spice-crypt -o output.lib path/to/encrypted_file.lib

# Force overwrite if output file exists
spice-crypt -f -o output.lib path/to/encrypted_file.lib

# Verbose output (shows verification values)
spice-crypt --verbose path/to/encrypted_file.lib

# Suppress all error messages
spice-crypt --quiet -o output.lib path/to/encrypted_file.lib

# Process raw hex data (bypass LTspice format detection)
spice-crypt --raw path/to/hex_file.txt

# Show version
spice-crypt --version

PSpice Mode 4

Mode 4 is the only PSpice mode that uses a user-supplied encryption key. SpiceCrypt can recover this key via brute force or decrypt directly if the key is known.

# Brute-force recover the user key (~seconds on modern hardware)
spice-crypt --recover-key path/to/encrypted_file.lib

# Decrypt with a known user key
spice-crypt --user-key KEY path/to/encrypted_file.lib

Key recovery exploits a bug in PSpice's key derivation that reduces the effective keyspace from 2^256 to 2^32. See SPECIFICATIONS/pspice-attack-summary.md for details.

Python API

decrypt_stream(input_file, output_file=None, is_ltspice_file=None, user_key=None)

Stream-decrypt from a file path or file object. Supports all LTspice and PSpice formats with automatic detection.

from spice_crypt import decrypt_stream

# Decrypt file to file
_, verification = decrypt_stream("encrypted.lib", "decrypted.lib")

# Decrypt file to string
plaintext, verification = decrypt_stream("encrypted.lib")

# Use file objects
with open("encrypted.lib") as infile:
    plaintext, verification = decrypt_stream(infile)

# PSpice Mode 4 with a user key
plaintext, _ = decrypt_stream("encrypted.lib", user_key=b"mykey")

Parameters:

  • input_file — File path (str/PathLike) or file object (text or binary mode).
  • output_file (optional) — File path (str) or binary-mode file object. If None, returns decrypted content as a string.
  • is_ltspice_file (bool, optional) — Whether the data is in LTspice format. If True, skip PSpice detection; if False, treat as raw hex. Auto-detected if None.
  • user_key (bytes, optional) — User key bytes for PSpice Mode 4 decryption.

Returns: (content, (v1, v2))content is the decrypted string if no output file was given, otherwise None. (v1, v2) are format-specific verification values: CRC-based checksums for LTspice text format, CRC-32 and rotate-left hash for Binary File format, or (0, 0) for PSpice format.

decrypt(data, is_ltspice_file=None)

Decrypt an in-memory string of encrypted data. Supports LTspice text-based format, raw hex, and PSpice text-based formats (but not Binary File format or PSpice Mode 4 with a user key).

from spice_crypt import decrypt

with open("encrypted.lib") as f:
    data = f.read()

plaintext, (v1, v2) = decrypt(data)

Parameters:

  • data (str) — Encrypted data as a string (LTspice format, PSpice format, or raw hex).
  • is_ltspice_file (bool, optional) — Whether the data is in LTspice format. Auto-detected if None.

Returns: (plaintext, (v1, v2)) — The decrypted text and a tuple of format-specific verification values (see decrypt_stream above).

Lower-level APIs

The following classes are exported for direct use:

  • LTspiceFileParser — Text-based DES format parser
  • BinaryFileParser — Binary File format parser
  • PSpiceFileParser — PSpice format parser (modes 0–5)
  • CryptoState — LTspice DES key derivation and per-block decryption
  • LTspiceDES — LTspice custom DES variant
  • PSpiceDES — PSpice custom DES variant

Supported Formats

LTspice Text-Based DES

Encrypted files contain hex-encoded ciphertext delimited by * Begin: and * End <v1> <v2> comment markers. The first 1024 bytes form a crypto table used for key derivation and as an XOR keystream source. All subsequent blocks are decrypted with a custom DES variant that uses non-standard S-boxes and permutation tables, preceded by an XOR stream cipher layer keyed from the same table.

LTspice Binary File

Binary files are identified by a 20-byte signature (\r\n<Binary File>\r\n\r\n\x1a). Decrypted with a two-layer XOR stream cipher using two 32-bit keys from the file header and a 2593-byte substitution table with prime-based stepping.

PSpice Modes 0–5

Encrypted regions are delimited by $CDNENCSTART / $CDNENCFINISH markers within otherwise plaintext files. Six encryption modes exist:

Mode Cipher Key Source
0 Custom DES Hardcoded
1–2 Custom DES Hardcoded + version
3 AES-256 ECB Hardcoded + version
4 AES-256 ECB Hardcoded XOR user key + version
5 AES-256 ECB Hardcoded + version

Modes 0–3 and 5 use key material derived entirely from constants in the PSpice binary. Mode 4 incorporates a user-supplied key, but a bug in the key derivation passes only the short key to the AES engine instead of the extended key, leaving just 4 bytes unknown and reducing the effective keyspace to 2^32. This makes the key recoverable by brute force.

Specifications

Detailed technical documentation of the encryption schemes:

Purpose and Legal Basis

Many third-party component vendors distribute SPICE models exclusively as LTspice- or PSpice-encrypted files. This encryption locks the models to a single simulator, preventing their use in open-source and alternative tools such as NGSpice, Xyce, PySpice, and others. SpiceCrypt exists to restore interoperability by allowing engineers to use lawfully obtained models in the simulator of their choice.

This type of reverse engineering for interoperability is specifically permitted by law:

  • United States: 17 U.S.C. § 1201(f) permits circumvention of technological protection measures for the sole purpose of achieving interoperability between independently created programs. Section 1201(f)(2) explicitly allows distributing the tools developed for this purpose to others seeking interoperability. Additionally, § 1201(g) permits circumvention when conducted in good-faith encryption research — studying the flaws and vulnerabilities of encryption technologies — and allows dissemination of the research findings.
  • European Union: Article 6 of the Software Directive (2009/24/EC) permits decompilation and reverse engineering when it is indispensable to achieve interoperability with independently created programs. Article 6(3) provides that this right cannot be overridden by contract.

Disclaimer

The legal justifications above pertain to the underlying research, technical analysis, and release of SpiceCrypt itself. They are provided to demonstrate that this work was conducted in good faith and to outline its intended purpose. They should not be construed as legal advice.

Encrypted SPICE models are often distributed under license agreements or terms of service that end users may have accepted. It is the end user's responsibility to ensure that their use of SpiceCrypt does not violate any such agreements or any applicable laws in their jurisdiction.

SpiceCrypt is intended solely for enabling simulator interoperability with lawfully obtained models. Using it to violate intellectual property rights is immoral and is not an acceptable use of the tool.

Research Contributors

  • Joe T. Sylve, Ph.D. — Reverse engineering and documentation of the LTspice text-based DES encryption format and PSpice encryption modes.
  • Lucas Gerads — Reverse engineering and documentation of the LTspice Binary File encryption format.

Trademarks

LTspice® is a registered trademark of Analog Devices, Inc.
PSpice® is a registered trademark of Cadence Design Systems, Inc.

License

This project is licensed under the GNU Affero General Public License v3.0 or later.

Copyright (c) 2025-2026 Joe T. Sylve, Ph.D.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

spice_crypt-2.0.4.tar.gz (120.7 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

spice_crypt-2.0.4-cp310-abi3-win_arm64.whl (192.8 kB view details)

Uploaded CPython 3.10+Windows ARM64

spice_crypt-2.0.4-cp310-abi3-win_amd64.whl (197.5 kB view details)

Uploaded CPython 3.10+Windows x86-64

spice_crypt-2.0.4-cp310-abi3-musllinux_1_2_x86_64.whl (509.5 kB view details)

Uploaded CPython 3.10+musllinux: musl 1.2+ x86-64

spice_crypt-2.0.4-cp310-abi3-musllinux_1_2_aarch64.whl (464.6 kB view details)

Uploaded CPython 3.10+musllinux: musl 1.2+ ARM64

spice_crypt-2.0.4-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (296.1 kB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ x86-64

spice_crypt-2.0.4-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (287.2 kB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ ARM64

spice_crypt-2.0.4-cp310-abi3-macosx_11_0_arm64.whl (260.2 kB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

spice_crypt-2.0.4-cp310-abi3-macosx_10_12_x86_64.whl (271.8 kB view details)

Uploaded CPython 3.10+macOS 10.12+ x86-64

File details

Details for the file spice_crypt-2.0.4.tar.gz.

File metadata

  • Download URL: spice_crypt-2.0.4.tar.gz
  • Upload date:
  • Size: 120.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for spice_crypt-2.0.4.tar.gz
Algorithm Hash digest
SHA256 3b4ff032188f0145bd124fc64d4d0348b90ef6b5d100c4dfd2ae4721d6fd8c40
MD5 1d9b8c0c5f7371482a1cf96f4b7d7755
BLAKE2b-256 223c77cc6b4f0f5785a48e1b09c69cab358a5a275d1db7d2b7175aa8b381fece

See more details on using hashes here.

Provenance

The following attestation bundles were made for spice_crypt-2.0.4.tar.gz:

Publisher: publish.yml on jtsylve/spice-crypt

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file spice_crypt-2.0.4-cp310-abi3-win_arm64.whl.

File metadata

  • Download URL: spice_crypt-2.0.4-cp310-abi3-win_arm64.whl
  • Upload date:
  • Size: 192.8 kB
  • Tags: CPython 3.10+, Windows ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for spice_crypt-2.0.4-cp310-abi3-win_arm64.whl
Algorithm Hash digest
SHA256 2836e90291d518a2f97f9f967fb7b8bc11ba8c8266b20552cff2d23e75cc9c75
MD5 5358f23be68af7ed24fcb392fbbe1777
BLAKE2b-256 c888ffe9413344523963d647954e3ffd1b0a0d3bc79cd15fc169b70e2bf830c7

See more details on using hashes here.

Provenance

The following attestation bundles were made for spice_crypt-2.0.4-cp310-abi3-win_arm64.whl:

Publisher: publish.yml on jtsylve/spice-crypt

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file spice_crypt-2.0.4-cp310-abi3-win_amd64.whl.

File metadata

  • Download URL: spice_crypt-2.0.4-cp310-abi3-win_amd64.whl
  • Upload date:
  • Size: 197.5 kB
  • Tags: CPython 3.10+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for spice_crypt-2.0.4-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 7ac15500de74af66296e607eb4dac3657048582122cf4b5198ea926e55732222
MD5 cb2b7bf5d8e7f0f5386151aaad902a03
BLAKE2b-256 b83aaaf2acefa0c16a70536db4ec0fe3228bdb5c889e95ac8a879bed44660622

See more details on using hashes here.

Provenance

The following attestation bundles were made for spice_crypt-2.0.4-cp310-abi3-win_amd64.whl:

Publisher: publish.yml on jtsylve/spice-crypt

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file spice_crypt-2.0.4-cp310-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for spice_crypt-2.0.4-cp310-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 1b24c12b9ccc249a20073084892bcec82ed9c69da6c84f0c9d3b8c18a05d9b9a
MD5 43afecfd0631a6b80b4aea898a7d61a7
BLAKE2b-256 74a486d7a826cffb63eb87b5642e83bde1af4f59e189b9cd5b8ede35cefb141b

See more details on using hashes here.

Provenance

The following attestation bundles were made for spice_crypt-2.0.4-cp310-abi3-musllinux_1_2_x86_64.whl:

Publisher: publish.yml on jtsylve/spice-crypt

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file spice_crypt-2.0.4-cp310-abi3-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for spice_crypt-2.0.4-cp310-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 2affd7dd4ae0f5352a90828361e7a6368bb03915a4e71c0efa5553e6f9fc1691
MD5 8fe032fa40470fdf5887318757e39210
BLAKE2b-256 499ab962c05e441b65b80076d0e23992504e757af3e53a9bd5e9024436379a61

See more details on using hashes here.

Provenance

The following attestation bundles were made for spice_crypt-2.0.4-cp310-abi3-musllinux_1_2_aarch64.whl:

Publisher: publish.yml on jtsylve/spice-crypt

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file spice_crypt-2.0.4-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for spice_crypt-2.0.4-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 77453bf2827b0d0ccb0a39ef46698b3e015bf7fbfac103ee08777ded3ba53385
MD5 4d8f10a18f8f96e3ca1c4a32629eb576
BLAKE2b-256 cfbdb454b7fa0cfdf1e75bf11690628517601e0cf8a67f7d1ca7de59c4f23c68

See more details on using hashes here.

Provenance

The following attestation bundles were made for spice_crypt-2.0.4-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yml on jtsylve/spice-crypt

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file spice_crypt-2.0.4-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for spice_crypt-2.0.4-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 cbf06e8a33afb3285714e8380526031f08f8516bfd69100a03c75685b94579a3
MD5 8104197f2ef1df819790000e5b0262ff
BLAKE2b-256 ccf416a706dfa7591f236b892fd2e201606b2b7393b45334b19308faab4c7c64

See more details on using hashes here.

Provenance

The following attestation bundles were made for spice_crypt-2.0.4-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: publish.yml on jtsylve/spice-crypt

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file spice_crypt-2.0.4-cp310-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for spice_crypt-2.0.4-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ffbaa5d60a45480d6c31a648ac540010ba9b338d320b8cb0a7f6e454aeb3bc95
MD5 5fd477d1b2907b454eeb2d9da3cc60d5
BLAKE2b-256 fe487fb76d52209edf04f433e58c8dd9cb3a518ec9ed2b5755264d43877c1365

See more details on using hashes here.

Provenance

The following attestation bundles were made for spice_crypt-2.0.4-cp310-abi3-macosx_11_0_arm64.whl:

Publisher: publish.yml on jtsylve/spice-crypt

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file spice_crypt-2.0.4-cp310-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for spice_crypt-2.0.4-cp310-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 065a1193ebf957867c0550b7876d40c8ac77e9c87d09792d1eb8622189765ccd
MD5 2c403ea513039229c01cbf6e91a55e0d
BLAKE2b-256 9b5bcd25760525ad64db679ab73b8f5cfab8506eb0cf4924a1aeca5389006efb

See more details on using hashes here.

Provenance

The following attestation bundles were made for spice_crypt-2.0.4-cp310-abi3-macosx_10_12_x86_64.whl:

Publisher: publish.yml on jtsylve/spice-crypt

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page