Privacy Tools Guide

Estate lawyers handling sensitive client documents face a unique challenge: how to securely store digital credentials that must remain sealed until a specific trigger event occurs—client death, incapacity, or another defined condition. This guide covers technical approaches for creating encrypted “sealed envelopes” using modern encryption tools, suitable for storing in secure digital deposit boxes or physical safe deposit boxes with digital access credentials.

Understanding the Sealed Envelope Concept

A sealed envelope in digital terms is encrypted content that remains inaccessible until specific conditions are met. For estate lawyers, this typically means:

The technical implementation involves encryption with either time-based release mechanisms or multi-party authorization requirements.

Using Age for Sealed Envelope Creation

The age encryption tool provides a modern, simple approach to creating sealed envelopes. Unlike PGP, age has no key server dependencies and uses modern encryption primitives.

Generating Recipient Keys

First, generate encryption keys for the sealed envelope:

# Generate a new age key pair
age-keygen

# Output example:
# age1ql3z7hjy54pw3hykk5s3uj7cjnp5s3uy9p56n9xx7kcgd4c7cypszk9w7
# # The private key - keep this secure
# SYMMETRIC-KEY: [32-byte key displayed here]

For a safe deposit box scenario, create two key pairs—one for the lawyer and one for the executor or trusted party.

Creating the Sealed Envelope

Package your estate credentials into an encrypted envelope:

# Create a tar archive of estate documents
tar -czf estate-documents.tar.gz \
    will-draft.pdf \
    trust-instructions.txt \
    digital-assets-list.json \
    executor-contact.enc

# Encrypt for multiple recipients (lawyer + executor)
age -r age1lawyerpublickey -r age1executorpublickey \
    -o sealed-envelope.age \
    estate-documents.tar.gz

# For passphrase-based seal (simpler, less secure)
age -p -o sealed-envelope.age estate-documents.tar.gz
# Enter passphrase when prompted

Decoding the Sealed Envelope

The executor or lawyer can decrypt when authorized:

# Decrypt with private key
age -d -i executor-key.txt sealed-envelope.age > decrypted-documents.tar.gz

# Or with passphrase
age -d -p sealed-envelope.age > decrypted-documents.tar.gz

Time-Locked Envelopes with GPG

For envelopes that should remain sealed until a specific date, GPG provides time-based encryption capabilities through the gpg-agent configuration.

Creating a Time-Locked GPG Envelope

# Generate a GPG key for the envelope
gpg --full-generate-key
# Choose RSA 4096, set appropriate expiry

# Create the encrypted package
tar -czf estate-docs.tar.gz will.pdf trust.txt assets.json

# Encrypt with symmetric cipher
gpg --symmetric --cipher-algo AES256 estate-docs.tar.gz

# For time-delayed access, use gpg-agent caching
# Configure agent to cache passphrase for limited time
echo "default-cache-ttl 86400" >> ~/.gnupg/gpg-agent.conf
# This caches the passphrase for 24 hours (86400 seconds)

Multi-Party Authorization Envelope

For envelopes requiring multiple parties to authorize decryption:

# Create shares using Shamir's Secret Sharing via age plugin
# First, generate a random symmetric key
openssl rand -base64 32 > symmetric.key

# Split into 3 shares, requiring 2 to reconstruct
age-keygen | head -1 > recipient1.pub
age-keygen | head -1 > recipient2.pub
age-keygen | head -1 > recipient3.pub

# Encrypt with all three keys
age -r recipient1.pub -r recipient2.pub -r recipient3.pub \
    -o sealed-multiparty.age estate-docs.tar.gz

# Any two recipients can collaborate to decrypt

Digital Credential Storage Patterns

For a safe deposit box scenario, consider this layered approach:

Layer 1: Physical Security

Store the decryption keys in the safe deposit box alongside physical documents:

# Generate a paper key backup
age-keygen -y > paper-key.txt
# Print and store in physical safe deposit box

