๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๋ณด์•ˆ

A5/1 แ„€แ…ฎแ„’แ…งแ†ซ(C++)

A5/1 แ„€แ…ฎแ„’แ…งแ†ซ(C++)

Stream Cipher ์ค‘ ํ•˜๋‚˜์ธ A5/1๋ฅผ C++๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ์•”ํ˜ธํ™”์™€ ๋ณตํ˜ธํ™”๋ฅผ ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

๊ตฌํ˜„ ๊ณผ์ •

ํ‚ค ๊ตฌํ˜„ ๋ฐฉ์‹ ์ž…๋ ฅ๋ฐ›๊ธฐ

printf("------------------------------------------------------------------\n");
printf("-----------------------------A5/1 ๊ตฌํ˜„------------------------------\n");
printf("ํ‚ค๋ฅผ ์ง์ ‘ ์ž…๋ ฅํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?(์ž…๋ ฅํ•˜์‹ค๊บผ๋ฉด 1, ๋žœ๋คํ•œ ํ‚ค๋Š” 2๋ฒˆ) -> ");
cin >> ans;
while(true){
    if(ans==1){
        char str[65];
        cin >> str;
        for(int i=0;i<64;i++){
            key[i]=str[i]-'0';
        }
        break;
    }
    else if(ans==2){
        srand((unsigned  int)time(0));
        for(int i=0;i<64;i++){
            key[i] = rand()%2;
        }
        cout << "๋žœ๋คํ•˜๊ฒŒ ์ƒ์„ฑ๋œ ํ‚ค ๊ฐ’์€ ";
        for(int i=0;i<64;i++) cout << key[i];
        cout << " ์ž…๋‹ˆ๋‹ค!\n";
        break;
    }
    else{
        printf("์ž˜ ๋ชป ์ž…๋ ฅํ•˜์…จ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”! -> ");
        cin >> ans;
        continue;
    }
}

์šฐ์„  ์‚ฌ์šฉ์ž๊ฐ€ ํ‚ค๋ฅผ ์ง์ ‘ ์ž…๋ ฅํ•˜๊ฑฐ๋‚˜ ๋žœ๋คํ•˜๊ฒŒ ์ƒ์„ฑ ๋œ ํ‚ค๋ฅผ ๋ฐ›๋Š” ๊ฒƒ์„ ์ž…๋ ฅ์„ ํ†ตํ•ด ์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

1๋ฒˆ์„ ์ž…๋ ฅํ•˜๋ฉด ํ‚ค๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๊ณ  2๋ฒˆ์„ ์ž…๋ ฅํ•˜๋ฉด ๋žœ๋ค ํ•œ ํ‚ค๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งŒ ์•ฝ 1์ด๋‚˜ 2๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์ˆ˜๊ฐ€ ์ž…๋ ฅ๋œ๋‹ค๋ฉด ์˜ฌ๋ฐ”๋ฅธ ์ž…๋ ฅ ๊ฐ’์„ ๋ฐ›์„ ๋•Œ๊นŒ์ง€ ์ž…๋ ฅ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ‰๋ฌธ ์ž…๋ ฅ๋ฐ›๊ธฐ

cout << "ํ‰๋ฌธ์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”! ";
char empty[2];
cin.getline(empty,2,'\n');
cin.getline(pText,1000,'\n');
sizeVal=strlen(pText);
int bitCnt=0;
for(int i=0;i<sizeVal;i++){
    for(int j=7;j>=0;j--){
        pTextBool[bitCnt] = bitset<8>(pText[i])[j];
        bitCnt++;
    }
}
sizeVal*=8;
makeKeySteam();

ํ‰๋ฌธ์„ ์ผ๋‹จ ๋ฌธ์ž์—ด๋กœ ์ž…๋ ฅ๋ฐ›์€ ๋’ค, boolํ˜• ํ‰๋ฌธ ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

๋ฌธ์ž์—ด ํ•˜๋‚˜ํ•˜๋‚˜๋ฅผ bitset ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด 8๋น„ํŠธ๋กœ ๋ณ€ํ™˜ํ•ด ์ฃผ๊ณ  bool ํ˜• ํ‰๋ฌธ ๋ฐฐ์—ด์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ๋’ค์— ํ‚ค์ŠคํŠธ๋ฆผ์„ ๋งŒ๋“œ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

ํ‚ค์ŠคํŠธ๋ฆผ ์ƒ์„ฑ ํ•จ์ˆ˜

