나의 기록, 현진록

[C] <암호 수학> 단일 치환 암호 복호화 카이사르, 시저 본문

Programming/Algorithm & Data Structure

[C] <암호 수학> 단일 치환 암호 복호화 카이사르, 시저

guswlsdk 2018. 3. 15. 14:59
반응형





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
#include <stdio.h>
#include <string.h>
 
void frequencyCount(int *alphabetList, char *cipherText);
void printAlphabetList(int *alphabetList);
void changeText(char findAlphabet, char changeAlphabet, char *Text);
void printText(char *text);
void printChangeList(char *changeList);
 
void main() {
    int alphabetList[26= { 0, }; //알파벳 빈도 수 저장을 위한 배열
    char cipherText[] = "APS ZU BMS THAAMT KB SOP CHAAPJ MQ LPUWHKX. K UHJ SM JMZ SMLHJ VJ QXKPBLU -- UM PCPB SOMZDO TP QHEP SOP LKQQKEZASKPU MQ SMLHJ HBL SMVMXXMT, K USKAA OHCP H LXPHV. KS KU H LXPHV LPPWAJ XMMSPL KB SOP HVPXKEHB LXPHV.K OHCP H LXPHV SOHS MBP LHJ SOKU BHSKMB TKAA XKUP ZW HBL AKCP MZS SOP SXZP VPHBKBD MQ KSU EXPPL : \"TP OMAL SOPUP SXZSOU SM IP UPAQ-PCKLPBS, SOHS HAA VPB HXP EXPHSPL PGZHA.\" K OHCP H LXPHV SOHS MBP LHJ MB SOP XPL OKAAU MQ DPMXDKH SOP UMBU MQ QMXVPX UAHCPU HBL SOP UMBU MQ QMXVPX UAHCP MTBPXU TKAA IP HIAP SM UKS LMTB SMDPSOPX HS SOP SHIAP MQ IXMSOPXOMML.K OHCP H LXPHV SOHS MBP LHJ PCPB SOP USHSP MQ VKUUKUUKWWK, H USHSP UTPASPXKBD TKSO SOP OPHS MQ KBFZUSKEP, UTPASPXKBD TKSO SOP OPHS MQ MWWXPUUKMB, TKAA IP SXHBUQMXVPL KBSM HB MHUKU MQ QXPPLMV HBL    FZUSKEP.K OHCP H LXPHV SOHS VJ QMZX AKSSAP EOKALXPB TKAA MBP LHJ AKCP KB H BHSKMB TOPXP SOPJ TKAA BMS IP FZLDPL IJ SOP EMAMX MQ SOPKX URKB IZS IJ SOP EMBSPBS MQ SOPKX EOHXHESPX.K OHCP H LXPHV    SMLHJ.K OHCP H LXPHV SOHS MBP LHJ LMTB KB HAHIHVH, TKSO KSU CKEKMZU XHEKUSU, TKSO KSU DMCPXBMX OHCKBD OKU AKWU LXKWWKBD TKSO SOP TMXLU MQ KBSPXWMUKSKMB HBL BZAAKQKEHSKMB -- MBP LHJ XKDOS SOPXP KB HAHIHVH AKSSAP IAHER IMJU HBL IAHER DKXAU TKAA IP HIAP SM FMKB OHBLU TKSO AKSSAP TOKSP IMJU HBL TOKSP DKXAU HU UKUSPXU HBL IXMSOPXU.K OHCP H LXPHV SMLHJ.K OHCP H LXPHV SOHS MBP LHJ PCPXJ CHAAPJ UOHAA IP PNHASPL, HBL PCPXJ OKAA HBL VMZBSHKB UOHAA IP VHLP AMT, SOP XMZDO WAHEPU TKAA IP VHLP WAHKB, HBL SOP EXMMRPL WAHEPU TKAA IP VHLP USXHKDOS, HBL SOP DAMXJ MQ SOP AMXL UOHAA IP XPCPHAPL HBL HAA QAPUO UOHAA UPP KS SMDPSOPX." ;
    char changeList[26= { 0, }; //변경된 알파벳 출력을 위한 배열. ex) P -> e
 
    printText(cipherText); //암호문 출력
    frequencyCount(alphabetList, cipherText); //알파벳 빈도 수 카운트 
    printAlphabetList(alphabetList); //알파벳 빈도 수 출력
    printChangeList(changeList); //변경된 알파벳 출력
 
    while (1) {
        printf("변경할 알파벳을 입력하세요. >> ");
        char findAlphabet = getchar(); 
        while (getchar() != '\n');
        if (findAlphabet == '.'break;
        printf("어떤 알파벳으로 변경하시겠습니까? >> ");
        char changeAlphabet = getchar();
        while (getchar() != '\n');
        changeList[findAlphabet-65= changeAlphabet;
        printf("\n");
        printAlphabetList(alphabetList);
        printChangeList(changeList);
        changeText(findAlphabet, changeAlphabet, cipherText);
        printText(cipherText);
    }
}
 
void frequencyCount(int *alphabetList, char *cipherText) { //빈도 수 카운트 함수
    int len = strlen(cipherText);
    for (int i = 0; i < len; i++) {
        if (*(cipherText + i) >= 65 && *(cipherText + i) <= 90) {
            alphabetList[*(cipherText + i) - 65]++;
        }
    }    
}
void printAlphabetList(int *alphabetList) { //알파벳 빈도 수 출력
    for (int i = 0; i < 26; i++) {
            if (i % == 0) { printf("\n"); }
            printf("%c : %5d    "65 + i, alphabetList[i]);
        }
    printf("\n");
}
void printText(char *text) {
    printf("%s\n\n", text);
}
void changeText(char findAlphabet, char changeAlphabet, char *Text) { // 알파벳 변경 함수
    int len = strlen(Text);
    for (int i = 0; i < len; i++) {
        if (*(Text + i) == findAlphabet) {
            Text[i] = changeAlphabet;
        }
    }
}
void printChangeList(char *changeList) {
    for (int i = 0; i < 26; i++) {
        if (i % == 0) { printf("\n"); }
        printf("%c -> %c\t"65 + i, changeList[i]);
    }
    printf("\n\n");    
}
cs




암호문 : 

APS ZU BMS THAAMT KB SOP CHAAPJ MQ LPUWHKX. K UHJ SM JMZ SMLHJ VJ QXKPBLU -- UM PCPB SOMZDO TP QHEP SOP LKQQKEZASKPU MQ SMLHJ HBL SMVMXXMT, K USKAA OHCP H LXPHV. KS KU H LXPHV LPPWAJ XMMSPL KB SOP HVPXKEHB LXPHV.K OHCP H LXPHV SOHS MBP LHJ SOKU BHSKMB TKAA XKUP ZW HBL AKCP MZS SOP SXZP VPHBKBD MQ KSU EXPPL : \"TP OMAL SOPUP SXZSOU SM IP UPAQ-PCKLPBS, SOHS HAA VPB HXP EXPHSPL PGZHA.\" K OHCP H LXPHV SOHS MBP LHJ MB SOP XPL OKAAU MQ DPMXDKH SOP UMBU MQ QMXVPX UAHCPU HBL SOP UMBU MQ QMXVPX UAHCP MTBPXU TKAA IP HIAP SM UKS LMTB SMDPSOPX HS SOP SHIAP MQ IXMSOPXOMML.K OHCP H LXPHV SOHS MBP LHJ PCPB SOP USHSP MQ VKUUKUUKWWK, H USHSP UTPASPXKBD TKSO SOP OPHS MQ KBFZUSKEP, UTPASPXKBD TKSO SOP OPHS MQ MWWXPUUKMB, TKAA IP SXHBUQMXVPL KBSM HB MHUKU MQ QXPPLMV HBL FZUSKEP.K OHCP H LXPHV SOHS VJ QMZX AKSSAP EOKALXPB TKAA MBP LHJ AKCP KB H BHSKMB TOPXP SOPJ TKAA BMS IP FZLDPL IJ SOP EMAMX MQ SOPKX URKB IZS IJ SOP EMBSPBS MQ SOPKX EOHXHESPX.K OHCP H LXPHV SMLHJ.K OHCP H LXPHV SOHS MBP LHJ LMTB KB HAHIHVH, TKSO KSU CKEKMZU XHEKUSU, TKSO KSU DMCPXBMX OHCKBD OKU AKWU LXKWWKBD TKSO SOP TMXLU MQ KBSPXWMUKSKMB HBL BZAAKQKEHSKMB -- MBP LHJ XKDOS SOPXP KB HAHIHVH AKSSAP IAHER IMJU HBL IAHER DKXAU TKAA IP HIAP SM FMKB OHBLU TKSO AKSSAP TOKSP IMJU HBL TOKSP DKXAU HU UKUSPXU HBL IXMSOPXU.K OHCP H LXPHV SMLHJ.K OHCP H LXPHV SOHS MBP LHJ PCPXJ CHAAPJ UOHAA IP PNHASPL, HBL PCPXJ OKAA HBL VMZBSHKB UOHAA IP VHLP AMT, SOP XMZDO WAHEPU TKAA IP VHLP WAHKB, HBL SOP EXMMRPL WAHEPU TKAA IP VHLP USXHKDOS, HBL SOP DAMXJ MQ SOP AMXL UOHAA IP XPCPHAPL HBL HAA QAPUO UOHAA UPP KS SMDPSOPX.




단일 치환 암호를 복호화하기 위해 알파벳 빈도수로 추측해야 한다.



알파벳 빈도는 e 가 압도적으로 많다.


프로그램을 실행시켜 보자.




이 글에서 사용되는 암호문의 알파벳 빈도수를 출력했다.


P가 가장 많은 빈도수를 가지고 있다.


P를 e로 추측할 수 있다.


P를 e로 변경해보자.






이처럼 알파벳 빈도수 정보를 가지고 알파벳을 변경한다.
















반응형