Examples#

This page provides various examples of using ENcrypt in different scenarios.

Basic Usage#

Simple Message Encryption#

from encryptlib import ENcrypt

# Create an encryptor
encryptor = ENcrypt(59)

# Basic encryption
message = "HELLO WORLD"
encrypted = encryptor.encrypt(message)
decrypted = encryptor.decrypt(encrypted)

print(f"Original: {message}")
print(f"Encrypted:\n{encrypted}")
print(f"Decrypted: {decrypted}")

Working with Custom Alphabets#

Using a Different Character Set#

# Define a custom alphabet (e.g., for English)
english_alphabet = "abcdefghijklmnopqrstuvwxyz "

# Create encryptor with custom alphabet
encryptor = ENcrypt(59, alphabet=english_alphabet)

message = "PYTHON ROCKS"
encrypted = encryptor.encrypt(message)
decrypted = encryptor.decrypt(encrypted)

Handling Special Cases#

Messages with Odd Length#

ENcrypt automatically handles messages with odd length by padding:

encryptor = ENcrypt(59)

# Odd-length message
message = "HELLO"
encrypted = encryptor.encrypt(message)
decrypted = encryptor.decrypt(encrypted)

print(f"Original: {message}")
print(f"Decrypted (with padding): {decrypted}")

Error Handling#

Handling Invalid Keys#

from encryptlib import ENcrypt, InvalidKeyError

try:
    # This will raise an error (key doesn't end in 9)
    encryptor = ENcrypt(58)
except InvalidKeyError as e:
    print(f"Error: {e}")

Invalid Characters#

from encryptlib import ENcrypt, MessageFormatError

encryptor = ENcrypt(59)

try:
    # This will raise an error (contains numbers)
    encrypted = encryptor.encrypt("HELLO123")
except MessageFormatError as e:
    print(f"Error: {e}")

Advanced Usage#

Batch Processing#

def batch_encrypt(messages: list[str], key: int) -> list[np.ndarray]:
    encryptor = ENcrypt(key)
    return [encryptor.encrypt(msg) for msg in messages]

# Example usage
messages = ["HELLO", "WORLD", "PYTHON"]
encrypted_batch = batch_encrypt(messages, 59)

Matrix Manipulation#

Working directly with the key matrix:

encryptor = ENcrypt(59)

# Get the key matrix
key_matrix = encryptor.key_mat
print("Key Matrix:")
print(key_matrix)

# Get matrix properties
determinant = np.linalg.det(key_matrix)
print(f"Determinant: {determinant}")

Integration Examples#

Using with File I/O#

import numpy as np
from encryptlib import ENcrypt

def encrypt_file(filename: str, key: int) -> None:
    # Read text from file
    with open(filename, 'r') as f:
        text = f.read()

    # Encrypt
    encryptor = ENcrypt(key)
    encrypted = encryptor.encrypt(text)

    # Save encrypted matrix
    np.save(f"{filename}.encrypted", encrypted)

def decrypt_file(filename: str, key: int) -> str:
    # Load encrypted matrix
    encrypted = np.load(f"{filename}.encrypted")

    # Decrypt
    encryptor = ENcrypt(key)
    return encryptor.decrypt(encrypted)

Web API Integration#

Example using FastAPI:

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from encryptlib import ENcrypt, EncryptionError

app = FastAPI()

class EncryptRequest(BaseModel):
    message: str
    key: int

@app.post("/encrypt")
async def encrypt_message(request: EncryptRequest):
    try:
        encryptor = ENcrypt(request.key)
        encrypted = encryptor.encrypt(request.message)
        return {"encrypted": encrypted.tolist()}
    except EncryptionError as e:
        raise HTTPException(status_code=400, detail=str(e))

Best Practices#

1. Key Selection#

  • Always use keys that end in 9

  • Use large enough keys for security

  • Keep your keys secure and private

2. Message Preparation#

  • Consider message length (pad if needed)

  • Validate input characters

  • Handle case sensitivity appropriately

3. Error Handling#

  • Always wrap encryption/decryption in try-except blocks

  • Validate input before processing

  • Handle edge cases gracefully

4. Performance#

  • Reuse ENcrypt instances when encrypting multiple messages

  • Consider batch processing for large datasets

  • Monitor matrix operations performance

Security Considerations#

While ENcrypt provides a unique encryption approach, keep in mind:

  • Key selection is crucial for security

  • The library is primarily for educational purposes

  • Consider additional security measures for production use

  • Keep encryption keys secure

  • Understand the mathematical principles behind the encryption

These examples demonstrate the versatility and capabilities of ENcrypt. For more specific use cases or advanced implementations, please consult the API reference or open an issue on GitHub.