Layer 2: Distributed Key Storage

Distribute key shares across multiple locations:

# Create shares using age's built-in support
# Generate master key
MASTER_KEY=$(openssl rand -base64 32)

# Create encrypted envelope
echo "$MASTER_KEY" | age -r age1lawyerpub --passphrase \
    -o envelope.age documents.tar.gz

# Store key separately: lawyer has one share,
# executor has another, third party has third

Layer 3: Emergency Access Protocol

Implement a dead man’s switch pattern:

#!/bin/bash
# check-vitality.sh - Run periodically via cron
# If not checked in 30 days, release encrypted keys

LAST_CHECK=$(stat -f %m ~/.last-check)
NOW=$(date +%s)
DIFF=$((NOW - LAST_CHECK))

if [ $DIFF -gt 2592000 ]; then
    # 30 days since last check
    # Release emergency keys to designated contacts
    age -r emergency-contact-pubkey -o released.age \
        master-credentials.tar.gz
    # Send 'released.age' to emergency contact
fi

Practical Implementation for Estate Lawyers

Document Organization Structure

estate-secure/
├── 01-wills/
│   ├── primary-will.encrypted
│   └── secondary-will.encrypted
├── 02-trusts/
│   ├── trust-agreement.age
│   └── trust-instructions.age
├── 03-digital-assets/
│   ├── cryptocurrency-wallets.encrypted
│   ├── domain-credentials.encrypted
│   └── social-media-instructions.age
├── 04-contacts/
│   └── executor-contacts.encrypted
└── 05-keys/
    ├── lawyer-key.asc
    └── executor-key-share.asc

Automation Script for Envelope Management

#!/usr/bin/env python3
"""Estate envelope management script."""

import subprocess
import os
import json
from pathlib import Path

class EstateEnvelope:
    def __init__(self, base_path: str):
        self.base_path = Path(base_path)

    def create_envelope(self, documents: list, recipients: list,
                        output: str, use_passphrase: bool = False):
        """Create encrypted envelope for recipients."""
        # Create temporary archive
        archive_name = "temp-archive.tar.gz"
        subprocess.run(["tar", "-czf", archive_name, *documents],
                      cwd=self.base_path)

        # Build age command
        cmd = ["age", "-o", str(self.base_path / output)]
        for recipient in recipients:
            cmd.extend(["-r", recipient])

        if use_passphrase:
            cmd.append("-p")

        cmd.append(archive_name)
        subprocess.run(cmd)

        # Cleanup
        os.remove(archive_name)

    def list_envelopes(self):
        """List all encrypted envelopes."""
        return list(self.base_path.glob("*.age"))

# Usage example
if __name__ == "__main__":
    envelope = EstateEnvelope("/path/to/estate-secure")

    # Create new sealed envelope
    envelope.create_envelope(
        documents=["01-wills/primary-will.pdf"],
        recipients=["age1executorpubkey"],
        output="wills/sealed-2026.age"
    )

Security Considerations

When implementing sealed envelopes for estate documents:

  1. Key Management: Never store all decryption keys in one location
  2. Redundancy: Maintain encrypted backups in separate secure locations
  3. Key Rotation: Establish procedures for key rotation when circumstances change
  4. Access Protocols: Document clear procedures for authorized access
  5. Legal Compliance: Ensure your approach meets jurisdiction-specific requirements

Verification and Testing

Regularly verify envelope integrity:

# Verify envelope can be decrypted (without actually decrypting)
age -d -o /dev/null sealed-envelope.age 2>&1 || echo "Decryption failed"

# Check file integrity
sha256sum sealed-envelope.age > sealed-envelope.sha256
# Store checksum separately

Building this sealed envelope system requires careful planning around access control, key management, and clear legal procedures. The technical implementation provides the encryption layer, but the operational procedures determine whether the system actually protects client interests as intended.

Built by theluckystrike — More at zovo.one