古典密码算法-置换算法基于vc++6.0

原理:

置换密码通过改变明文消息各元素的相对位置,但明文消息元素本身的取值或内容形式不变;

矩阵换位法是实现置换密码的一种常用方法。它将明文中的字母按照给定的顺序安排在一个矩阵中,然后用根据密钥提供的顺序重新组合矩阵中的字母,从而形成密文。          

如:Plain: THESIMPLESTPOSSIBLETRANSPOSITIONSXX

Key (R):    2  5  4  1  3     注意:分成5

Key (W):                                 4  1  5  3  2

               T  H  E  S  I         S  T  I  E  H
               M  P  L  E  S        E  M S  L   P
               T  P  O  S  S         S  T  S O   P
               I  B  L  E  T         E  I  T  L  B
               R  A  N  S  P        S  R  P  N  A
               O  S  I  T  I         T  O  I  I  S

O  N  S  X  X        X  O  X  S  N
 

Cipher: STIEH EMSLP STSOP EITLB SRPNA TOIIS XOXSN

其解密过程是根据密钥的字母数作为列数,将密文按照列、行的顺序写出,再根据由密钥给出的矩阵置换产生新的矩阵,从而恢复明文。

内容:

加密消息:we are all togeher:

1.要求使用4行*4列的双重置换密码,使用行置换:(1,2,3,4)→(2,4,1,3)和列置换:(1,2,3,4)→(3,1,2,4) 编写置换密码算法的实现程序,实现加密和解密操作。

全部代码如下:(代码比较简易)

#include<stdio.h>
#include<cstring>
#include<cstdlib>
void encrypt()
{
	int i,j,s,m=0;
	char l[20];
	char W[4][4];
	char z[4][4];
	int  R1[4],R2[4];
	printf("请输入明文\n");
	gets(l);
	printf("请输入行置换密码:\n");
	for(i=0;i<4;i++)
		scanf("%d",&R1[i]);
	printf("请输入列置换密码:\n");
	for(i=0;i<4;i++)
		scanf("%d",&R2[i]);
	for(i=0;i<4;i++)
		for(j=0;j<4;j++)
		{	W[i][j]=l[m++];
			z[i][j]=W[i][j];}
	//行置换
	for(i=0;i<4;i++)
	{
		for(j=0;j<4;j++){
			s=R1[i]-1;
			W[i][j]=z[s][j];
		}
	}
	for(i=0;i<4;i++)
		for(j=0;j<4;j++)
			z[i][j]=W[i][j];
	//列置换
	for(i=0;i<4;i++)
	{
		for(j=0;j<4;j++){
			s=R2[i]-1;
			W[j][i]=z[j][s];
		}
	}
	for(i=0;i<4;i++)
	{
		for(j=0;j<4;j++)
			printf("%c",W[i][j]);
	}
	printf("\n");
}
void decrypt()
{
    int i,j,s,m=0;
	char x[20];
	char W[4][4];
	char z[4][4];
	int  R3[4],R4[4];
	printf("请输入密文\n");
	gets(x);
	printf("请输入行置换密码:\n");
	for(i=0;i<4;i++)
		scanf("%d",&R3[i]);
	printf("请输入列置换密码:\n");
	for(i=0;i<4;i++)
		scanf("%d",&R4[i]);
	for(i=0;i<4;i++)
		for(j=0;j<4;j++)
		{	W[i][j]=x[m++];
			z[i][j]=W[i][j];}
	//列置换
	for(i=0;i<4;i++)
	{
		for(j=0;j<4;j++){
			s=R4[i]-1;
			W[j][s]=z[j][i];
		}
	}
	for(i=0;i<4;i++)
		for(j=0;j<4;j++)
			z[i][j]=W[i][j];
	//行置换
	for(i=0;i<4;i++)
	{
		for(j=0;j<4;j++){
			s=R3[i]-1;
			W[s][j]=z[i][j];
		}
	}
	for(i=0;i<4;i++)
	{
		for(j=0;j<4;j++)
			printf("%c",W[i][j]);
	}
	printf("\n");
}
int main()
{
	int t;
list:printf("选择功能:\n1.加密\n2.解密\n3.结束\n");
	 scanf("%d",&t);
	 getchar();
	 switch(t)
	 {
	 case 1:encrypt();
		 goto list;
	 case 2:decrypt();
		 goto list;
	 case 3:exit(1);
	 }
	return 0;
}

代码运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值