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

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

    

} 
말 그대로 글자 하나하나를 다른 알파벳으로 대치해서 암호화하는 것.
예전에 한글을 만들어서 사용해 봤으나 1시간만에 친구에게 해독되었다.......

전수 조사 공격에는 비교적 강인한 특성을 가지지만 이렇게 출현 빈도수를 따라 통계학 적인 방법으로 분석하면 비밀 키를 찾아내는 것이 어렵지만은 않다. 

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

전치암호(transposition chipher)  (0) 2011.05.21
Vigenere 암호(Vigenere cipher)  (0) 2011.05.21
시저 암호(Caesar cipher)  (0) 2011.05.21
 가장 오래된 암호중 하나.
 줄리어스 시저(Julius Caesar)가 사용하여 그 이름이 유래.
 
 가장 대표적인 대치 암호(substitution cipher)

평문 문자를 다르 문자로 일대일 대응시켜 암호문을 만들어 내는 방식.

 
 a  0  n  13
 b  1  o  14
 c  2  p  15
 d  3 q  16
 e  4  r  17
 f  5  s  18
 g  6  t  19
 h  7  u  20
 i  8  v  21
 j  9  w 22 
 k  10  x  23
 l  11  y  24
 m 12   z  25

 영문 문자에 번호를 0부터 25까지 부여하여 이 문자를 비밀키와 조합하여 법연산하는 것이 특징.

만약 암호용 비밀키가 k라고 가정하고 평문은 p 암호문이 c라고 하면

c = p+k mod 26
m = c - k mod 26

이 되는 것이다.

여기서 시저 암호의 키는 평문의 시프트 간격인 k 가 되고 mod 26이란 모듈러 연산으로 합의 값을 다시 26으로 나눈 나머지 값을 의미한다.

ex

평문 :: My name is Peace
비밀 키 :: 6
암호문 ::  Se tgsk oy Vkgik
복호 키 ::-6
복호 문 :: My name is Peace

C++로 만들어진 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
#include <cstring>
 
using namespace std;
 
int main()
{
    int i=0, key=0, str_size=0;
    char str[50={0,};
 
    cout<<"평문 또는 암호문을 입력하시오 "<<endl;
    gets(str); // Enter가 들어올때까지 입력을 받기위해 gets를 사용했다.    
 
    cout<<"키 값을 입력하세요 : ";
    cin>>key;    
 
    str_size=strlen(str); // 평문, 암호문의 길이를 구한다.    
 
    for(i=0;i<str_size;i++)
    {
        if((str[i]>='a')&&(str[i]<='z'))
        {
            str[i]-='a';
 
            if((str[i]+key) <0)
                str[i]+=26;            
 
            str[i] =(str[i]+key)%26;
            str[i]+='a';
        }        
 
        if((str[i] >='A')&&(str[i]<='Z'))
        {
            str[i]-='A';
 
            if((str[i]+key)<0)
                str[i]+=26;            
 
            str[i]=(str[i]+key)%26;
            str[i]+='A';
        }
    }    
 
    cout<<endl<<"암호화 또는 복호화된 결과 출력 : "<<str<<endl;
 
    return 0;
 
 
 
cs




+ Recent posts