전치암호는 단순히 평문의 문자순서를 정해진 순서에 따라 재 배열한것. 
만약 모자라는 부분은 임의이 문자로 대치한다.

정해진 순서가 있기때문에 키값을 정해 순열을 정할수 있다.
예를들어 1 2 3 4 5 6 7 이란 순서를
3 4 5 7 1 6 4 2 이렇게 뒤집는다는 소리다.
만약 총 글자의 수가 7로 나누어 떨어지지 않는다면 빈 자리가 있을수 있기때문에 그 자리를 임의의 문자나 무언가로 대치한다.

평문 : My name is Peace

암호문 :  aeMmnysPa e ixxxcxxe 

복호문 : My name is Peace

C++ 코드

#define BLOCK_SIZE 7

#include <iostream>


using namespace std;


int main()

{

    int i,j,size, block_num;

    int key[64]={3,5,7,1,6,4,2};

    char p_text[64], c_text[64],d_text[64];

    

    cout<<"평문 입력 : ";

    gets(p_text);

    

    size=strlen(p_text);

    

    if(size%BLOCK_SIZE>0)

    {

        block_num = strlen(p_text) / BLOCK_SIZE +1;

        

        for(i=strlen(p_text);i<block_num*BLOCK_SIZE;i++)

            p_text[i]='x';

    }

    else

        block_num = strlen(p_text) /BLOCK_SIZE;

    

    for(i = 0;i<block_num;i++)

        for(j=0;j<BLOCK_SIZE;j++)

            c_text[i*BLOCK_SIZE+j] = p_text[(key[j]-1)+i*BLOCK_SIZE];

    

    cout<<"암호문 : ";

    for(i=0;i<block_num*BLOCK_SIZE;i++)

        cout<<c_text[i];

    cout<<endl;

    

    for(i=0;i<block_num;i++)

        for(j=0;j<BLOCK_SIZE;j++)

            d_text[(key[j]-1)+i*BLOCK_SIZE] = c_text[i*BLOCK_SIZE+j];

    

    cout<<"복호문 : ";

    for(i=0;i<size;i++)

        cout<<d_text[i];

    cout<<endl;


}

 

'정보 보안' 카테고리의 다른 글

Vigenere 암호(Vigenere cipher)  (0) 2011.05.21
단일 대치 암호(mono-alphabetic substitution cipher)  (0) 2011.05.21
시저 암호(Caesar cipher)  (0) 2011.05.21

+ Recent posts