void makeKeySteam(){
    int cnt = 0;
    int st =0;
    for(int i=0;i<64;i++){
        if(i==19 || i==41) cnt=0;
        if(i<19) x[cnt]=key[i];
        else if(i<41) y[cnt]=key[i];
        else z[cnt] = key[i];
        cnt++;
    }
    cnt=sizeVal;
    while(cnt--) {
        int maj = chkMaj(x[8], y[10], z[10]);
        if (x[8] == maj) excuteX();
        if (y[10] == maj) excuteY();
        if (z[10] == maj) excuteZ();
        keyStream[st] = x[18]^y[21]^z[22];
        st++;
    }
}

ํ‚ค์ŠคํŠธ๋ฆผ์„ ๋งŒ๋“œ๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

์šฐ์„  ์œ„์—์„œ ์ƒ์„ฑ๋œ ํ‚ค๊ฐ’์„ x,y,z์— ๋ถ„๋ฐฐ๋ฅผ ํ•ด์ค๋‹ˆ๋‹ค.

๊ทธ ๋’ค์— ๋‹ค์ˆ˜๊ฒฐ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ๋‹ค์ˆ˜๊ฒฐ ์ˆ˜๋ฅผ ๊ฒฐ์ •ํ•˜๊ณ  ๋‹ค์ˆ˜๊ฒฐ ์ˆ˜๋ฅผ ํ™•์ธํ•˜๋ฉฐ x,y,z๋ฅผ ํ™•์ธํ•ด ์ฃผ๊ณ  ๋‹ค์ˆ˜๊ฒฐ ํ•จ์ˆ˜์™€ ๊ฐ ํ•ด๋‹น ๋น„ํŠธ๊ฐ€ ์ผ์น˜ํ•œ๋‹ค๋ฉด ๊ฐ๊ฐ์—์„œ ํ•จ์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

maj ํ™•์ธ, excute X,Y,Z

bool chkMaj(bool x, bool y, bool z){
    int arr[2] = {0,0};
    arr[x]++;
    arr[y]++;
    arr[z]++;
    if(arr[1]>arr[0]) return true;
    return false;
}

void excuteX(){
    bool tempZero = x[13] ^  x[16] ^ x[17] ^ x[18];
    for(int i=19;i>0;i--){
        x[i]=x[i-1];
    }
    x[0]=tempZero;
}
void excuteY(){
    bool tempZero = y[20]^y[21];
    for(int i=21;i>0;i--){
        y[i] = y[i-1];
    }
    y[0] = tempZero;
}
void excuteZ(){
    bool tempZero = z[7]^z[20]^z[21]^z[22];
    for(int i=22;i>0;i--){
        z[i]=z[i-1];
    }
    z[0]=tempZero;
}

maj๋ฅผ ํ™•์ธํ•˜๋Š” ํ•จ์ˆ˜์™€ x,y,z์—์„œ ๋ณ€ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

ํ‚ค์ŠคํŠธ๋ฆผ ์ถœ๋ ฅ

cout << "์ƒ์„ฑ๋œ ํ‚ค์ŠคํŠธ๋ฆผ์€ ";
for(int i=0;i<sizeVal;i++){
    cout << keyStream[i];
}
cout << " ์ž…๋‹ˆ๋‹ค.\n\n";

์œ„์˜ makeKeyStream์„ ํ†ตํ•ด ์ƒ์„ฑ๋œ ํ‚ค์ŠคํŠธ๋ฆผ์„ ์ถœ๋ ฅํ•˜์—ฌ ์ฝ˜์†” ์ฐฝ์—์„œ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

์•”ํ˜ธํ™” ๋œ ์ด์ง„์ˆ˜, ๋ฌธ์ž ์ถœ๋ ฅ

cout << "ํ‚ค์ŠคํŠธ๋ฆผ์œผ๋กœ ์•”ํ˜ธํ™”๋ฅผ ํ•œ ์ด์ง„์ˆ˜๋Š” ";
for(int i=0;i<sizeVal;i++){
    cTextBool[i]=pTextBool[i]^keyStream[i];
    cout << cTextBool[i];
}
cout << " ์ž…๋‹ˆ๋‹ค.\n";
cout << "๊ธ€์ž๊ฐ€ ๊นจ์งˆ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์•”ํ˜ธํ™”๋กœ ๋œ ์ด์ง„์ˆ˜๋ฅผ ๋ฌธ์ž๋กœ ๋ฐ”๊พผ๋‹ค๋ฉด ";
bitCnt= 0;
int now = 0;
for(int i=0;i<sizeVal;i++){
    now+=cTextBool[i]*pow(2,7-bitCnt);
    bitCnt++;
    if(bitCnt==8){
        bitCnt=0;
        char pr = now;
        cout << pr;
        now=0;
    }
}
cout << "์ž…๋‹ˆ๋‹ค.\n";

