Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5b619384a1 | |||
| 12b9884572 | |||
| 83b60b5cc2 | |||
| 2d6546ab83 | |||
| c255185084 | |||
| 24800d69d5 | |||
| 7e50727163 | |||
| f118c23c60 | |||
| b149175f24 | |||
| 206e8042d8 | |||
| 2a5249d93c | |||
| 0e02eaee53 |
1
decrypted.bin
Normal file
1
decrypted.bin
Normal file
@@ -0,0 +1 @@
|
|||||||
|
Hello, this is a test file for encryption!
|
||||||
409
otp.c
409
otp.c
@@ -95,6 +95,12 @@ void show_main_menu(void);
|
|||||||
int handle_generate_menu(void);
|
int handle_generate_menu(void);
|
||||||
int handle_encrypt_menu(void);
|
int handle_encrypt_menu(void);
|
||||||
int handle_decrypt_menu(void);
|
int handle_decrypt_menu(void);
|
||||||
|
int handle_text_encrypt(void);
|
||||||
|
int handle_file_encrypt(void);
|
||||||
|
int handle_smart_decrypt(void);
|
||||||
|
|
||||||
|
// Enhanced input functions
|
||||||
|
int get_filename_with_default(const char* prompt, const char* default_path, char* result, size_t result_size);
|
||||||
|
|
||||||
void print_usage(const char* program_name);
|
void print_usage(const char* program_name);
|
||||||
|
|
||||||
@@ -107,7 +113,7 @@ int main(int argc, char* argv[]) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int interactive_mode(void) {
|
int interactive_mode(void) {
|
||||||
printf("=== OTP Cipher %s ===\n\n", get_version());
|
printf("\n\n\n\n=== OTP Cipher %s ===\n\n", get_version());
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
show_main_menu();
|
show_main_menu();
|
||||||
@@ -116,14 +122,17 @@ int interactive_mode(void) {
|
|||||||
char choice = toupper(input[0]);
|
char choice = toupper(input[0]);
|
||||||
|
|
||||||
switch (choice) {
|
switch (choice) {
|
||||||
case 'G':
|
case 'T':
|
||||||
handle_generate_menu();
|
handle_text_encrypt();
|
||||||
break;
|
break;
|
||||||
case 'E':
|
case 'F':
|
||||||
handle_encrypt_menu();
|
handle_file_encrypt();
|
||||||
break;
|
break;
|
||||||
case 'D':
|
case 'D':
|
||||||
handle_decrypt_menu();
|
handle_smart_decrypt();
|
||||||
|
break;
|
||||||
|
case 'G':
|
||||||
|
handle_generate_menu();
|
||||||
break;
|
break;
|
||||||
case 'L':
|
case 'L':
|
||||||
list_available_pads();
|
list_available_pads();
|
||||||
@@ -142,10 +151,11 @@ int interactive_mode(void) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'X':
|
case 'X':
|
||||||
|
case 'Q':
|
||||||
printf("Goodbye!\n");
|
printf("Goodbye!\n");
|
||||||
return 0;
|
return 0;
|
||||||
default:
|
default:
|
||||||
printf("Invalid option. Please select G, E, D, L, S, or X.\n");
|
printf("Invalid option. Please select T, F, D, G, L, S, or X.\n");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -261,10 +271,11 @@ int command_line_mode(int argc, char* argv[]) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void show_main_menu(void) {
|
void show_main_menu(void) {
|
||||||
printf("=== Main Menu ===\n");
|
printf("======================== Main Menu ========================\n");
|
||||||
|
printf("\033[4mT\033[0mext encrypt\n");
|
||||||
|
printf("\033[4mF\033[0mile encrypt\n");
|
||||||
|
printf("\033[4mD\033[0mecrypt\n");
|
||||||
printf("\033[4mG\033[0menerate new pad\n");
|
printf("\033[4mG\033[0menerate new pad\n");
|
||||||
printf("\033[4mE\033[0mncrypt data (text/file)\n");
|
|
||||||
printf("\033[4mD\033[0mecrypt data (text/file)\n");
|
|
||||||
printf("\033[4mL\033[0mist available pads\n");
|
printf("\033[4mL\033[0mist available pads\n");
|
||||||
printf("\033[4mS\033[0mhow pad information\n");
|
printf("\033[4mS\033[0mhow pad information\n");
|
||||||
printf("E\033[4mx\033[0mit\n");
|
printf("E\033[4mx\033[0mit\n");
|
||||||
@@ -450,16 +461,21 @@ int handle_encrypt_menu(void) {
|
|||||||
|
|
||||||
int ascii_armor = (atoi(format_input) == 2) ? 1 : 0;
|
int ascii_armor = (atoi(format_input) == 2) ? 1 : 0;
|
||||||
|
|
||||||
// Ask for custom output filename (optional)
|
// Generate default output filename and use enhanced input function
|
||||||
printf("\nEnter output filename (or press Enter for default): ");
|
char default_output[1024]; // Increased size to prevent truncation warnings
|
||||||
|
if (ascii_armor) {
|
||||||
|
snprintf(default_output, sizeof(default_output), "%s.otp.asc", input_file);
|
||||||
|
} else {
|
||||||
|
snprintf(default_output, sizeof(default_output), "%s.otp", input_file);
|
||||||
|
}
|
||||||
|
|
||||||
char output_file[512];
|
char output_file[512];
|
||||||
if (!fgets(output_file, sizeof(output_file), stdin)) {
|
if (get_filename_with_default("Output filename:", default_output, output_file, sizeof(output_file)) != 0) {
|
||||||
printf("Error: Failed to read input\n");
|
printf("Error: Failed to read input\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
output_file[strcspn(output_file, "\n")] = 0;
|
|
||||||
|
|
||||||
const char* output_filename = (strlen(output_file) > 0) ? output_file : NULL;
|
const char* output_filename = output_file;
|
||||||
|
|
||||||
return encrypt_file(pad_input, input_file, output_filename, ascii_armor);
|
return encrypt_file(pad_input, input_file, output_filename, ascii_armor);
|
||||||
}
|
}
|
||||||
@@ -506,16 +522,32 @@ int handle_decrypt_menu(void) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ask for custom output filename (optional)
|
// Generate smart default output filename and use enhanced input function
|
||||||
printf("\nEnter output filename (or press Enter for default): ");
|
char default_output[512];
|
||||||
|
strncpy(default_output, input_file, sizeof(default_output) - 1);
|
||||||
|
default_output[sizeof(default_output) - 1] = '\0';
|
||||||
|
|
||||||
|
// Remove common encrypted extensions to get a better default
|
||||||
|
if (strstr(default_output, ".otp.asc")) {
|
||||||
|
// Replace .otp.asc with original extension or no extension
|
||||||
|
char* ext_pos = strstr(default_output, ".otp.asc");
|
||||||
|
*ext_pos = '\0';
|
||||||
|
} else if (strstr(default_output, ".otp")) {
|
||||||
|
// Replace .otp with original extension or no extension
|
||||||
|
char* ext_pos = strstr(default_output, ".otp");
|
||||||
|
*ext_pos = '\0';
|
||||||
|
} else {
|
||||||
|
// No recognized encrypted extension, add .decrypted suffix
|
||||||
|
strncat(default_output, ".decrypted", sizeof(default_output) - strlen(default_output) - 1);
|
||||||
|
}
|
||||||
|
|
||||||
char output_file[512];
|
char output_file[512];
|
||||||
if (!fgets(output_file, sizeof(output_file), stdin)) {
|
if (get_filename_with_default("Output filename:", default_output, output_file, sizeof(output_file)) != 0) {
|
||||||
printf("Error: Failed to read input\n");
|
printf("Error: Failed to read input\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
output_file[strcspn(output_file, "\n")] = 0;
|
|
||||||
|
|
||||||
const char* output_filename = (strlen(output_file) > 0) ? output_file : NULL;
|
const char* output_filename = output_file;
|
||||||
|
|
||||||
return decrypt_file(input_file, output_filename);
|
return decrypt_file(input_file, output_filename);
|
||||||
}
|
}
|
||||||
@@ -2289,6 +2321,194 @@ void simple_entropy_mix(unsigned char* urandom_buffer, size_t buffer_size,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Enhanced input function with editable pre-filled text
|
||||||
|
int get_filename_with_default(const char* prompt, const char* default_path, char* result, size_t result_size) {
|
||||||
|
// Find the last directory separator
|
||||||
|
char* last_slash = strrchr(default_path, '/');
|
||||||
|
char directory[1024] = "";
|
||||||
|
char filename[512] = "";
|
||||||
|
|
||||||
|
if (last_slash) {
|
||||||
|
// Extract directory path
|
||||||
|
size_t dir_len = last_slash - default_path + 1; // Include the trailing slash
|
||||||
|
if (dir_len < sizeof(directory)) {
|
||||||
|
strncpy(directory, default_path, dir_len);
|
||||||
|
directory[dir_len] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Extract filename
|
||||||
|
strncpy(filename, last_slash + 1, sizeof(filename) - 1);
|
||||||
|
filename[sizeof(filename) - 1] = '\0';
|
||||||
|
} else {
|
||||||
|
// No directory separator, treat as filename only
|
||||||
|
strncpy(filename, default_path, sizeof(filename) - 1);
|
||||||
|
filename[sizeof(filename) - 1] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Setup terminal for raw input
|
||||||
|
struct termios orig_termios;
|
||||||
|
if (tcgetattr(STDIN_FILENO, &orig_termios) != 0) {
|
||||||
|
// Fallback to simple input if terminal control fails
|
||||||
|
printf("\n%s\n%s: ", prompt, directory);
|
||||||
|
fflush(stdout);
|
||||||
|
|
||||||
|
char input_buffer[512];
|
||||||
|
if (!fgets(input_buffer, sizeof(input_buffer), stdin)) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
input_buffer[strcspn(input_buffer, "\n")] = 0;
|
||||||
|
|
||||||
|
if (strlen(input_buffer) == 0) {
|
||||||
|
strncpy(result, default_path, result_size - 1);
|
||||||
|
} else {
|
||||||
|
if (strlen(directory) > 0) {
|
||||||
|
snprintf(result, result_size, "%s%s", directory, input_buffer);
|
||||||
|
} else {
|
||||||
|
strncpy(result, input_buffer, result_size - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result[result_size - 1] = '\0';
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set up raw terminal mode
|
||||||
|
struct termios raw_termios = orig_termios;
|
||||||
|
raw_termios.c_lflag &= ~(ECHO | ICANON);
|
||||||
|
raw_termios.c_cc[VMIN] = 1;
|
||||||
|
raw_termios.c_cc[VTIME] = 0;
|
||||||
|
|
||||||
|
if (tcsetattr(STDIN_FILENO, TCSANOW, &raw_termios) != 0) {
|
||||||
|
// Fallback if terminal setup fails
|
||||||
|
printf("\n%s\n%s: ", prompt, directory);
|
||||||
|
fflush(stdout);
|
||||||
|
|
||||||
|
char input_buffer[512];
|
||||||
|
if (!fgets(input_buffer, sizeof(input_buffer), stdin)) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
input_buffer[strcspn(input_buffer, "\n")] = 0;
|
||||||
|
|
||||||
|
if (strlen(input_buffer) == 0) {
|
||||||
|
strncpy(result, default_path, result_size - 1);
|
||||||
|
} else {
|
||||||
|
if (strlen(directory) > 0) {
|
||||||
|
snprintf(result, result_size, "%s%s", directory, input_buffer);
|
||||||
|
} else {
|
||||||
|
strncpy(result, input_buffer, result_size - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result[result_size - 1] = '\0';
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Display prompt and directory
|
||||||
|
printf("\n%s\n%s", prompt, directory);
|
||||||
|
fflush(stdout);
|
||||||
|
|
||||||
|
// Initialize editing buffer with default filename
|
||||||
|
char edit_buffer[512];
|
||||||
|
strncpy(edit_buffer, filename, sizeof(edit_buffer) - 1);
|
||||||
|
edit_buffer[sizeof(edit_buffer) - 1] = '\0';
|
||||||
|
int cursor_pos = strlen(edit_buffer);
|
||||||
|
int buffer_len = cursor_pos;
|
||||||
|
|
||||||
|
// Display initial filename
|
||||||
|
printf("%s", edit_buffer);
|
||||||
|
fflush(stdout);
|
||||||
|
|
||||||
|
// Main editing loop
|
||||||
|
int c;
|
||||||
|
while ((c = getchar()) != EOF) {
|
||||||
|
if (c == '\n' || c == '\r') {
|
||||||
|
// Enter key - accept input
|
||||||
|
break;
|
||||||
|
} else if (c == 127 || c == 8) {
|
||||||
|
// Backspace/Delete
|
||||||
|
if (cursor_pos > 0) {
|
||||||
|
// Move everything after cursor one position left
|
||||||
|
memmove(&edit_buffer[cursor_pos - 1], &edit_buffer[cursor_pos], buffer_len - cursor_pos + 1);
|
||||||
|
cursor_pos--;
|
||||||
|
buffer_len--;
|
||||||
|
|
||||||
|
// Redraw line: move cursor to start of filename area, clear to end, redraw buffer
|
||||||
|
printf("\r%s\033[K%s", directory, edit_buffer);
|
||||||
|
|
||||||
|
// Position cursor correctly
|
||||||
|
if (cursor_pos < buffer_len) {
|
||||||
|
printf("\033[%dD", buffer_len - cursor_pos);
|
||||||
|
}
|
||||||
|
fflush(stdout);
|
||||||
|
}
|
||||||
|
} else if (c == 27) {
|
||||||
|
// Escape sequence (arrow keys, etc.)
|
||||||
|
int c1 = getchar();
|
||||||
|
int c2 = getchar();
|
||||||
|
if (c1 == '[') {
|
||||||
|
if (c2 == 'C' && cursor_pos < buffer_len) {
|
||||||
|
// Right arrow
|
||||||
|
cursor_pos++;
|
||||||
|
printf("\033[1C");
|
||||||
|
fflush(stdout);
|
||||||
|
} else if (c2 == 'D' && cursor_pos > 0) {
|
||||||
|
// Left arrow
|
||||||
|
cursor_pos--;
|
||||||
|
printf("\033[1D");
|
||||||
|
fflush(stdout);
|
||||||
|
} else if (c2 == 'H') {
|
||||||
|
// Home key
|
||||||
|
printf("\033[%dD", cursor_pos);
|
||||||
|
cursor_pos = 0;
|
||||||
|
fflush(stdout);
|
||||||
|
} else if (c2 == 'F') {
|
||||||
|
// End key
|
||||||
|
printf("\033[%dC", buffer_len - cursor_pos);
|
||||||
|
cursor_pos = buffer_len;
|
||||||
|
fflush(stdout);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (c >= 32 && c <= 126) {
|
||||||
|
// Printable character
|
||||||
|
if (buffer_len < (int)sizeof(edit_buffer) - 1) {
|
||||||
|
// Move everything after cursor one position right
|
||||||
|
memmove(&edit_buffer[cursor_pos + 1], &edit_buffer[cursor_pos], buffer_len - cursor_pos + 1);
|
||||||
|
edit_buffer[cursor_pos] = c;
|
||||||
|
cursor_pos++;
|
||||||
|
buffer_len++;
|
||||||
|
|
||||||
|
// Redraw from cursor position
|
||||||
|
printf("%c", c);
|
||||||
|
if (cursor_pos < buffer_len) {
|
||||||
|
// Print remaining characters and move cursor back
|
||||||
|
printf("%s\033[%dD", &edit_buffer[cursor_pos], buffer_len - cursor_pos);
|
||||||
|
}
|
||||||
|
fflush(stdout);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Ignore other control characters
|
||||||
|
}
|
||||||
|
|
||||||
|
// Restore terminal
|
||||||
|
tcsetattr(STDIN_FILENO, TCSANOW, &orig_termios);
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
// Construct final result
|
||||||
|
if (buffer_len == 0) {
|
||||||
|
// Empty input, use default
|
||||||
|
strncpy(result, default_path, result_size - 1);
|
||||||
|
} else {
|
||||||
|
// Combine directory with edited filename
|
||||||
|
edit_buffer[buffer_len] = '\0';
|
||||||
|
if (strlen(directory) > 0) {
|
||||||
|
snprintf(result, result_size, "%s%s", directory, edit_buffer);
|
||||||
|
} else {
|
||||||
|
strncpy(result, edit_buffer, result_size - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result[result_size - 1] = '\0';
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
// Editor and file manager implementations
|
// Editor and file manager implementations
|
||||||
|
|
||||||
char* get_preferred_editor(void) {
|
char* get_preferred_editor(void) {
|
||||||
@@ -2473,6 +2693,155 @@ int launch_file_manager(const char* start_directory, char* selected_file, size_t
|
|||||||
return 1; // Fall back to manual entry
|
return 1; // Fall back to manual entry
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int handle_text_encrypt(void) {
|
||||||
|
printf("\n=== Text Encrypt ===\n");
|
||||||
|
|
||||||
|
// Launch text editor directly
|
||||||
|
char text_buffer[MAX_INPUT_SIZE];
|
||||||
|
if (launch_text_editor(NULL, text_buffer, sizeof(text_buffer)) != 0) {
|
||||||
|
printf("Error: Could not launch text editor\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strlen(text_buffer) == 0) {
|
||||||
|
printf("No text entered - canceling encryption\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// List available pads and get selection
|
||||||
|
int pad_count = list_available_pads();
|
||||||
|
if (pad_count == 0) {
|
||||||
|
printf("No pads available. Generate a pad first.\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("\nEnter pad selection (number, checksum, or prefix): ");
|
||||||
|
char pad_input[MAX_HASH_LENGTH];
|
||||||
|
if (!fgets(pad_input, sizeof(pad_input), stdin)) {
|
||||||
|
printf("Error: Failed to read pad selection\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
pad_input[strcspn(pad_input, "\n")] = 0;
|
||||||
|
|
||||||
|
return encrypt_text(pad_input, text_buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
int handle_file_encrypt(void) {
|
||||||
|
printf("\n=== File Encrypt ===\n");
|
||||||
|
|
||||||
|
// Launch file manager directly
|
||||||
|
char input_file[512];
|
||||||
|
if (launch_file_manager(".", input_file, sizeof(input_file)) != 0) {
|
||||||
|
printf("Error: Could not launch file manager\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if file exists
|
||||||
|
if (access(input_file, R_OK) != 0) {
|
||||||
|
printf("Error: File '%s' not found or cannot be read\n", input_file);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// List available pads
|
||||||
|
int pad_count = list_available_pads();
|
||||||
|
if (pad_count == 0) {
|
||||||
|
printf("No pads available. Generate a pad first.\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("\nEnter pad selection (number, checksum, or prefix): ");
|
||||||
|
char pad_input[MAX_HASH_LENGTH];
|
||||||
|
if (!fgets(pad_input, sizeof(pad_input), stdin)) {
|
||||||
|
printf("Error: Failed to read pad selection\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
pad_input[strcspn(pad_input, "\n")] = 0;
|
||||||
|
|
||||||
|
// Ask for output format
|
||||||
|
printf("\nSelect output format:\n");
|
||||||
|
printf("1. Binary (.otp) - preserves file permissions\n");
|
||||||
|
printf("2. ASCII (.otp.asc) - text-safe format\n");
|
||||||
|
printf("Enter choice (1-2): ");
|
||||||
|
|
||||||
|
char format_input[10];
|
||||||
|
if (!fgets(format_input, sizeof(format_input), stdin)) {
|
||||||
|
printf("Error: Failed to read input\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ascii_armor = (atoi(format_input) == 2) ? 1 : 0;
|
||||||
|
|
||||||
|
// Generate default output filename
|
||||||
|
char default_output[1024]; // Increased buffer size to prevent truncation warnings
|
||||||
|
if (ascii_armor) {
|
||||||
|
snprintf(default_output, sizeof(default_output), "%s.otp.asc", input_file);
|
||||||
|
} else {
|
||||||
|
snprintf(default_output, sizeof(default_output), "%s.otp", input_file);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use enhanced input function for output filename
|
||||||
|
char output_file[512];
|
||||||
|
if (get_filename_with_default("Output filename:", default_output, output_file, sizeof(output_file)) != 0) {
|
||||||
|
printf("Error: Failed to read input\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* output_filename = output_file;
|
||||||
|
|
||||||
|
return encrypt_file(pad_input, input_file, output_filename, ascii_armor);
|
||||||
|
}
|
||||||
|
|
||||||
|
int handle_smart_decrypt(void) {
|
||||||
|
printf("\n=== Smart Decrypt ===\n");
|
||||||
|
printf("Enter encrypted data (paste ASCII armor) or press Enter to browse files:\n");
|
||||||
|
|
||||||
|
char input_line[MAX_LINE_LENGTH];
|
||||||
|
if (!fgets(input_line, sizeof(input_line), stdin)) {
|
||||||
|
printf("Error: Failed to read input\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove newline
|
||||||
|
input_line[strcspn(input_line, "\n")] = 0;
|
||||||
|
|
||||||
|
if (strlen(input_line) == 0) {
|
||||||
|
// Empty input - launch file manager
|
||||||
|
char selected_file[512];
|
||||||
|
if (launch_file_manager(".", selected_file, sizeof(selected_file)) != 0) {
|
||||||
|
printf("Error: Could not launch file manager\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Decrypt selected file
|
||||||
|
return decrypt_file(selected_file, NULL);
|
||||||
|
} else if (strncmp(input_line, "-----BEGIN OTP MESSAGE-----", 27) == 0) {
|
||||||
|
// Looks like ASCII armor - collect the full message
|
||||||
|
char full_message[MAX_INPUT_SIZE * 4] = {0};
|
||||||
|
strcat(full_message, input_line);
|
||||||
|
strcat(full_message, "\n");
|
||||||
|
|
||||||
|
printf("Continue pasting the message (end with -----END OTP MESSAGE-----):\n");
|
||||||
|
|
||||||
|
char line[MAX_LINE_LENGTH];
|
||||||
|
while (fgets(line, sizeof(line), stdin)) {
|
||||||
|
strncat(full_message, line, sizeof(full_message) - strlen(full_message) - 1);
|
||||||
|
if (strstr(line, "-----END OTP MESSAGE-----")) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return decrypt_text(NULL, full_message);
|
||||||
|
} else {
|
||||||
|
// Check if it looks like a file path
|
||||||
|
if (access(input_line, R_OK) == 0) {
|
||||||
|
return decrypt_file(input_line, NULL);
|
||||||
|
} else {
|
||||||
|
printf("Input not recognized as ASCII armor or valid file path.\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void print_usage(const char* program_name) {
|
void print_usage(const char* program_name) {
|
||||||
printf("OTP Cipher - One Time Pad Implementation %s\n", get_version());
|
printf("OTP Cipher - One Time Pad Implementation %s\n", get_version());
|
||||||
printf("%s\n", get_build_info());
|
printf("%s\n", get_build_info());
|
||||||
|
|||||||
BIN
output.otp
Normal file
BIN
output.otp
Normal file
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
This is a test file for OTP encryption.
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
-----BEGIN OTP MESSAGE-----
|
|
||||||
Version: v0.2.15
|
|
||||||
Pad-ChkSum: 0c8e19fde996e683fdbd348d1052eec168ffe6f67a88bb1278d0d02e9341b87b
|
|
||||||
Pad-Offset: 210
|
|
||||||
|
|
||||||
mMIm7iVtUO6NbXbskMxtydI/A16UXEQUGTcIya/8Dja6PB3EC0MLdw==
|
|
||||||
-----END OTP MESSAGE-----
|
|
||||||
1
test_decrypt.txt
Normal file
1
test_decrypt.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
Test file content for decryption
|
||||||
BIN
test_decrypt.txt.otp
Normal file
BIN
test_decrypt.txt.otp
Normal file
Binary file not shown.
Binary file not shown.
7
test_file.txt.otp.asc
Normal file
7
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-----
|
||||||
1
test_input.txt
Normal file
1
test_input.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
This is a test file for encryption.
|
||||||
BIN
toc.txt.otp
Normal file
BIN
toc.txt.otp
Normal file
Binary file not shown.
Reference in New Issue
Block a user