1. 程式人生 > >資訊加密之Transposition Cipher(變位密碼)

資訊加密之Transposition Cipher(變位密碼)

// TranspositionCipher.cpp : 定義控制檯應用程式的入口點。
//

#include 
"stdafx.h"
#include 
<stdio.h>
#include 
<string.h>//金鑰長度int keyLength;
//金鑰char* key ="Hello World";
//明文用'|'來代表結束符char* Plaintext ="Hello, my name is lauvenman|";
//在矩陣不能排滿時用temptext補足char* temptext ="abcdefghijklmn";

int main()
{
     
//初始化金鑰長度     keyLength 
= strlen(key);
     
//定義金鑰中字母的排列順序的陣列rankint* rank =newint[keyLength];
     
//flag用於在對金鑰的字母進行排序時判斷該字母是否已經被確定位置int* flag =newint[keyLength];

     
for(int i =0 ; i < keyLength; i++)
         flag[i] 
=0;
         
    
//將key中的字母進行排序for(int i =0 ; i < keyLength; i++)
        {
            
int temp_rank_flag1;
            
int rank_flag;
            
char min_char;
            
            
for(int k =0 ; k < keyLength ; k++)
                {
                    
//找一個還沒被確定位置的字母if(flag[k] ==0)
                        {
                            min_char 
= key[k];
                            rank_flag 
= k;
                            temp_rank_flag1 
= k;
                            
break;
                        }
                }
                
            
for(int j =0 ; j < keyLength; j++)
                {
                     
//如果找到一個比現在的min_char小,並且它還沒被選中過的金鑰中的字母時if(min_char > key[j] && flag[j] ==0)
                        {
                              
//重新賦值min_char更小的字母                              min_char = key[j];
                              
//記錄此時最小字母的下標                              rank_flag = j;
                              temp_rank_flag1 
= j;
                        }
                }
           
           
//得到其在金鑰中字母排序後的位置           rank[rank_flag] = i+1;
           
//將其flag設成1           flag[temp_rank_flag1] =1;
        }
      
        
//宣告矩陣的空間int col = keyLength;
        
int row = strlen(Plaintext) / keyLength;
        
if(strlen(Plaintext) % keyLength !=0)
            row
++;
        
        
//定義用於存放明文的矩陣temp_string(動態生成),長=row, 寬=colchar** temp_string =newchar*[row];
        
for(int i=0;i<row;i++)
            temp_string[i] 
=newchar[col];
        
        
//定義密文char* Ciphertext =newchar[row*col];

        
//將明文資訊轉換到矩陣當中int temptext_flag =0;
        
for(int i =0; i < row; i++)
            {
                
for(int j =0; j < col; j++)
                    {
                        
if( i*keyLength+< (strlen(Plaintext)) )
                            temp_string[i][j] 
= Plaintext[i*(keyLength)+j];
                        
else
                            {
                                 temp_string[i][j] 
= temptext[temptext_flag];
                                 temptext_flag
++;
                            }
                    }
            }


       printf(
" 明文是長度: %d",strlen(Plaintext)-1);
       printf(
" 明文是: ");
       
for(int i =0 ; i < strlen(Plaintext) ; i++)
            {
                 printf(
"%c",Plaintext[i]);
            }

       printf(
" 金鑰是: ");
       
for(int i =0; i < keyLength; i++)
           {
               printf(
"%c",key[i]);
           }
           
       printf(
" 金鑰排序 ");
       
for(int i =0 ; i < keyLength ; i++)
            printf(
"%c ",key[i]);
            printf(
"");
       
for(int i =0 ; i < keyLength ; i++)
            printf(
"%d ",rank[i]);
       printf(
"");

       printf(
" 明文矩陣(row = %d , col = %d) ",row,col);
       
for(int i =0; i < row; i++)
           {
                
for(int j =0; j < col; j++)
                     {
                         printf(
"%c ",temp_string[i][j]);
                     }
                 printf(
"");
           }

       
/*加密*/
       printf(
" 密文是:  ");
       
int full =0;
       
for(int i =0 ; i < keyLength ; i++)
            {
                 
for(int j =0 ; j < keyLength ; j ++)
                    {    
                        
//按金鑰字母排序的順序將明文矩陣轉換成密文if(rank[j] == i+1)
                            {
                                
for(int k =0 ; k < row; k++)
                                    {
                                        Ciphertext[full] 
= temp_string[k][j];
                                        printf(
"%c",Ciphertext[full]);
                                        full
++;
                                    }
                            }
                    }
            }
        printf(
"");

        printf(
" 密文矩陣(row = %d , col = %d) ",col,row);
        
for(int j =0; j < row*col; j++)
            {
                printf(
"%c ",Ciphertext[j]);
                
if(j%row == row-1  )
                    printf(
"");
            }

        
        
//定義解密後的明文(動態生成),長度是row*colchar** dec =newchar*[row];
        
for(int i =0 ; i < row ; i ++)
            dec[i] 
=newchar[col];
        
        
/*解密*///此處由於只是用於演示所以就沒有重新對金鑰進行排序
        
//直接使用上面的排序結果for(int i =0 ; i < keyLength ; i++)
            {
                
//將密文以行的形式放到解密後明文的行中for(int j =0 ; j < row ; j++)
                    {
                        dec[j][i] 
= Ciphertext[(rank[i]-1* row + j];
                    }
            }
        

        printf(
" 解密後的明文 ");
        
for(int i =0 ; i < row ; i++)
            {
                
for(int j =0 ; j < col ; j++)
                    {
                       
if(dec[i][j] =='|')
                           
goto endPrint;
                       printf(
"%c",dec[i][j]) ;

                    }
            }
        endPrint:
            printf(
"");

    getchar();
   
return0;
}