1// simple_xor.c
2// 간단한 XOR 암호화 데모
3// 학습 목적: XOR 연산의 가역성(reversibility) 이해
4
5#include <stdio.h>
6#include <string.h>
7
8/**
9 * XOR 암호화/복호화 함수
10 *
11 * @param data 암호화할 데이터 (in-place 수정됨)
12 * @param len 데이터 길이
13 * @param key 암호화 키 (단일 문자)
14 *
15 * XOR의 핵심 특성:
16 * - A ^ B = C
17 * - C ^ B = A (같은 키로 다시 XOR하면 원본 복원)
18 */
19void xor_encrypt(char *data, int len, char key) {
20 for (int i = 0; i < len; i++) {
21 data[i] ^= key; // XOR 연산으로 암호화/복호화
22 }
23}
24
25/**
26 * 바이너리 데이터를 16진수로 출력
27 *
28 * @param data 출력할 데이터
29 * @param len 데이터 길이
30 */
31void print_hex(const char *data, int len) {
32 for (int i = 0; i < len; i++) {
33 printf("%02X ", (unsigned char)data[i]);
34 }
35 printf("\n");
36}
37
38/**
39 * 비트 패턴 출력 (8비트)
40 *
41 * @param byte 출력할 바이트
42 */
43void print_binary(unsigned char byte) {
44 for (int i = 7; i >= 0; i--) {
45 printf("%d", (byte >> i) & 1);
46 }
47}
48
49int main(void) {
50 char message[] = "Hello, World!";
51 char key = 'K'; // 간단한 단일 문자 키 (ASCII 75)
52
53 printf("=== XOR 암호화 데모 ===\n\n");
54
55 // 원본 메시지 출력
56 printf("원본 메시지: %s\n", message);
57 printf("원본 (hex): ");
58 print_hex(message, strlen(message));
59 printf("\n");
60
61 // 첫 번째 문자의 XOR 연산 상세 설명
62 printf("첫 글자 'H' XOR 'K' 연산 과정:\n");
63 printf(" 'H' = %d (0b", (unsigned char)message[0]);
64 print_binary((unsigned char)message[0]);
65 printf(")\n");
66 printf(" 'K' = %d (0b", (unsigned char)key);
67 print_binary((unsigned char)key);
68 printf(")\n");
69 printf(" XOR = %d (0b", (unsigned char)(message[0] ^ key));
70 print_binary((unsigned char)(message[0] ^ key));
71 printf(")\n\n");
72
73 // 암호화
74 xor_encrypt(message, strlen(message), key);
75 printf("암호화 완료!\n");
76 printf("암호화 (hex): ");
77 print_hex(message, strlen(message));
78
79 // 암호화된 텍스트는 제어 문자가 포함될 수 있어 출력 불가
80 printf("암호화 텍스트: ");
81 for (int i = 0; message[i]; i++) {
82 // 출력 가능한 문자만 표시
83 if (message[i] >= 32 && message[i] <= 126) {
84 printf("%c", message[i]);
85 } else {
86 printf("?"); // 제어 문자는 ? 로 표시
87 }
88 }
89 printf("\n\n");
90
91 // 복호화 (같은 키로 다시 XOR)
92 xor_encrypt(message, strlen(message), key);
93 printf("복호화 완료! (같은 키로 다시 XOR)\n");
94 printf("복호화 결과: %s\n", message);
95 printf("복호화 (hex): ");
96 print_hex(message, strlen(message));
97
98 // XOR의 가역성 검증
99 printf("\n=== XOR 가역성 검증 ===\n");
100 char test = 'A';
101 printf("원본: %c (%d)\n", test, (unsigned char)test);
102
103 test ^= key;
104 printf("암호화: %c (%d)\n", test, (unsigned char)test);
105
106 test ^= key;
107 printf("복호화: %c (%d)\n", test, (unsigned char)test);
108 printf("성공: 원본과 복호화 결과가 동일!\n");
109
110 return 0;
111}