编制密码表
第一步是编制密码表。在这个5*5的密码表中,共有5行5列字母。第一行(或第一列)是密钥,其余按照字母顺序。密钥是一个单词或词组,若有重复字母,可将后面重复的字母去掉。当然也要把使用频率最少的字母去掉。如:密钥是
L
i
v
e
a
n
d
l
e
a
r
n
Live and learn
Liveandlearn,去掉后则为
l
i
v
e
a
n
d
r
liveandr
liveandr。如果密钥过长可占用第二列或行。j和i用i来替换
如密钥
c
r
a
z
y
d
o
g
crazy dog
crazydog,可编制成
[
c
r
a
z
y
d
o
g
b
e
f
h
i
(
j
)
k
l
m
n
p
q
s
t
u
v
w
x
]
\begin{bmatrix} c &r &a &z &y \\ d&o &g & b &e \\ f&h &i(j) &k &l \\ m&n &p &q &s \\ t &u &v &w &x \end{bmatrix}
⎣⎢⎢⎢⎢⎡cdfmtrohnuagi(j)pvzbkqwyelsx⎦⎥⎥⎥⎥⎤
整理明文
第二步整理明文。将明文每两个字母组成一对。如果成对后有两个相同字母紧挨或最后一个字母是单个的,就插入一个字母q(或者其他双方约定好的)。
如,communist,应成为co mq mu ni st
编写密文
最后编写密文。对明文加密规则如下:
1 若p1 p2在同一行,对应密文c1 c2分别是紧靠p1 p2 右端的字母。其中第一列被看做是最后一列的右方。如,按照前表,ct对应dc(解密时反向)
2 若p1 p2在同一列,对应密文c1 c2分别是紧靠p1 p2 下方的字母。其中第一行被看做是最后一行的下方。(解密时反向)
3 若p1 p2不在同一行,不在同一列,则c1 c2是由p1 p2确定的矩形的其他两角的字母(至于横向替换还是纵向替换要事先约好,或自行尝试)。如,按照前表,wh对应ku或uk。(解密时处理方法相同)
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
void CreateMatrix(char key[],char Matrix[5][5])
{
bool vis[26]= {0};
int len=strlen(key);
int s=0;
int w=0;
for(int i=0; i<5; i++)
for(int j=0; j<5; j++)
{
if(s<len)
{
Matrix[i][j]=key[s];
vis[key[s]-'a']=1;
s++;
}
else
{
while(vis[w]==1) w++;
if(w+'a'=='j') w++;
Matrix[i][j]='a'+w;
vis[w]=1;
w++;
}
}
}
void Encode(char str[],char Matrix[5][5])
{
char code[100];
int len=strlen(str);
int len2=0;
for(int i=0; i<len; i++)
{
if(str[i]==' ')
continue;
code[len2++]=str[i];
if(str[i]==str[i+1])
code[len2++]='q';
}
if(len2%2==1)
code[len2++]='q';
code[len2+1]='\0';
printf("密文为:");
for(int i=0; i<len2; i+=2)
{
int x1,y1,x2,y2;
for(int j=0; j<5; j++)
for(int k=0; k<5; k++)
if(Matrix[j][k]==code[i])
{
x1=j;
y1=k;
}
else if(Matrix[j][k]==code[i+1])
{
x2=j;
y2=k;
}
if(x1==x2)
printf("%c%c ",Matrix[x1][(y1+1)%5],Matrix[x2][(y2+1)%5]);
else if(y1==y2)
printf("%c%c ",Matrix[(x1+1)%5][y1],Matrix[(x2+1)%5][y2]);
else
printf("%c%c ",Matrix[x1][y2],Matrix[x2][y1]);
}
printf("\n");
}
void Decode(char str[],char Matrix[5][5])
{
char code[100];
int len=strlen(str);
int len2=0;
for(int i=0; i<len; i++)
{
if(str[i]==' ')
continue;
code[len2++]=str[i];
}
code[len2+1]='\0';
printf("明文为:");
for(int i=0; i<len2; i+=2)
{
int x1,y1,x2,y2;
for(int j=0; j<5; j++)
for(int k=0; k<5; k++)
if(Matrix[j][k]==code[i])
{
x1=j;
y1=k;
}
else if(Matrix[j][k]==code[i+1])
{
x2=j;
y2=k;
}
if(x1==x2)
printf("%c%c ",Matrix[x1][(y1-1+5)%5],Matrix[x2][(y2-1+5)%5]);
else if(y1==y2)
printf("%c%c ",Matrix[(x1-1+5)%5][y1],Matrix[(x2-1+5)%5][y2]);
else
printf("%c%c ",Matrix[x1][y2],Matrix[x2][y1]);
}
printf("\n");
}
int main()
{
char key[26],Matrix[5][5],str[100];
printf("请输入密钥:");
gets(key);
CreateMatrix(key,Matrix);
printf("请输入明文:");
gets(str);
Encode(str,Matrix);
printf("请输入密文:");
gets(str);
Decode(str,Matrix);
return 0;
}