📄 permutation.cpp
字号:
/********************************************************************
Column permutation cipher的编程实现(非文件版)
code by:xxs
此函数只允许小写密钥
*********************************************************************/
/********************************************************************
列置换的原理说明:将一段明文按照密钥改成一定的形式
密钥用来决定列的置换顺序
**********************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//#include<iostream>
//using namespace std;
//sort the key by letter
typedef struct _Asiskey{
char key;
int index;
}Asistkey;
void SortKey(Asistkey *key,int n);
int main()
{
char Key[50];//密钥
char Ptext[500];//明文
char Ctext[500];//密文
char temp[500];//临时
// char tem;
//密钥处理
printf("please input the key:");
scanf("%s",Key);
getchar();
int n=strlen(Key);
Asistkey *Akey=(Asistkey *)malloc(n*sizeof(Asistkey));
for(int i=0;i<n;i++)
{
Akey[i].key=Key[i];
Akey[i].index=i;
}
SortKey(Akey, n);
//加密部分
memset(Ptext,0,sizeof(Ptext));
printf("please input ptext:");
scanf("%s",Ptext);
getchar();
int m=strlen(Ptext);
//明文处理
int k=0;
if((k=m%n)!=0)
{
k=m;
m=(m/n)*n+n;
for(;k<m;k++)
{
Ptext[k]='Q';
}
}
printf("明文是:%s\n",Ptext);
//加密
memset(Ctext,0,sizeof(Ctext));
for(i=0;i<m;i++)
{
for(k=0;k<n;k++)
if(i%n==Akey[k].index)
break;
//Ctext[i/n*n+i%n]=Ptext[i/n*n+Akey[i%n].index];
Ctext[i/n*n+i%n]=Ptext[i/n*n+k];
}
printf("密文是:%s\n",Ctext);
//解密过程
memset(temp,0,sizeof(temp));
for(i=0;i<m;i++)
{
//temp[i/n*n+ i%n]=Ctext[i/n*n+Akey[i%n].index];
for(k=0;k<n;k++)
if(i%n==Akey[k].index)
break;
temp[i/n*n+ k]=Ctext[i/n*n+i%n];
}
printf("解密是:%s\n",temp);
return 0;
}
//
void SortKey(Asistkey *key,int n)
{
Asistkey temp;
int i,j,k;
i=j=k=0;
for(i=0;i<n-1;i++)
{
j=i;
for(k=j+1;k<n;k++)
{
if(key[j].key >key[k].key )
j=k;
}
if(j!=i)
{
temp.key = key[i].key ;
temp.index = key[i].index ;
key[i].key =key[j].key ;
key[i].index = key[j].index ;
key[j].key =temp.key;
key[j].index = temp.index ;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -