'C'에 해당되는 글 1건

  1. 2011.02.03 [C/C++] Caesar cipher

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
를 얻을 수 있다.

p = ABCZYX
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];
}

뭐 별로 어렵지 않다.

프로그래밍에 투자할 시간은 별로 없지만, 그래도 책 하나 사서 보고 있다. 그래야지 뭐라도 좀 알 수 있겠더라..ㅋㅋ
코드를 해석해 보자.

#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.
}

끝?

끝.

좀 불친절한데? ㅋㅋ



이렇게 총 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
Posted by White Joker