다중 문자 대치 암호로써 하나의 펴문 문자가 여러 개의 암호로 대치 될 수 있다.
대치 될때 그 순서에 따라 즉, 비밀키 열(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;

    

} 

+ Recent posts