프로그래밍/C언어

시저암호 프로그래밍 수정

그냥 옛날에 만든 시저암호 프로그램 코드를 보다가 이상한 부분이 있어서 확인을 해봄.

 

해당 포스팅의 링크 참조 : http://l0rq2.tistory.com/30

 

문제의 코드는, 바로

 

 

이 코드이다.

 

프로그램에서 암호화와 관련된 코드는 저 코드가 전부인데,

 

저 코드는 알파벳일때 쉬프트만 해주는 코드이다.

 

애초에 시저암호 자체가 쉬프팅을 하는코드인데 무슨 문제일까?

 

바로 해당 프로그램에서는, 암호화를 진행할때 문자에다가 값을 더하는 것이므로, 문자를 아스키 코드로 본다.

 

아스키 코드 관련 나무위키 글 : https://namu.wiki/w/%EC%95%84%EC%8A%A4%ED%82%A4%20%EC%BD%94%EB%93%9C

 

아스키 코드 표 출처 : Microsoft Developer Network

 

위의 C코드와 해당 표를 보면 문제점이 보일 것이다.

 

대문자 Z같은 경우 키값이 2이고 쉬프트를 해준다면 역슬래쉬(\)가 출력이 되는것이다.

 

또한, 이왕 프로그램을 수정하는 김에 일반적인 시저 암호화는 달리 숫자까지 쉬프트를 해주는 프로그램을 만들어 보았다.

 

고려해 줄것 :

1. 대문자의 아스키코드 범위

2. 소문자의 아스키코드 범위

3. 숫자의 아스키코드 범위

4. 특수기호는 어떻게 처리할 것인가?(미해결, 시간날때 해결해 봐야징 ㅎㅎ)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <ctype.h>
 
#define col GetStdHandle(STD_OUTPUT_HANDLE)//콘솔창의 핸들 정보를 가져옴
#pragma warning(disable:4996)
 
int main(void) {
    char Original_String[101];
    char Encode_String[101];
    int Len = 0;
    int key = 0;
    int i = 0;
 
    memset(Original_String, NULL101); 
    memset(Encode_String, NULL101);
 
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 10);
    printf("==============================\n");
    printf("Made by L0RQ2 - Cipher Decoder\n");
    printf("l0rq2.tistory.com\n");
    printf("==============================\n");
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);
    
    printf("To Encode => ");
    gets_s(Original_String, 101); //Get Oiriginal_String
    printf("Key => ");
    scanf("%d"&key); //Get Key
    Len = strlen(Original_String); //Get strlen of Original_String
 
    for (i = 0; i < Len; i++) {  //Orginal_string[i]!=NULL
        if (isalpha(Original_String[i])) { // Is it Alpha?
            if (isupper(Original_String[i])) {
                //Encode_String[i] = Original_String[i] + (key % 26);
                if (Original_String[i] + (key % 26> 90) {
                    int more = (Original_String[i] + (key % 26)) - 90;
                    Encode_String[i] = 65 + (more - 1);
                }
                else { 
                    Encode_String[i] = Original_String[i] + (key % 26);
                }
            }
 
            else if (islower(Original_String[i])) {
                if (Original_String[i] + (key % 26> 122) {
                    int more = (Original_String[i] + (key % 26)) - 122;
                    Encode_String[i] = 97 + (more - 1);
                }
                else {
                    Encode_String[i] = Original_String[i] + (key % 26);
                }
            }
        }
        else if (Original_String[i] >= '0' && Original_String[i] <= '9') { //num = 48~57 = 0~9
            if (Original_String[i] + (key % 10> 57) {
                int more = (Original_String[i] + (key % 10));
                Encode_String[i] = 48 + (more - 1);
            }
            else {
                Encode_String[i] = Original_String[i] + (key % 10);
            }
        }
        else {
            Encode_String[i] = Original_String[i];
        }
    }
 
    puts(Encode_String); //res
    system("pause");
    return 0;
}
cs

 

이런식으로 코드를 수정 해 보았다.

 

흐음.. 특수문자까지 쉬프트 하는것을 생각 해 볼까...? 

'프로그래밍 > C언어' 카테고리의 다른 글

시저 암호 업그레이드  (0) 2018.12.28
시저암호란? - 시저암호 프로그래밍  (0) 2017.10.09