信息加密之Transposition Cipher(变位密码)
来源:互联网 发布:北京航空航天大学网络 编辑:程序博客网 时间:2024/05/21 21:36
变位密码是一种简单的对称加密方法,
加密原理:
(1)确定密钥(加密、解密使用同一密钥)。
(2)对密钥中的字符进行排序。
(3)将明文放到一个行宽为strlen(密钥)的矩阵中,补足则用a、b、c、d...补足生成明文矩阵。
(4)根据密钥中字符的次序(Ascii码)依次以列的形式将明文矩阵的内容读到一数组中,生成密文。
解密原理:
(1)确定密钥(加密、解密使用同一密钥)。
(2)对密钥中的字符进行排序。
(3)将密文存放到一个列长为strlen(密钥)的矩阵中,生成密文矩阵。
(4)根据密钥中字符的次序(Ascii码)依次以行的形式将密文矩阵的内容读到一个数组中,生成解密后的明文。
运行结果:
代码:
// 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);
//定义密钥中字母的排列顺序的数组rank
int* rank = new int[keyLength];
//flag用于在对密钥的字母进行排序时判断该字母是否已经被确定位置
int* flag = new int[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, 宽=col
char** temp_string = new char*[row];
for(int i=0;i<row;i++)
temp_string[i] = new char[col];
//定义密文
char* Ciphertext = new char[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*col
char** dec = new char*[row];
for(int i = 0 ; i < row ; i ++)
dec[i] = new char[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();
return 0;
}
//
#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);
//定义密钥中字母的排列顺序的数组rank
int* rank = new int[keyLength];
//flag用于在对密钥的字母进行排序时判断该字母是否已经被确定位置
int* flag = new int[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, 宽=col
char** temp_string = new char*[row];
for(int i=0;i<row;i++)
temp_string[i] = new char[col];
//定义密文
char* Ciphertext = new char[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*col
char** dec = new char*[row];
for(int i = 0 ; i < row ; i ++)
dec[i] = new char[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();
return 0;
}
- 信息加密之Transposition Cipher(变位密码)
- 加密---Cipher
- 密码学学习(二) 置换加密算法(Transposition Cipher)及python实现
- 信息安全之仿射密码加密和解密
- JAVA加密解密之凯撒加密(Caesar cipher)算法
- bzoj1031 字符加密Cipher
- [JSOI2007]字符加密Cipher
- [BZOJ1031]字符加密Cipher
- java Cipher加密、解密
- cipher加密解密
- [JSOI2007]字符加密Cipher
- Caesers Cipher (凯撒密码)
- 信息安全加密技术--凯撒密码
- 信息安全加密技术---维吉尼亚密码
- 信息安全加密技术--Polybius密码
- 第四十九篇: JAVA加密解密之凯撒加密(Caesar cipher)算法
- iPad 开发之-- 密码加密
- 登录 之 密码加密处理
- 奇怪的strcore.cpp内存泄露
- [C] 一个要注意的输入输出问题
- 工作学习笔记
- 幽默:老公和老婆斗智
- asp.net中将Excel文件(.xls)绑定到DataGrid!
- 信息加密之Transposition Cipher(变位密码)
- 用vs2005编译器cl在控制台下编译
- Python数据库操作手册
- Python 手册
- 三本新书(包含新系列)隆重上市
- 约瑟夫(josephus)环算法实现
- 利用php DOM函数库创建xml文档
- 刚来报到!
- 集成开发环境 (IDE) 设置