#includestdio.h
#includestring.h
int find(char *key,int n,char c);
char alph[26]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o',
'p','q','r','s','t','u','v','w','x','y','z'};
void find_fang(char fang[5][5],char c1,int *i_1,int *j_1);
void main()
{
char key[25],yuanwen[50],miwen[50];
printf("\n请输入密钥(1~25):");
gets(key);
printf("\n请输入原文(1~50):");
gets(yuanwen);
char fang[5][5];
int i,j,k=0,len,t=0;
len=strlen(key);
for(i=0;i5;i++)
for(j=0;j5;j++)
{
if(key[k]!='\0')
{
fang[i][j]=key[k];
k++;
}
else
{
while(find(key,len,alph[t]))
t++;
fang[i][j]=alph[t];
t++;
}
}
char t1,t2;
int i_1=-1,j_1=-1,i_2=-1,j_2=-1;
for(i=0;istrlen(yuanwen);i+=2)
{
t1=yuanwen[i];
t2=yuanwen[i+1];
if(t1==t2||t2=='\0')
{
miwen[i]=t1;
miwen[i+1]=t2;
}
else
{
find_fang(fang,t1,i_1,j_1);
find_fang(fang,t2,i_2,j_2);
if(i_1==-1||j_1==-1||i_2==-1||j_2==-1)
{
miwen[i]=t1;
miwen[i+1]=t2;
}
else if(i_1==i_2||j_1==j_2)
{
miwen[i]=t2;
miwen[i+1]=t1;
}
else
{
miwen[i]=fang[i_1][j_2];
miwen[i+1]=fang[i_2][j_1];
}
}
}
printf("加密后的密文为:");
puts(miwen);
}
int find(char *key,int n,char c)
{
int i,flag=0;
for(i=0;in;i++)
if(key[i]==c)
{
flag=1;
break;
}
return flag;
}
void find_fang(char fang[5][5],char c1,int *i_1,int *j_1)
{
int i,j;
for(i=0;i5;i++)
for(j=0;j5;j++)
if(fang[i][j]==c1)
{
*i_1=i;
*j_1=j;
break;
}
}
playfair密码
算法描述:Playfair密码出现于1854年,它依据一个5*5的正方形组成的密码表来编写,密码表里排列有25个字母。如果一种语言字母超过25个,可以去掉使用频率最少的一个。如,法语一般去掉w或k,德语则是把i和j合起来当成一个字母看待。英语中z使用最少,可以去掉它。
加密描述:第一步是编制密码表。在这个5*5的密码表中,共有5行5列字母。第一列(或第一行)是密钥,其余按照字母顺序。密钥是一个单词或词组,若有重复字母,可将后面重复的字母去掉。当然也要把使用频率最少的字母去掉。如:密钥是Live and learn,去掉后则为liveandr。如果密钥过长可占用第二列或行。
别浪费时间了,这种软件也没什么特别的,无外乎词典破解、暴力破解,CPU不够强悍的话,你要等到天荒地老,还不如直接去你下载的压缩文件的网页上找,作者一般会把密码放出来的。