Compare commits
40 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5a611a9dc0 | |||
| aff8bea0a2 | |||
| 864c0356da | |||
| 35175790e2 | |||
| 04ea4fb848 | |||
| 5c61ba7ea8 | |||
| a45b304d22 | |||
| 403d013224 | |||
| 82533d96e4 | |||
| 5b619384a1 | |||
| 12b9884572 | |||
| 83b60b5cc2 | |||
| 2d6546ab83 | |||
| c255185084 | |||
| 24800d69d5 | |||
| 7e50727163 | |||
| f118c23c60 | |||
| b149175f24 | |||
| 206e8042d8 | |||
| 2a5249d93c | |||
| 0e02eaee53 | |||
| e32eb8b2b1 | |||
| 0aecae0c5e | |||
| fa90e0eafd | |||
| 2a10d974b2 | |||
| 7e04896394 | |||
| 0cdf6e7804 | |||
| 268758a21b | |||
| 85ef39d283 | |||
| 2c864f1feb | |||
| ae0afcfffd | |||
| e45aa04b05 | |||
| 8e1fcdb108 | |||
| 29f4a67c1c | |||
| 146da4e883 | |||
| 3152a7777f | |||
| 68a2a0c252 | |||
| bb17b0a7be | |||
| 487432c399 | |||
| f521349cc0 |
7
.clinerules/workspace_rules.md
Normal file
7
.clinerules/workspace_rules.md
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
When building, use build.sh, not make.
|
||||||
|
|
||||||
|
Use it as follows: build.sh -m "useful comment on changes being made"
|
||||||
|
|
||||||
|
When making TUI menus, try to use the first leter of the command and the key to press to execute that command. For example, if the command is "Open file" try to use a keypress of "o" upper or lower case to signal to open the file. Use this instead of number keyed menus when possible. In the command, the letter should be underlined that signifies the command.
|
||||||
|
|
||||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -1,5 +1,7 @@
|
|||||||
|
otp
|
||||||
pads/
|
pads/
|
||||||
Gemini.md
|
Gemini.md
|
||||||
|
TropicOfCancer-HenryMiller.txt
|
||||||
|
|
||||||
# Auto-generated version files
|
# Auto-generated version files
|
||||||
src/version.h
|
src/version.h
|
||||||
|
|||||||
4
Makefile
4
Makefile
@@ -1,7 +1,7 @@
|
|||||||
CC = gcc
|
CC = gcc
|
||||||
CFLAGS = -Wall -Wextra -std=c99
|
CFLAGS = -Wall -Wextra -std=c99
|
||||||
LIBS = -lssl -lcrypto
|
LIBS =
|
||||||
LIBS_STATIC = -static -lssl -lcrypto -ldl -lpthread
|
LIBS_STATIC = -static
|
||||||
TARGET = otp
|
TARGET = otp
|
||||||
SOURCE = otp.c
|
SOURCE = otp.c
|
||||||
VERSION_SOURCE = src/version.c
|
VERSION_SOURCE = src/version.c
|
||||||
|
|||||||
144
README.md
144
README.md
@@ -5,7 +5,10 @@ A secure one-time pad (OTP) cipher implementation in C with automatic versioning
|
|||||||
## Features
|
## Features
|
||||||
|
|
||||||
- **Perfect Security**: Implements true one-time pad encryption with information-theoretic security
|
- **Perfect Security**: Implements true one-time pad encryption with information-theoretic security
|
||||||
|
- **Text & File Encryption**: Supports both inline text and file encryption
|
||||||
|
- **Multiple Output Formats**: Binary (.otp) and ASCII armored (.otp.asc) file formats
|
||||||
- **Keyboard Entropy**: Optional keyboard entropy collection for enhanced randomness
|
- **Keyboard Entropy**: Optional keyboard entropy collection for enhanced randomness
|
||||||
|
- **Short Command Flags**: Convenient single-character flags for all operations
|
||||||
- **Automatic Versioning**: Built-in semantic versioning with automatic patch increment
|
- **Automatic Versioning**: Built-in semantic versioning with automatic patch increment
|
||||||
- **Multiple Build Options**: Standard and static linking builds
|
- **Multiple Build Options**: Standard and static linking builds
|
||||||
- **Cross-Platform**: Works on Linux and other UNIX-like systems
|
- **Cross-Platform**: Works on Linux and other UNIX-like systems
|
||||||
@@ -25,10 +28,11 @@ Current version can be viewed with: `./otp --help` or by running the interactive
|
|||||||
### Prerequisites
|
### Prerequisites
|
||||||
|
|
||||||
- GCC compiler
|
- GCC compiler
|
||||||
- OpenSSL development libraries (`libssl-dev` on Ubuntu/Debian)
|
|
||||||
- Git (for version tracking)
|
- Git (for version tracking)
|
||||||
- Make
|
- Make
|
||||||
|
|
||||||
|
**Note: OpenSSL is no longer required! This implementation is now completely self-contained.**
|
||||||
|
|
||||||
### Build Commands
|
### Build Commands
|
||||||
|
|
||||||
Use the included build script for automatic versioning:
|
Use the included build script for automatic versioning:
|
||||||
@@ -125,10 +129,11 @@ These files are excluded from git (.gitignore) and regenerated on each build.
|
|||||||
## Security Features
|
## Security Features
|
||||||
|
|
||||||
- Uses `/dev/urandom` for cryptographically secure random number generation
|
- Uses `/dev/urandom` for cryptographically secure random number generation
|
||||||
- Optional keyboard entropy mixing using HKDF (Hash-based Key Derivation Function)
|
- Optional keyboard entropy mixing using simple XOR operations
|
||||||
- SHA-256 pad integrity verification
|
- Custom 256-bit XOR checksum for pad identification (encrypted with pad data)
|
||||||
- Read-only pad files to prevent accidental modification
|
- Read-only pad files to prevent accidental modification
|
||||||
- State tracking to prevent pad reuse
|
- State tracking to prevent pad reuse
|
||||||
|
- **Zero external crypto dependencies** - completely self-contained implementation
|
||||||
|
|
||||||
## File Structure
|
## File Structure
|
||||||
|
|
||||||
@@ -146,45 +151,122 @@ otp/
|
|||||||
└── VERSION # Plain text version (generated)
|
└── VERSION # Plain text version (generated)
|
||||||
```
|
```
|
||||||
|
|
||||||
## Examples
|
## File Formats
|
||||||
|
|
||||||
|
### .otp File Format (Binary)
|
||||||
|
|
||||||
|
Binary encrypted files use a structured header format:
|
||||||
|
|
||||||
|
```
|
||||||
|
Offset | Size | Field | Description
|
||||||
|
-------|------|-------------------|----------------------------------
|
||||||
|
0 | 4 | Magic | "OTP\0" - File type identifier
|
||||||
|
4 | 2 | Version | Format version (currently 1)
|
||||||
|
6 | 32 | Pad Checksum | Binary pad checksum (32 bytes)
|
||||||
|
38 | 8 | Pad Offset | Offset in pad file (uint64_t)
|
||||||
|
46 | 4 | File Mode | Original file permissions (uint32_t)
|
||||||
|
50 | 8 | File Size | Original file size (uint64_t)
|
||||||
|
58 | var | Encrypted Data | XOR-encrypted file contents
|
||||||
|
```
|
||||||
|
|
||||||
|
### .otp.asc File Format (ASCII Armored)
|
||||||
|
|
||||||
|
ASCII armored files use the same format as encrypted text messages:
|
||||||
|
|
||||||
|
```
|
||||||
|
-----BEGIN OTP MESSAGE-----
|
||||||
|
Version: v0.2.15
|
||||||
|
Pad-ChkSum: <64-character-hex-checksum>
|
||||||
|
Pad-Offset: <decimal-offset-value>
|
||||||
|
|
||||||
|
<base64-encoded-encrypted-data>
|
||||||
|
-----END OTP MESSAGE-----
|
||||||
|
```
|
||||||
|
|
||||||
|
**Note:** ASCII armored files do not preserve original file permissions metadata.
|
||||||
|
|
||||||
|
## Usage Examples
|
||||||
|
|
||||||
|
### Short Command Flags
|
||||||
|
```bash
|
||||||
|
# Quick commands using short flags
|
||||||
|
./otp -g 1GB # Generate 1GB pad
|
||||||
|
./otp -l # List available pads
|
||||||
|
./otp -e 1a2b "Hello world" # Encrypt text inline
|
||||||
|
./otp -d "-----BEGIN OTP..." # Decrypt message inline
|
||||||
|
|
||||||
|
# File operations
|
||||||
|
./otp -f document.pdf 1a2b # Encrypt file (binary)
|
||||||
|
./otp -f document.pdf 1a2b -a # Encrypt file (ASCII)
|
||||||
|
./otp -f document.pdf 1a2b -o secret.otp # Custom output name
|
||||||
|
```
|
||||||
|
|
||||||
|
### Text Encryption
|
||||||
|
```bash
|
||||||
|
# Interactive text encryption
|
||||||
|
./otp encrypt 1a2b3c
|
||||||
|
Enter text to encrypt: This is my secret message
|
||||||
|
# Outputs ASCII armored message
|
||||||
|
|
||||||
|
# Inline text encryption
|
||||||
|
./otp -e 1a2b3c "This is my secret message"
|
||||||
|
# Outputs ASCII armored message immediately
|
||||||
|
```
|
||||||
|
|
||||||
|
### File Encryption
|
||||||
|
```bash
|
||||||
|
# Binary format (preserves metadata)
|
||||||
|
./otp -f sensitive.doc a1b2c3
|
||||||
|
|
||||||
|
# ASCII armored format (text-safe)
|
||||||
|
./otp -f sensitive.doc a1b2c3 -a
|
||||||
|
|
||||||
|
# Custom output filename
|
||||||
|
./otp -f sensitive.doc a1b2c3 -o encrypted_document.otp
|
||||||
|
```
|
||||||
|
|
||||||
|
### Decryption
|
||||||
|
```bash
|
||||||
|
# Auto-detect format and pad from message/file
|
||||||
|
./otp -d encrypted.otp.asc
|
||||||
|
./otp -d "-----BEGIN OTP MESSAGE-----..."
|
||||||
|
|
||||||
|
# Interactive mode
|
||||||
|
./otp decrypt
|
||||||
|
# Prompts for encrypted message input
|
||||||
|
```
|
||||||
|
|
||||||
### Build and Version Tracking
|
### Build and Version Tracking
|
||||||
```bash
|
```bash
|
||||||
$ ./build.sh build
|
$ ./build.sh build
|
||||||
[INFO] Incrementing version...
|
[INFO] Incrementing version...
|
||||||
[INFO] Current version: v0.1.4
|
[INFO] Current version: v0.2.14
|
||||||
[INFO] New version: v0.1.5
|
[INFO] New version: v0.2.15
|
||||||
[SUCCESS] Created new version tag: v0.1.5
|
[SUCCESS] Created new version tag: v0.2.15
|
||||||
[SUCCESS] Build completed successfully
|
[SUCCESS] Build completed successfully
|
||||||
|
|
||||||
$ ./otp
|
|
||||||
=== OTP Cipher v0.1.5 ===
|
|
||||||
|
|
||||||
=== Main Menu ===
|
|
||||||
1. Generate new pad
|
|
||||||
2. Encrypt message
|
|
||||||
3. Decrypt message
|
|
||||||
4. List available pads
|
|
||||||
5. Show pad information
|
|
||||||
6. Exit
|
|
||||||
|
|
||||||
$ ./otp --help
|
$ ./otp --help
|
||||||
OTP Cipher - One Time Pad Implementation v0.1.5
|
OTP Cipher - One Time Pad Implementation v0.2.15
|
||||||
Built on 2025-08-10 at 08:17:47 from commit 9edfa5f on branch master
|
Built on 2025-08-10 at 14:07:58 from commit ae0afcf on branch master
|
||||||
Usage:
|
|
||||||
./otp - Interactive mode
|
|
||||||
...
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Version History
|
### Advanced Features
|
||||||
```bash
|
```bash
|
||||||
$ git tag --list
|
# Generate pad with keyboard entropy
|
||||||
v0.1.0
|
./otp generate 5GB
|
||||||
v0.1.1
|
# Follow prompts for keyboard entropy collection
|
||||||
v0.1.2
|
|
||||||
v0.1.3
|
# Check pad usage
|
||||||
v0.1.4
|
./otp -l
|
||||||
v0.1.5
|
Available pads:
|
||||||
|
No. ChkSum (first 16 chars) Size Used % Used
|
||||||
|
--- ------------------- ---------- ---------- ------
|
||||||
|
1 97d9d82b5414a943 1.00GB 156B 0.0%
|
||||||
|
2 0c8e19fde996e683 1000B 248B 24.8%
|
||||||
|
|
||||||
|
# Show detailed pad information
|
||||||
|
./otp
|
||||||
|
# Select "S" for show pad info, enter checksum or prefix
|
||||||
```
|
```
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|||||||
68
build.sh
68
build.sh
@@ -13,6 +13,23 @@ print_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; }
|
|||||||
print_warning() { echo -e "${YELLOW}[WARNING]${NC} $1"; }
|
print_warning() { echo -e "${YELLOW}[WARNING]${NC} $1"; }
|
||||||
print_error() { echo -e "${RED}[ERROR]${NC} $1"; }
|
print_error() { echo -e "${RED}[ERROR]${NC} $1"; }
|
||||||
|
|
||||||
|
# Global variable for commit message
|
||||||
|
COMMIT_MESSAGE=""
|
||||||
|
|
||||||
|
# Parse command line arguments for -m flag
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
case $1 in
|
||||||
|
-m|--message)
|
||||||
|
COMMIT_MESSAGE="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
# Keep other arguments for main logic
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
# Function to automatically increment version
|
# Function to automatically increment version
|
||||||
increment_version() {
|
increment_version() {
|
||||||
print_status "Incrementing version..."
|
print_status "Incrementing version..."
|
||||||
@@ -50,9 +67,50 @@ increment_version() {
|
|||||||
print_status "Current version: $LATEST_TAG"
|
print_status "Current version: $LATEST_TAG"
|
||||||
print_status "New version: $NEW_VERSION"
|
print_status "New version: $NEW_VERSION"
|
||||||
|
|
||||||
|
# Stage all changes
|
||||||
|
if git add . 2>/dev/null; then
|
||||||
|
print_success "Staged all changes"
|
||||||
|
else
|
||||||
|
print_warning "Failed to stage changes (maybe not a git repository)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Handle commit message - use global variable if set, otherwise prompt
|
||||||
|
if [[ -z "$COMMIT_MESSAGE" ]]; then
|
||||||
|
echo ""
|
||||||
|
print_status "Please enter a meaningful commit message for version $NEW_VERSION:"
|
||||||
|
echo -n "> "
|
||||||
|
read -r COMMIT_MESSAGE
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if user provided a message
|
||||||
|
if [[ -z "$COMMIT_MESSAGE" ]]; then
|
||||||
|
print_warning "No commit message provided. Using default message."
|
||||||
|
COMMIT_MESSAGE="Automatic version increment"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Commit changes with user-provided message
|
||||||
|
if git commit -m "Version $NEW_VERSION - $COMMIT_MESSAGE" 2>/dev/null; then
|
||||||
|
print_success "Committed changes for version $NEW_VERSION"
|
||||||
|
else
|
||||||
|
print_warning "Failed to commit changes (maybe no changes to commit or not a git repository)"
|
||||||
|
fi
|
||||||
|
|
||||||
# Create new git tag
|
# Create new git tag
|
||||||
if git tag "$NEW_VERSION" 2>/dev/null; then
|
if git tag "$NEW_VERSION" 2>/dev/null; then
|
||||||
print_success "Created new version tag: $NEW_VERSION"
|
print_success "Created new version tag: $NEW_VERSION"
|
||||||
|
|
||||||
|
# Push changes and tags to remote repository
|
||||||
|
if git push ssh://ubuntu@laantungir.net:/home/ubuntu/git_repos/otp 2>/dev/null; then
|
||||||
|
print_success "Pushed changes to remote repository"
|
||||||
|
else
|
||||||
|
print_warning "Failed to push changes to remote repository"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if git push ssh://ubuntu@laantungir.net:/home/ubuntu/git_repos/otp --tags 2>/dev/null; then
|
||||||
|
print_success "Pushed tags to remote repository"
|
||||||
|
else
|
||||||
|
print_warning "Failed to push tags to remote repository"
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
print_warning "Tag $NEW_VERSION already exists - using existing version"
|
print_warning "Tag $NEW_VERSION already exists - using existing version"
|
||||||
NEW_VERSION=$LATEST_TAG
|
NEW_VERSION=$LATEST_TAG
|
||||||
@@ -213,7 +271,10 @@ case "${1:-build}" in
|
|||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
echo "OTP Cipher Build Script"
|
echo "OTP Cipher Build Script"
|
||||||
echo "Usage: $0 {build|static|clean|install|uninstall|version}"
|
echo "Usage: $0 [-m \"commit message\"] {build|static|clean|install|uninstall|version}"
|
||||||
|
echo ""
|
||||||
|
echo "Options:"
|
||||||
|
echo " -m, --message \"text\" - Specify commit message (skips interactive prompt)"
|
||||||
echo ""
|
echo ""
|
||||||
echo "Commands:"
|
echo "Commands:"
|
||||||
echo " build - Build project with automatic version increment (default)"
|
echo " build - Build project with automatic version increment (default)"
|
||||||
@@ -222,6 +283,11 @@ case "${1:-build}" in
|
|||||||
echo " install - Install to system (requires build first)"
|
echo " install - Install to system (requires build first)"
|
||||||
echo " uninstall - Remove from system"
|
echo " uninstall - Remove from system"
|
||||||
echo " version - Generate version files only"
|
echo " version - Generate version files only"
|
||||||
|
echo ""
|
||||||
|
echo "Examples:"
|
||||||
|
echo " $0 build"
|
||||||
|
echo " $0 -m \"Fixed checksum parsing bug\" build"
|
||||||
|
echo " $0 --message \"Added new feature\" static"
|
||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|||||||
1
debug.c
Normal file
1
debug.c
Normal file
@@ -0,0 +1 @@
|
|||||||
|
int main() { printf("Testing direct filename: %d\n", strncmp("97d9d82b5414a9439102f3811fb90ab1d6368a00d33229a18b306476f9d04f82.pad", "97", 2)); return 0; }
|
||||||
1
decrypted.bin
Normal file
1
decrypted.bin
Normal file
@@ -0,0 +1 @@
|
|||||||
|
Test file content for decryption
|
||||||
1
files/o2.txt
Normal file
1
files/o2.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
Hello, this is a test file for encryption!
|
||||||
BIN
files/out2.otp
Normal file
BIN
files/out2.otp
Normal file
Binary file not shown.
BIN
files/output.otp
Normal file
BIN
files/output.otp
Normal file
Binary file not shown.
1
files/test_decrypt.txt
Normal file
1
files/test_decrypt.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
Test file content for decryption
|
||||||
BIN
files/test_decrypt.txt.otp
Normal file
BIN
files/test_decrypt.txt.otp
Normal file
Binary file not shown.
1
files/test_file.txt
Normal file
1
files/test_file.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
Hello, this is a test file for encryption!
|
||||||
7
files/test_file.txt.otp.asc
Normal file
7
files/test_file.txt.otp.asc
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
-----BEGIN OTP MESSAGE-----
|
||||||
|
Version: v0.2.29
|
||||||
|
Pad-ChkSum: d0d4a489354348b08d8c7b324814d8c50010042e9da47f2c973f32a16a09101b
|
||||||
|
Pad-Offset: 57
|
||||||
|
|
||||||
|
05S8GfS0tFfczNMUz0xrieFGoPSREM4uo5QhFGoBCcOzjfTXTDMt3hRtAQ==
|
||||||
|
-----END OTP MESSAGE-----
|
||||||
BIN
files/test_files_dir.txt.otp
Normal file
BIN
files/test_files_dir.txt.otp
Normal file
Binary file not shown.
1
files/test_input.txt
Normal file
1
files/test_input.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
This is a test file for encryption.
|
||||||
8898
files/toc.txt
Executable file
8898
files/toc.txt
Executable file
File diff suppressed because it is too large
Load Diff
BIN
files/toc.txt.otp
Normal file
BIN
files/toc.txt.otp
Normal file
Binary file not shown.
8
otp.code-workspace
Normal file
8
otp.code-workspace
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"folders": [
|
||||||
|
{
|
||||||
|
"path": "."
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"settings": {}
|
||||||
|
}
|
||||||
1
test_files_dir.txt
Normal file
1
test_files_dir.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
Testing updated files directory functionality
|
||||||
1
test_new.txt
Normal file
1
test_new.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
Testing files directory functionality
|
||||||
BIN
test_new.txt.otp
Normal file
BIN
test_new.txt.otp
Normal file
Binary file not shown.
Reference in New Issue
Block a user