file_encrypt.c

Download
c 162 lines 4.8 KB
  1// file_encrypt.c
  2// ํŒŒ์ผ ์•”ํ˜ธํ™” ๋„๊ตฌ (XOR ๊ธฐ๋ฐ˜)
  3// ํ•™์Šต ๋ชฉ์ : ๋ฐ”์ดํŠธ ๋‹จ์œ„ ํŒŒ์ผ I/O, ๋ช…๋ น์ค„ ์ธ์ž ์ฒ˜๋ฆฌ
  4
  5#include <stdio.h>
  6#include <stdlib.h>
  7#include <string.h>
  8
  9#define BUFFER_SIZE 4096  // 4KB ๋ฒ„ํผ ํฌ๊ธฐ
 10
 11// ํ•จ์ˆ˜ ์„ ์–ธ
 12void print_usage(const char *program_name);
 13int encrypt_file(const char *input_file, const char *output_file, const char *key);
 14int decrypt_file(const char *input_file, const char *output_file, const char *key);
 15void xor_buffer(unsigned char *buffer, int len, const char *key, int key_len);
 16
 17/**
 18 * ๋ฉ”์ธ ํ•จ์ˆ˜ - ๋ช…๋ น์ค„ ์ธ์ž ํŒŒ์‹ฑ
 19 *
 20 * @param argc ์ธ์ž ๊ฐœ์ˆ˜
 21 * @param argv ์ธ์ž ๋ฐฐ์—ด
 22 *
 23 * ์‚ฌ์šฉ๋ฒ•:
 24 *   ./file_encrypt -e input.txt output.enc mypassword
 25 *   ./file_encrypt -d output.enc decrypted.txt mypassword
 26 */
 27int main(int argc, char *argv[]) {
 28    // ์ธ์ž ๊ฐœ์ˆ˜ ํ™•์ธ (ํ”„๋กœ๊ทธ๋žจ๋ช… + ๋ชจ๋“œ + ์ž…๋ ฅ + ์ถœ๋ ฅ + ํ‚ค = 5๊ฐœ)
 29    if (argc < 5) {
 30        print_usage(argv[0]);
 31        return 1;
 32    }
 33
 34    const char *mode = argv[1];         // -e ๋˜๋Š” -d
 35    const char *input_file = argv[2];   // ์ž…๋ ฅ ํŒŒ์ผ๋ช…
 36    const char *output_file = argv[3];  // ์ถœ๋ ฅ ํŒŒ์ผ๋ช…
 37    const char *key = argv[4];          // ์•”ํ˜ธํ™” ํ‚ค
 38
 39    // ๋นˆ ํ‚ค ๊ฒ€์ฆ
 40    if (strlen(key) == 0) {
 41        fprintf(stderr, "์˜ค๋ฅ˜: ํ‚ค๋Š” ๋น„์–ด์žˆ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค\n");
 42        return 1;
 43    }
 44
 45    int result;
 46    if (strcmp(mode, "-e") == 0 || strcmp(mode, "--encrypt") == 0) {
 47        // ์•”ํ˜ธํ™” ๋ชจ๋“œ
 48        result = encrypt_file(input_file, output_file, key);
 49        if (result == 0) {
 50            printf("์•”ํ˜ธํ™” ์„ฑ๊ณต: %s -> %s\n", input_file, output_file);
 51        }
 52    } else if (strcmp(mode, "-d") == 0 || strcmp(mode, "--decrypt") == 0) {
 53        // ๋ณตํ˜ธํ™” ๋ชจ๋“œ
 54        result = decrypt_file(input_file, output_file, key);
 55        if (result == 0) {
 56            printf("๋ณตํ˜ธํ™” ์„ฑ๊ณต: %s -> %s\n", input_file, output_file);
 57        }
 58    } else {
 59        fprintf(stderr, "์˜ค๋ฅ˜: ์•Œ ์ˆ˜ ์—†๋Š” ๋ชจ๋“œ '%s'\n", mode);
 60        print_usage(argv[0]);
 61        return 1;
 62    }
 63
 64    return result;
 65}
 66
 67/**
 68 * ์‚ฌ์šฉ๋ฒ• ์ถœ๋ ฅ
 69 *
 70 * @param program_name ํ”„๋กœ๊ทธ๋žจ ์ด๋ฆ„ (argv[0])
 71 */
 72void print_usage(const char *program_name) {
 73    printf("ํŒŒ์ผ ์•”ํ˜ธํ™” ๋„๊ตฌ (XOR)\n\n");
 74    printf("์‚ฌ์šฉ๋ฒ•:\n");
 75    printf("  %s -e <์ž…๋ ฅํŒŒ์ผ> <์ถœ๋ ฅํŒŒ์ผ> <ํ‚ค>  ํŒŒ์ผ ์•”ํ˜ธํ™”\n", program_name);
 76    printf("  %s -d <์ž…๋ ฅํŒŒ์ผ> <์ถœ๋ ฅํŒŒ์ผ> <ํ‚ค>  ํŒŒ์ผ ๋ณตํ˜ธํ™”\n", program_name);
 77    printf("\n์˜ต์…˜:\n");
 78    printf("  -e, --encrypt  ์•”ํ˜ธํ™” ๋ชจ๋“œ\n");
 79    printf("  -d, --decrypt  ๋ณตํ˜ธํ™” ๋ชจ๋“œ\n");
 80    printf("\n์˜ˆ์ œ:\n");
 81    printf("  %s -e secret.txt secret.enc mypassword\n", program_name);
 82    printf("  %s -d secret.enc secret.txt mypassword\n", program_name);
 83}
 84
 85/**
 86 * ๋ฒ„ํผ๋ฅผ XOR ์•”ํ˜ธํ™”/๋ณตํ˜ธํ™”
 87 *
 88 * @param buffer ์ฒ˜๋ฆฌํ•  ๋ฒ„ํผ
 89 * @param len ๋ฒ„ํผ ๊ธธ์ด
 90 * @param key ์•”ํ˜ธํ™” ํ‚ค (๋ฌธ์ž์—ด)
 91 * @param key_len ํ‚ค ๊ธธ์ด
 92 *
 93 * ํ‚ค๊ฐ€ ๋ฐ์ดํ„ฐ๋ณด๋‹ค ์งง์œผ๋ฉด ๋ฐ˜๋ณตํ•ด์„œ ์‚ฌ์šฉ (modulo ์—ฐ์‚ฐ)
 94 */
 95void xor_buffer(unsigned char *buffer, int len, const char *key, int key_len) {
 96    for (int i = 0; i < len; i++) {
 97        // ํ‚ค๋ฅผ ์ˆœํ™˜ํ•˜๋ฉฐ XOR ์ ์šฉ
 98        buffer[i] ^= key[i % key_len];
 99    }
100}
101
102/**
103 * ํŒŒ์ผ ์•”ํ˜ธํ™” ํ•จ์ˆ˜
104 *
105 * @param input_file ์ž…๋ ฅ ํŒŒ์ผ ๊ฒฝ๋กœ
106 * @param output_file ์ถœ๋ ฅ ํŒŒ์ผ ๊ฒฝ๋กœ
107 * @param key ์•”ํ˜ธํ™” ํ‚ค
108 * @return ์„ฑ๊ณต ์‹œ 0, ์‹คํŒจ ์‹œ 1
109 */
110int encrypt_file(const char *input_file, const char *output_file, const char *key) {
111    // ์ž…๋ ฅ ํŒŒ์ผ ์—ด๊ธฐ (๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ๊ธฐ ๋ชจ๋“œ)
112    FILE *fin = fopen(input_file, "rb");
113    if (fin == NULL) {
114        perror("์ž…๋ ฅ ํŒŒ์ผ ์—ด๊ธฐ ์‹คํŒจ");
115        return 1;
116    }
117
118    // ์ถœ๋ ฅ ํŒŒ์ผ ์—ด๊ธฐ (๋ฐ”์ด๋„ˆ๋ฆฌ ์“ฐ๊ธฐ ๋ชจ๋“œ)
119    FILE *fout = fopen(output_file, "wb");
120    if (fout == NULL) {
121        perror("์ถœ๋ ฅ ํŒŒ์ผ ์—ด๊ธฐ ์‹คํŒจ");
122        fclose(fin);
123        return 1;
124    }
125
126    // ๋ฒ„ํผ ์ค€๋น„
127    unsigned char buffer[BUFFER_SIZE];
128    int key_len = strlen(key);
129    size_t bytes_read;
130
131    // ํŒŒ์ผ์„ ๋ฒ„ํผ ํฌ๊ธฐ๋งŒํผ์”ฉ ์ฝ์–ด์„œ ์ฒ˜๋ฆฌ
132    while ((bytes_read = fread(buffer, 1, BUFFER_SIZE, fin)) > 0) {
133        // XOR ์•”ํ˜ธํ™” ์ ์šฉ
134        xor_buffer(buffer, bytes_read, key, key_len);
135
136        // ์•”ํ˜ธํ™”๋œ ๋ฐ์ดํ„ฐ ์“ฐ๊ธฐ
137        fwrite(buffer, 1, bytes_read, fout);
138    }
139
140    // ํŒŒ์ผ ๋‹ซ๊ธฐ
141    fclose(fin);
142    fclose(fout);
143
144    return 0;
145}
146
147/**
148 * ํŒŒ์ผ ๋ณตํ˜ธํ™” ํ•จ์ˆ˜
149 *
150 * @param input_file ์ž…๋ ฅ ํŒŒ์ผ ๊ฒฝ๋กœ
151 * @param output_file ์ถœ๋ ฅ ํŒŒ์ผ ๊ฒฝ๋กœ
152 * @param key ์•”ํ˜ธํ™” ํ‚ค
153 * @return ์„ฑ๊ณต ์‹œ 0, ์‹คํŒจ ์‹œ 1
154 *
155 * XOR ์•”ํ˜ธํ™”์˜ ํŠน์„ฑ์ƒ ์•”ํ˜ธํ™”์™€ ๋ณตํ˜ธํ™” ๊ณผ์ •์ด ๋™์ผํ•จ
156 * (A ^ K = B, B ^ K = A)
157 */
158int decrypt_file(const char *input_file, const char *output_file, const char *key) {
159    // XOR ์•”ํ˜ธํ™”๋Š” ์•”ํ˜ธํ™”์™€ ๋ณตํ˜ธํ™”๊ฐ€ ๋™์ผํ•œ ์—ฐ์‚ฐ
160    return encrypt_file(input_file, output_file, key);
161}