ํ‚ค์ŠคํŠธ๋ฆผ์œผ๋กœ ์•”ํ˜ธํ™” ํ•œ ์ด์ง„์ˆ˜๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด ์œ„์—์„œ ๋งŒ๋“  bool ํ‰๋ฌธ ๋ฐฐ์—ด๊ณผ ํ‚ค์ŠคํŠธ๋ฆผ์„ xor ์—ฐ์‚ฐํ•˜์—ฌ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๋˜ ํ•œ ํ•ด๋‹น ๋ฐฐ์—ด์„ 8๋น„ํŠธ ๊ธฐ์ค€์œผ๋กœ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด 8๋น„ํŠธ ์”ฉ ๋‚˜๋ˆ ์„œ ๊ฐ ์ž๋ฆฌ์— ๋งž๋Š” ์ˆ˜๋ฅผ ๊ณฑํ•ด ์•„์Šคํ‚ค์ฝ”๋“œ๋กœ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

๋ณตํ˜ธํ™” ๋ฌธ์ž ์ถœ๋ ฅ

cout << "์ด๋ฅผ ๋‹ค์‹œ ๋ณตํ˜ธํ™” ํ•œ๋‹ค๋ฉด ";
bitCnt=0;
now=0;
for(int i=0;i<sizeVal;i++){
    finalTextBool[i]=cTextBool[i]^keyStream[i];
    now+=finalTextBool[i]*pow(2,7-bitCnt);
    bitCnt++;
    if(bitCnt==8){
        bitCnt=0;
        char pr = now;
        cout << pr;
        now=0;
    }
}
cout << " ์ž…๋‹ˆ๋‹ค.\n";

๋ณตํ˜ธํ™” ํ•˜๋Š” ๊ณผ์ •๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์œ„์—์„œ ๋งŒ๋“ค์—ˆ๋˜ ์•”ํ˜ธํ™”๋œ ์ด์ง„์ˆ˜์— ํ‚ค์ŠคํŠธ๋ฆผ์„ xor ์—ฐ์‚ฐํ•˜์—ฌ ๋‹ค์‹œ ๋ณตํ˜ธํ™” ํ•ฉ๋‹ˆ๋‹ค.
๋˜ ์ด ๋ณตํ˜ธํ™” ํ•œ ๋ฐฐ์—ด์„ ๋‹ค์‹œ 8๋น„ํŠธ ๊ธฐ์ค€์œผ๋กœ ๊ณ„์‚ฐํ•˜์—ฌ ์•„์Šคํ‚ค์ฝ”๋“œ๋กœ ์ถœ๋ ฅํ•ด ์ค๋‹ˆ๋‹ค.

์‹คํ–‰ํ™”๋ฉด

์ „์ฒด ์†Œ์Šค์ฝ”๋“œ

