simple_xor.c

Download
c 112 lines 3.1 KB
  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}