資訊加密之Transposition Cipher(變位密碼)
阿新 • • 發佈:2018-12-26
// 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+j < (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;
}
//
#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
//定義金鑰中字母的排列順序的陣列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;
char min_char;
for(int k =0 ; k < keyLength ; k++)
{
//找一個還沒被確定位置的字母if(flag[k] ==0)
{
min_char = key[k];
rank_flag = k;
temp_rank_flag1
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+j < (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;
}