#include <iostream>
#include <algorithm>
#include <ctime>
#include <cmath>
#include <cstring>
#include <bitset>
using namespace std;
int keyStream[8001];
int ans;
bool key[64];
bool x[19];
bool y[22];
bool z[23];
char pText[8001];
bool pTextBool[8001];
bool cTextBool[8001];
bool finalTextBool[8001];
void excuteX();
void excuteY();
void excuteZ();
int sizeVal;
void makeKeySteam();
bool chkMaj(bool x,bool y, bool z);
int main(){
    printf("-----------------------------------------------------------------------------------------------------------\n");
    printf("--------------------------------------------------A5/1 ๊ตฌํ˜„--------------------------------------------------\n");
    printf("ํ‚ค๋ฅผ ์ง์ ‘ ์ž…๋ ฅํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?(์ž…๋ ฅํ•˜์‹ค๊บผ๋ฉด 1, ๋žœ๋คํ•œ ํ‚ค๋Š” 2๋ฒˆ) -> ");
    cin >> ans;
    while(true){
        if(ans==1){
            char str[65];
            cin >> str;
            for(int i=0;i<64;i++){
                key[i]=str[i]-'0';
            }
            break;
        }
        else if(ans==2){
            srand((unsigned  int)time(0));
            for(int i=0;i<64;i++){
                key[i] = rand()%2;
            }
            cout << "๋žœ๋คํ•˜๊ฒŒ ์ƒ์„ฑ๋œ ํ‚ค ๊ฐ’์€ ";
            for(int i=0;i<64;i++) cout << key[i];
            cout << " ์ž…๋‹ˆ๋‹ค!\n";
            break;
        }
        else{
            printf("์ž˜ ๋ชป ์ž…๋ ฅํ•˜์…จ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”! -> ");
            cin >> ans;
            continue;
        }
    }
    cout << "ํ‰๋ฌธ์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”! ";
    char empty[2];
    cin.getline(empty,2,'\n');
    cin.getline(pText,1000,'\n');
    sizeVal=strlen(pText);
    int bitCnt=0;
    for(int i=0;i<sizeVal;i++){
        for(int j=7;j>=0;j--){
            pTextBool[bitCnt] = bitset<8>(pText[i])[j];
            bitCnt++;
        }
    }
    sizeVal*=8;
    makeKeySteam();
    cout << "์ƒ์„ฑ๋œ ํ‚ค์ŠคํŠธ๋ฆผ์€ ";
    for(int i=0;i<sizeVal;i++){
        cout << keyStream[i];
    }
    cout << " ์ž…๋‹ˆ๋‹ค.\n\n";
    cout << "ํ‚ค์ŠคํŠธ๋ฆผ์œผ๋กœ ์•”ํ˜ธํ™”๋ฅผ ํ•œ ์ด์ง„์ˆ˜๋Š” ";
    for(int i=0;i<sizeVal;i++){
        cTextBool[i]=pTextBool[i]^keyStream[i];
        cout << cTextBool[i];
    }
    cout << " ์ž…๋‹ˆ๋‹ค.\n";
    cout << "๊ธ€์ž๊ฐ€ ๊นจ์งˆ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์•”ํ˜ธํ™”๋กœ ๋œ ์ด์ง„์ˆ˜๋ฅผ ๋ฌธ์ž๋กœ ๋ฐ”๊พผ๋‹ค๋ฉด ";
    bitCnt= 0;
    int now = 0;
    for(int i=0;i<sizeVal;i++){
        now+=cTextBool[i]*pow(2,7-bitCnt);
        bitCnt++;
        if(bitCnt==8){
            bitCnt=0;
            char pr = now;
            cout << pr;
            now=0;
        }
    }
    cout << "์ž…๋‹ˆ๋‹ค.\n";

    cout << "์ด๋ฅผ ๋‹ค์‹œ ๋ณตํ˜ธํ™” ํ•œ๋‹ค๋ฉด ";
    bitCnt=0;
    now=0;
    for(int i=0;i<sizeVal;i++){
        finalTextBool[i]=cTextBool[i]^keyStream[i];
        now+=finalTextBool[i]*pow(2,7-bitCnt);
        bitCnt++;
        if(bitCnt==8){
            bitCnt=0;
            char pr = now;
            cout << pr;
            now=0;
        }
    }
    cout << " ์ž…๋‹ˆ๋‹ค.\n";

}
void makeKeySteam(){
    int cnt = 0;
    int st =0;
    for(int i=0;i<64;i++){
        if(i==19 || i==41) cnt=0;
        if(i<19) x[cnt]=key[i];
        else if(i<41) y[cnt]=key[i];
        else z[cnt] = key[i];
        cnt++;
    }
    cnt=sizeVal;
    while(cnt--) {
        int maj = chkMaj(x[8], y[10], z[10]);
        if (x[8] == maj) excuteX();
        if (y[10] == maj) excuteY();
        if (z[10] == maj) excuteZ();
        keyStream[st] = x[18]^y[21]^z[22];
        st++;
    }
}

bool chkMaj(bool x, bool y, bool z){
    int arr[2] = {0,0};
    arr[x]++;
    arr[y]++;
    arr[z]++;
    if(arr[1]>arr[0]) return true;
    return false;
}

void excuteX(){
    bool tempZero = x[13] ^  x[16] ^ x[17] ^ x[18];
    for(int i=19;i>0;i--){
        x[i]=x[i-1];
    }
    x[0]=tempZero;
}
void excuteY(){
    bool tempZero = y[20]^y[21];
    for(int i=21;i>0;i--){
        y[i] = y[i-1];
    }
    y[0] = tempZero;
}
void excuteZ(){
    bool tempZero = z[7]^z[20]^z[21]^z[22];
    for(int i=22;i>0;i--){
        z[i]=z[i-1];
    }
    z[0]=tempZero;
}

'๋ณด์•ˆ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

์ฟ ํ‚ค-์„ธ์…˜, JWT ํ† ํฐ ์ธ์ฆ  (0) 2022.03.17
Bcrypt ์ธ์ฝ”๋”ฉ  (0) 2022.03.15
์•”ํ˜ธํ™” ํ•ด์‹œ ํ•จ์ˆ˜  (0) 2022.03.13