Caesar cipher는 고대 로마 황제 Julius Caesar가 만든 기본적은 substitution cipher를 말한다.
카이사르 또는 시져라고 읽는다.
http://hypertimespace.tistory.com/150
이전 암호포스트에서 언급한 적 있다.
쓰기 귀찮으니까 글을 옮겨오자면...
암호화는 간단하다. 알파벳을 순환고리라고 생각하고 n번 만큼 알파벳을 옮기면 된다.
n=3
p = ABCZYX
이라고 하면,
c = E_3(p)= DEFCBA
가 된다.
복호는 -n만큼 알파벳을 옮기면 되므로,
d=DEFCBA라고 하면,
p = D_n(c) = ABCZYX
를 얻을 수 있다.
물론 여기서 E_n^-1 = D_n = E_(-n) 이다.
n=3
p = ABCZYX
이라고 하면,
c = E_3(p)= DEFCBA
가 된다.
복호는 -n만큼 알파벳을 옮기면 되므로,
d=DEFCBA라고 하면,
p = D_n(c) = ABCZYX
를 얻을 수 있다.
p = ABCZYX
n = 3 (Caesar cipher)
c = E_3(p) = DEFCBA
n = 3 (Caesar cipher)
c = E_3(p) = DEFCBA
물론 여기서 E_n^-1 = D_n = E_(-n) 이다.
이게 시저암호다.
이것을 C로 구현해 보자. (C++은 아직 공부 시작도 안했다.....ㅋㅋ)
#include <stdio.h>
int main(void)
{
char code[100];
int i=0,j=1;
printf("문장을 입력해 주세요. \n>");
gets(code);
printf("\n%s을 입력하셨습니다.\n\n",code);
for(;j<26;j++,i=0)
{
for(;code[i]!='\0';i++)
code[i]=decrypt(code, i, j);
printf("%d 번 위치를 이동시킨 코드 결과:\n%s\n",j,code);
}
return 0;
}
int decrypt(char code[100], int i, int j)
{
if((64<code[i] && code[i]<91)||(96<code[i]&&code[i]<123))
{
code[i]++;
if(code[i]==91)
code[i]-=26;
if(code[i]==123)
code[i]-=26;
}
return code[i];
}
{
char code[100];
int i=0,j=1;
printf("문장을 입력해 주세요. \n>");
gets(code);
printf("\n%s을 입력하셨습니다.\n\n",code);
for(;j<26;j++,i=0)
{
for(;code[i]!='\0';i++)
code[i]=decrypt(code, i, j);
printf("%d 번 위치를 이동시킨 코드 결과:\n%s\n",j,code);
}
return 0;
}
int decrypt(char code[100], int i, int j)
{
if((64<code[i] && code[i]<91)||(96<code[i]&&code[i]<123))
{
code[i]++;
if(code[i]==91)
code[i]-=26;
if(code[i]==123)
code[i]-=26;
}
return code[i];
}
뭐 별로 어렵지 않다.
프로그래밍에 투자할 시간은 별로 없지만, 그래도 책 하나 사서 보고 있다. 그래야지 뭐라도 좀 알 수 있겠더라..ㅋㅋ
코드를 해석해 보자.
#include <stdio.h> // stdio라는 이름의 헤더 파일을 불러온다. 기본적인 함수들이 들어가 있다.
int main(void) // integer형태(처음 봤을 땐 initial인줄 알았지ㅋㅋ)를 return하는 main이라는 이름의 함수다. argument는 없다. main이라는 함수는 컴파일 할 때 자동으로 먼저 불러온다.
{
char code[100]; // character 변수 설정.
int i=0,j=1; // integer 변수 설정.
printf("문장을 입력해 주세요. \n>");
gets(code); // 입력값 받음.
printf("\n%s을 입력하셨습니다.\n\n",code);
for(;j<26;j++,i=0) // 이제부터 하나하나 알파벳을 돌리는 거닼ㅋ
{
for(;code[i]!='\0';i++) // 입력값들을 하나하나 분석한다. null 문자(마지막에 붙는)가 올 때가지 반복.
code[i]=decrypt(code, i, j); // decrypt 함수를 사용한다. 변수는 3개ㅋ
printf("%d 번 위치를 이동시킨 코드 결과:\n%s\n",j,code); // 결과값 출력.
}
return 0; // 함수 종료.
}
int decrypt(char code[100], int i, int j) // decrypt 함수 set. interger 형태 반환, 변수는 code, i, j 3개.
{
if((64<code[i] && code[i]<91)||(96<code[i]&&code[i]<123)) // code의 문자가 영어 대문자와 소문자일 경우.
{
code[i]++; // 그 값을 1개씩 증가. (아스키값)
if(code[i]==91) // Z에서 1개 증가할 경우.
code[i]-=26; // A값으로.
if(code[i]==123)
code[i]-=26;
}
return code[i]; // 결과값 return.
}
{
char code[100]; // character 변수 설정.
int i=0,j=1; // integer 변수 설정.
printf("문장을 입력해 주세요. \n>");
gets(code); // 입력값 받음.
printf("\n%s을 입력하셨습니다.\n\n",code);
for(;j<26;j++,i=0) // 이제부터 하나하나 알파벳을 돌리는 거닼ㅋ
{
for(;code[i]!='\0';i++) // 입력값들을 하나하나 분석한다. null 문자(마지막에 붙는)가 올 때가지 반복.
code[i]=decrypt(code, i, j); // decrypt 함수를 사용한다. 변수는 3개ㅋ
printf("%d 번 위치를 이동시킨 코드 결과:\n%s\n",j,code); // 결과값 출력.
}
return 0; // 함수 종료.
}
int decrypt(char code[100], int i, int j) // decrypt 함수 set. interger 형태 반환, 변수는 code, i, j 3개.
{
if((64<code[i] && code[i]<91)||(96<code[i]&&code[i]<123)) // code의 문자가 영어 대문자와 소문자일 경우.
{
code[i]++; // 그 값을 1개씩 증가. (아스키값)
if(code[i]==91) // Z에서 1개 증가할 경우.
code[i]-=26; // A값으로.
if(code[i]==123)
code[i]-=26;
}
return code[i]; // 결과값 return.
}
끝?
끝.
좀 불친절한데? ㅋㅋ
이렇게 총 25번을 반복한다는 거...
영문자만 변환.
'★ 수학 이야기 > ▣ 플밍 이야기' 카테고리의 다른 글
2진수로 데이터 표현 (1) | 2011.06.03 |
---|---|
2진수 (0) | 2011.06.02 |
ASCII(American Standard Code for Information Interchange) tables (0) | 2011.06.02 |
원주율 근사 (0) | 2011.01.02 |