Skip to main content

A simple, secure file encryption tool using AES-256-GCM and Argon2id

Project description

GUN-101

A simple, secure file encryption tool using AES-256-GCM and Argon2id.

Overview

GUN-101 encrypts files with authenticated encryption, providing confidentiality and integrity. It supports two modes:

  1. Password-only: Encryption key derived from password alone
  2. Password + keyfile: Two-factor protection requiring both password and a separate keyfile

The design prioritizes correctness and transparency over complexity or marketing claims.

Cryptographic Primitives

  • Key Derivation: Argon2id (memory-hard, winner of the Password Hashing Competition 2015)
  • Encryption: AES-256-GCM (authenticated encryption with associated data, NIST SP 800-38D)
  • Salt: 32 bytes random per encryption
  • Nonce: 12 bytes random per encryption (GCM recommended size)
  • Key Length: 32 bytes (256 bits)

Security Properties

What GUN-101 does provide:

  • Confidentiality: Passive attackers cannot decrypt without the password (and keyfile, if used)
  • Integrity: Any tampering with the encrypted container is detected and rejected before returning plaintext
  • Brute-force resistance: Argon2id maximizes the cost of guessing passwords (memory-hard, GPU-resistant)
  • Two-factor protection: When a keyfile is used and stored separately, an attacker who knows the password still cannot decrypt without the physical keyfile

What GUN-101 does NOT provide:

  • Protection against malware on the encryption/decryption machine
  • Protection if both the encrypted file and keyfile are stolen (two-factor mode only)
  • Protection against side-channel attacks, coercion, or future cryptographic breaks
  • Secure deletion of plaintext or temporary files

Usage

Installation

pip install gun101

Generate a keyfile (for two-factor mode)

gun101 generate-keyfile /path/to/keyfile

This creates a 32-byte random keyfile and prints its SHA-256 fingerprint. Store the keyfile on a separate device (e.g., USB drive) and record the fingerprint.

Encrypt a file

gun101 encrypt secrets.pdf --keyfile /path/to/keyfile

Encrypts secrets.pdf to secrets.pdf.gun101. Omit --keyfile for password-only mode.

Password requirements: Must be at least 10 characters long and contain at least one uppercase letter, one lowercase letter, one digit, and one special character.

Decrypt a file

gun101 decrypt secrets.pdf.gun101 --keyfile /path/to/keyfile

Decrypts to secrets.pdf (removes .gun101 extension). Omit --keyfile for password-only mode.

Password requirements: Must be at least 10 characters long and contain at least one uppercase letter, one lowercase letter, one digit, and one special character.

Verify a keyfile fingerprint

gun101 keyfile-fingerprint /path/to/keyfile

Prints the SHA-256 fingerprint to confirm you have the correct keyfile.

Command Reference

gun101 encrypt <file> [--keyfile <path>] [--output <path>]
  Encrypts <file>. If --output not given, writes to <file>.gun101

gun101 decrypt <file> [--keyfile <path>] [--output <path>]
  Decrypts <file>. If --output not given, strips .gun101 extension or appends .decrypted

gun101 generate-keyfile <path>
  Generates a keyfile at <path>. Prints fingerprint after generation.

gun101 keyfile-fingerprint <path>
  Prints the SHA-256 fingerprint of a keyfile.

Design Decisions

Why Argon2id?

  • Resists GPU/ASIC cracking via high memory usage
  • Resists side-channel attacks via data-independent memory access
  • Recommended by OWASP and NIST SP 800-63B for password hashing

Why AES-256-GCM?

  • Provides both confidentiality and integrity (authenticated encryption)
  • Eliminates padding oracle vulnerabilities present in CBC mode
  • Standardized and widely vetted

Key Concatenation

The keyfile bytes are appended to the password UTF-8 bytes before Argon2id input. This ensures the derived key depends on both factors.

Error Handling

All errors produce generic messages (e.g., "Decryption failed") to avoid leaking information about what went wrong.

Limitations

  • No perfect memory wiping: Python's garbage collection prevents guaranteed key erasure from memory
  • Password strength enforcement: Passwords must be at least 10 characters long and contain uppercase, lowercase, digit, and special character
  • No forward secrecy: Compromised key reveals all past messages encrypted with it
  • No deniability: Encrypted files are identifiable by their structure

Dependencies

  • Python >= 3.9
  • argon2-cffi >= 23.1.0
  • cryptography >= 42.0.2

Testing

Run the test suite with:

pytest tests/ -v

License

MIT License - see LICENSE file.

Warning

This software is provided as-is without warranty. Use at your own risk. The author is not liable for any data loss or security breach resulting from the use or misuse of this software.

Remember: Encryption is only as strong as your password and your ability to keep the keyfile (if used) secure. No tool can protect against a compromised endpoint or a coerced user.

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

gun101-2.0.1.tar.gz (15.5 kB view details)

Uploaded Source

Built Distribution

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

gun101-2.0.1-py3-none-any.whl (10.7 kB view details)

Uploaded Python 3

File details

Details for the file gun101-2.0.1.tar.gz.

File metadata

  • Download URL: gun101-2.0.1.tar.gz
  • Upload date:
  • Size: 15.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for gun101-2.0.1.tar.gz
Algorithm Hash digest
SHA256 de1069e39f2376f240e68637cb615e5ced8e7078c404eeb1e78612d0eb3a5041
MD5 6ce47eb39d31ab5619cc82b7a28c74db
BLAKE2b-256 022ec3f49024fea0d1442aca47e392ede0711518f656f0cf5d4da35163e6f01a

See more details on using hashes here.

Provenance

The following attestation bundles were made for gun101-2.0.1.tar.gz:

Publisher: publish.yml on dialga-cmd/GUN101

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

File details

Details for the file gun101-2.0.1-py3-none-any.whl.

File metadata

  • Download URL: gun101-2.0.1-py3-none-any.whl
  • Upload date:
  • Size: 10.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for gun101-2.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 c5d78372b15da8d3b3c9da672796a707e670437a1220535cd155a63ef6f65950
MD5 1117cda9e83aae8b1571cbfc765b12fd
BLAKE2b-256 70a7b0e0b4d06ba250048bea98ce5dd8f196aa92ce74b052962034dc72db4888

See more details on using hashes here.

Provenance

The following attestation bundles were made for gun101-2.0.1-py3-none-any.whl:

Publisher: publish.yml on dialga-cmd/GUN101

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