Dead-simple password-based file encryption for the command line and Python (scrypt + Fernet).
Project description
Description
pydlock is a dead-simple tool for password-encrypting and decrypting files. Lock a file with one command, unlock it with another — that is the whole product. It can be used from the command line or imported as a Python package.
As of 2.0 your password is protected with a salted, memory-hard scrypt key derivation, files of any kind (including binaries and Windows executables) round-trip losslessly, and writes are crash-safe.
Problems this solves
Reach for pydlock if you are trying to:
Password-encrypt a file from the command line — one command to lock, one to unlock, nothing else to configure.
Encrypt and decrypt a file in Python with a two-function API (pydlock.lock / pydlock.unlock) instead of wiring up a crypto library yourself.
Protect a file with a strong password-derived key without designing your own scheme — pydlock uses salted, memory-hard scrypt and authenticated Fernet (AES-128-CBC + HMAC-SHA256), and adds no custom cryptography.
Encrypt binaries safely — files of any kind round-trip byte-for-byte, and writes are crash-safe (atomic replace).
Installation
pydlock is available on the Python Package Index (PyPI) at
https://pypi.org/project/pydlock. Install it with pip:
pip install pydlock
Quick start
Encrypt a file in place:
pydlock lock secret.txt
Decrypt it again:
pydlock unlock secret.txt
That is the entire everyday workflow. You are prompted for a password (twice when locking); nothing else is required.
Usage
From the command line
The pydlock console command (installed with the package) and python -m pydlock are equivalent:
user@computer:~$ pydlock -h
usage: pydlock [-h] [--encoding ENCODING] {lock,unlock,encrypt,decrypt} file
positional arguments:
{lock,unlock,encrypt,decrypt}
file
options:
-h, --help show this help message and exit
--encoding ENCODING
Supported operations:
lock — encrypt a file in place.
unlock — decrypt a file in place.
encrypt — alias for lock.
decrypt — alias for unlock.
A short example:
user@computer:~$ cat secret.txt
Shh! It's a secret!
user@computer:~$ pydlock lock secret.txt
Enter password:
Re-enter password:
user@computer:~$ pydlock unlock secret.txt
Enter password:
user@computer:~$ cat secret.txt
Shh! It's a secret!
An entered-but-wrong password fails cleanly — pydlock prints Could not decrypt (wrong password or corrupt file). and leaves the encrypted file untouched.
In other Python modules
import pydlock
filename = "secret.txt"
with open(filename, "wb") as file:
file.write(b"Shh! It's a secret!")
pydlock.lock(filename) # prompts for a password, then encrypts in place
pydlock.unlock(filename) # prompts for the password, then decrypts
What’s new in 2.0
Version 2.0 is a breaking change to the on-disk format. Files are now written as a small self-identifying envelope — a PYDLOCK magic marker, a JSON header carrying the key-derivation parameters and a per-file random salt, and then the encrypted token — instead of a bare token.
Highlights:
Stronger password protection. The key is derived with a salted, memory-hard scrypt KDF (see below), replacing the previous unsalted single-pass SHA-256 derivation.
Binary files are safe. Files are read and written as raw bytes, so binary files and Windows executables round-trip losslessly. Earlier versions corrupted them; that bug is fixed.
Crash-safe writes. Locking and unlocking write to a temporary file and atomically replace the original, so an interrupted operation can never leave a truncated or half-written file.
``encrypt`` / ``decrypt`` aliases for lock / unlock.
``python`` and ``run`` removed. The old decrypt-and-execute subcommands were a security footgun (arbitrary code execution) and outside the scope of a file-encryption tool; they have been removed.
Migrating from v1
You do not need to do anything special. Files locked with pydlock 1.x are detected automatically and decrypted transparently:
user@computer:~$ pydlock unlock old_v1_file.txt
Enter password:
Re-locking an unlocked file rewrites it in the new v2 format, so a file is upgraded simply by unlocking and locking it again.
If you ever need the old behavior explicitly, the final 1.x release remains installable as a documented fallback:
pip install 'pydlock<2'
How your password is protected
When you lock a file, pydlock generates a fresh 16-byte random salt and derives the encryption key from your password with scrypt (parameters n = 32768, r = 8, p = 1), a memory-hard function designed to make brute-force and hardware-accelerated guessing expensive. The salt and parameters are stored in the file’s header so the key can be re-derived when you unlock it — a different salt each time means locking the same file twice never produces the same ciphertext.
The file itself is encrypted with Fernet (AES-128 in CBC mode with an HMAC-SHA256 authentication tag) from the well-vetted cryptography library. Because the token is authenticated, a wrong password or any tampering with the file is detected and rejected — pydlock never returns silently-wrong plaintext. pydlock adds no custom cryptography of its own.
Copyright and License
Copyright
Pydlock - A Python file encryption tool.
Copyright (c) 2020 of Erick Edward Shepherd, all rights reserved.
License
Released under the MIT License. See the LICENSE file for the full text.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pydlock-2.0.4.tar.gz.
File metadata
- Download URL: pydlock-2.0.4.tar.gz
- Upload date:
- Size: 52.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
af0f0d7c979dd2551b6edc185c4fc7b758af53ea17398546cd97d266377fb9b3
|
|
| MD5 |
fd1881daa5e61d8ca795421f9fd1f333
|
|
| BLAKE2b-256 |
8d91838bfc3ff43109534ee05b445b4daac1225f85674dc4d972f1ebb54d19b7
|
Provenance
The following attestation bundles were made for pydlock-2.0.4.tar.gz:
Publisher:
publish.yml on ErickShepherd/pydlock
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pydlock-2.0.4.tar.gz -
Subject digest:
af0f0d7c979dd2551b6edc185c4fc7b758af53ea17398546cd97d266377fb9b3 - Sigstore transparency entry: 2135620761
- Sigstore integration time:
-
Permalink:
ErickShepherd/pydlock@c5aaa0c89add54a35ba6c0f3a60503d439d21d1e -
Branch / Tag:
refs/tags/v2.0.4 - Owner: https://github.com/ErickShepherd
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@c5aaa0c89add54a35ba6c0f3a60503d439d21d1e -
Trigger Event:
release
-
Statement type:
File details
Details for the file pydlock-2.0.4-py3-none-any.whl.
File metadata
- Download URL: pydlock-2.0.4-py3-none-any.whl
- Upload date:
- Size: 13.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0873fab9e52d01d65b43c98196936dbb4195108edc25ec4ac44f92be0248257a
|
|
| MD5 |
06dfe1141103fd74c131e30634eb05b7
|
|
| BLAKE2b-256 |
6a5c95e36132d4fae2156fc904c5e0a0626a334da8ae45212911fc134f411139
|
Provenance
The following attestation bundles were made for pydlock-2.0.4-py3-none-any.whl:
Publisher:
publish.yml on ErickShepherd/pydlock
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pydlock-2.0.4-py3-none-any.whl -
Subject digest:
0873fab9e52d01d65b43c98196936dbb4195108edc25ec4ac44f92be0248257a - Sigstore transparency entry: 2135620823
- Sigstore integration time:
-
Permalink:
ErickShepherd/pydlock@c5aaa0c89add54a35ba6c0f3a60503d439d21d1e -
Branch / Tag:
refs/tags/v2.0.4 - Owner: https://github.com/ErickShepherd
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@c5aaa0c89add54a35ba6c0f3a60503d439d21d1e -
Trigger Event:
release
-
Statement type: