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}