대치 될때 그 순서에 따라 즉, 비밀키 열(stream)에 의해 달라진다.
프랑스의 암호학자 B. Vigenere가 고안하여 이런 이름이 붙여 졌다.
이 암호 방식은 대치표의 개수를 d라 하면 다중 대치 암호방식은 주기 d를 갖는다. 다중 대치 암호에서 비밀키는 k1, k2 부터 kd까지 있고 평문 m1, m2부터 md, md+1, md+2 이렇게 있으면 암호 키열에 따라 d의 주기로 이 키열의 암호문이 변경된다.
평문 :: My name is Peace
키 값 :: diffcode
암호문 ::
Vg scah la Agofi
복문 :: My name is Peace
C++ 코드
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
int i=0,j=0,key_size=0, str_size=0, select=0;
char str[50] ={0,};
char key[16]={0,};
cout<<"평문 또는 암호문을 입력하시오 "<<endl;
gets(str);
cout<<"암호문은 1번 복호는 2번 : ";
cin>>select;
fflush(stdin);
cout<<"키 값입력 : ";
cin>>key;
str_size= strlen(str);
key_size= strlen(key);
for(i=0;i<str_size;i++)
{
j=i % key_size;
if(select==1){
if((str[i]>='a')&&(str[i]<='z'))
{
str[i]-='a';
key[j]-='a';
if((str[i]+key[j]) <0)
str[i]+=26;
str[i] =(str[i]+key[j])%26;
str[i]+='a';
key[j]+='a';
}
if((str[i] >='A')&&(str[i]<='Z'))
{
str[i]-='A';
key[j]-='A';
if((str[i]+key[j])<0)
str[i]+=26;
str[i]=(str[i]+key[j])%26;
str[i]+='A';
key[j]+='A';
}
}
if(select == 2)
{
if((str[i]>='a')&&(str[i]<='z'))
{
str[i]-='a';
key[j]-='a';
if((str[i]-key[j]) <0)
str[i]+=26;
str[i] =(str[i]-key[j])%26;
str[i]+='a';
key[j]+='a';
}
if((str[i] >='A')&&(str[i]<='Z'))
{
str[i]-='A';
key[j]-='A';
if((str[i]-key[j])<0)
str[i]+=26;
str[i]=(str[i]-key[j])%26;
str[i]+='A';
key[j]+='A';
}
}
}
cout<<endl<<"암호화 또는 복호화된 결과 출력 : "<<str<<endl;
return 0;
}
'정보 보안' 카테고리의 다른 글
전치암호(transposition chipher) (0) | 2011.05.21 |
---|---|
단일 대치 암호(mono-alphabetic substitution cipher) (0) | 2011.05.21 |
시저 암호(Caesar cipher) (0) | 2011.05.21 |