[C언어 소스] 비제네르 암호(Vigenere Chiper)
//비제네르 암호(Vigenere Chipher)
#include <stdio.h>
#include <ctype.h>
#include <string.h>
char *encrypt(char *dest, const char *src, const char *key);
char *decrypt(char *dest, const char *encryptstr, const char *key);
int main(void)
{
char source[100] = "Welcome! Here is ehclub.net";
char en_str[100];
char de_str[100];
printf("source: %s\n", source);
encrypt(en_str, source, "hello");
printf("encrypted: %s\n", en_str);
decrypt(de_str, en_str, "hello");
printf("decrypted: %s\n", de_str);
return 0;
}
char *encrypt(char *dest, const char *src, const char *key)
{
char *origin;
int len = strlen(key);
int cnt = 0;
for (origin = dest; *src; dest++, src++)//종료 문자를 만날 때까지 반복
{
if (isupper(*src))//대문자일 때
{
//(key[cnt]-'a')칸 밀기
*dest = (*src - 'A' + (key[cnt] - 'a')) % 26 + 'A';
}
if (islower(*src))//소문자일 때
{
//(key[cnt]-'a')칸 밀기
*dest = (*src - 'a' + (key[cnt] - 'a')) % 26 + 'a';
}
if (isdigit(*src))//숫자 문자일 때
{
//(key[cnt]-'a')칸 밀기
*dest = (*src - '0' + (key[cnt] - 'a')) % 10 + '0';//3칸 밀기(0->3)
}
if (isalnum(*src) == 0)
{
*dest = *src;
}
cnt = (cnt + 1) % len;
}
*dest = '\0';
return origin;
}
char *decrypt(char *dest, const char *encryptstr, const char *key)
{
char *origin;
int len = strlen(key);
int cnt = 0;
for (origin = dest; *encryptstr; dest++, encryptstr++)//종료 문자를 만날 때까지 반복
{
if (isupper(*encryptstr))//대문자일 때
{
//(26 -(key[cnt] - 'a'))칸 밀기 => (key[cnt]-'a')칸 당기기
*dest = (*encryptstr - 'A' + (26 - (key[cnt] - 'a'))) % 26 + 'A';
}
if (islower(*encryptstr))//소문자일 때
{
//(26 -(key[cnt] - 'a'))칸 밀기 => (key[cnt]-'a')칸 당기기
*dest = (*encryptstr - 'a' + (26 - (key[cnt] - 'a'))) % 26 + 'a';
}
if (isdigit(*encryptstr))//숫자 문자일 때
{
//(26 -(key[cnt] - 'a'))칸 밀기 => (key[cnt]-'a')칸 당기기
*dest = (*encryptstr - '0' + (26 - (key[cnt] - 'a'))) % 10 + '0';
}
if (isalnum(*encryptstr) == 0)
{
*dest = *encryptstr;
}
cnt = (cnt + 1) % len;
}
*dest = '\0';
return origin;
}
'C언어 > C언어 예제' 카테고리의 다른 글
[C언어 소스] puts 함수와 printf 함수 비교 예 (0) | 2016.04.18 |
---|---|
[C언어 소스] putchar 함수 사용 예 (0) | 2016.04.18 |
[C언어 소스] 시저 암호(Caesar cipher, 카이사르 암호) (0) | 2016.04.13 |
[C언어 소스] 기수 정렬(Radix Sort) 알고리즘 (0) | 2016.04.13 |
[C언어 소스] 계수 정렬(Counter Sort) 알고리즘 (0) | 2016.04.13 |