import java.io.*;
import java.util.*;
public class jackey {
public static void encode(char[] a,char m[][])
{
char b[]=new char[100];
int q=a.length;
int ix=0; //判断是否需要插x
int nx=0; //计算插入x的个数
for(int i=0;i<q/2;i++)
{
if(ix==1)
{
i=0; //如果插过x,数组奇偶排列已打乱,需重新处理
ix=0;
}
if(a[i*2]==a[i*2+1])
{
// char[] c=a;
a=(a.toString().valueOf(a)+a.toString().valueOf(a).charAt(a.length-1)).toCharArray();
for(int j=q-1;j>=i*2+1;j--)
{
a[j]=a[j-1];
a[i*2+1]='x';
if(a[j-1]==a[i*2+1])
{
a[j]=a[i*2];
}
//a=(a.toString().valueOf(a)+"x").toCharArray();
//a[i*2+2]=a[j];
nx++;
ix=1;
//System.out.print("r");
}
// a=(a.toString().valueOf(a)+c.toString().valueOf(c).charAt(4)).toCharArray();
}
}
//如果明文总长为奇数,在后面再补一个x
if((q+nx)%2!=0)
{
a=(a.toString().valueOf(a)+"x").toCharArray();
nx++; //现明文总长为q+nx,且为偶数
}
//利用playfair密钥矩阵,将明文空间映射到密文空间
int r1=5,l1=5; //r和l分别为矩阵m的行标和列标
int r2=5,l2=5;
for(int g=0;g<(q+nx)/2;g++) //g为数组a和b的行标
{
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
{
if(a[g*2]==m[i][j])
{
r1=i;
l1=j;
}
if(a[g*2+1]==m[i][j])
{
r2=i;
l2=j;
}
}
if(r1==r2) //在同一行
{
b[g*2]=m[r1][(l1+1)%5];
b[g*2+1]=m[r2][(l2+1)%5];
}
else if(l1==l2) //在同一列
{
b[g*2]=m[(r1+1)%5][l1];
b[g*2+1]=m[(r2+1)%5][l2];
}
else //if(l1<l2)
{
b[g*2]=m[r1][l2];
b[g*2+1]=m[r2][l1];
}
}
for(int i=0;i<a.length;i++)
{
System.out.print(b[i]);
}
}
public static void decode(char[] a,char m[][])
{
{
char b[]=new char[100];
int q=a.length;
/*int ix=0; //判断是否需要x
int nx=0; //计算插入x的个数
for(int i=0;i<q/2;i++)
{
if(ix==1)
{
i=0; //如果插过x,数组奇偶排列已打乱,需重新处理
ix=0;
}
if(a[i*2]==a[i*2+1])
{
a=(a.toString().valueOf(a)+a.toString().valueOf(a).charAt(a.length-1)).toCharArray();
for(int j=q-1;j>=i*2+1;j--)
{
a[j]=a[j-1];
a[i*2+1]='x';
if(a[j-1]==a[i*2+1])
{
a[j]=a[i*2];
}
nx++;
ix=1;
}
}
}
//如果明文总长为奇数,在后面再补一个x
if((q+nx)%2!=0)
{
a=(a.toString().valueOf(a)+"x").toCharArray();
nx++; //现密文总长为q,且为偶数
}*/
//利用playfair密钥矩阵,将密文空间映射到明文空间
int r1=5,l1=5; //r和l分别为矩阵m的行标和列标
int r2=5,l2=5;
for(int g=0;g<q/2;g++) //g为数组a和b的行标
{
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
{
if(a[g*2]==m[i][j])
{
r1=i;
l1=j;
}
if(a[g*2+1]==m[i][j])
{
r2=i;
l2=j;
}
}
if(r1==r2) //在同一行
{
b[g*2]=m[r1][(l1-1+5)%5];
b[g*2+1]=m[r2][(l2-1+5)%5];
}
else if(l1==l2) //在同一列
{
b[g*2]=m[(r1-1+5)%5][l1];
b[g*2+1]=m[(r2-1+5)%5][l2];
}
else //if(l1<l2)
{
b[g*2]=m[r1][l2];
b[g*2+1]=m[r2][l1];
}
}
for(int i=0;i<a.length;i++)
{
System.out.print(b[i]);
}
}
}
public static char[][] key(char a[])
{
//去输入数组中的重复字符与空格
char[] b=a;
StringBuffer sb1=new StringBuffer(a.toString().valueOf(a));
StringBuffer sb2=new StringBuffer(a.toString().valueOf(b));
for(int i=0;i<a.length;i++)
{
//int p=sb2.length();
for(int j=i+1;j<sb2.length();j++)
{
if(sb1.charAt(i)==sb2.charAt(j))
sb2.deleteCharAt(j);
}
}
for(int i=0;i<sb2.length();i++)
{
if(sb2.charAt(i)==' ')
sb2.deleteCharAt(i);
}
a=sb2.toString().valueOf(sb2).toCharArray();
int t=a.length;
//去空格去重复字符后将密钥加进数组a中
char m[][]=new char[5][5];
char m1[]=new char[25];
for(int i=0;i<t;i++)
{
if(a[i]=='q')
a[i]='i';
}
for(int i=0;i<a.length;i++)
m1[i]=a[i];
for(int i=a.length;i<25;i++)
for(int h=97;h<=122;h++)
{
if(h==113) //////////不要字符q//////////////////
continue;
int is=1; //判断后补入m1的元素是否和密钥重复
for(int e=0;e<i;e++)
{
if(m1[e]==(char)h)
{
is=0;
break; //break只能跳for和while循环
}
}
if(is==1)
{
m1[i]=(char)h;
break;
}
}
//将数组m1的元素赋给矩阵m
// int j,l; //i为矩阵行标,j为列标,l指m1数组位标
for(int i=0;i<5;i++)
for(int j=0,l=i*5;j<5;j++,l++)
m[i][j]=m1[l];
return m;
}
public static void main(String[] args)
{
try
{
InputStreamReader Isr=new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(Isr);
System.out.println("Please choose:e/d");
//System.out.println("x to exit");
String d=br.readLine();
if(d.equalsIgnoreCase("e"))
{
System.out.println("Please enter the key");
char[] k=br.readLine().toCharArray();
System.out.println("Please enter your words");
char[] in=br.readLine().toCharArray();
char key[][]=key(k);
encode(in,key);
}
if(d.equalsIgnoreCase("d"))
{
System.out.println("Please enter the key");
char[] k=br.readLine().toCharArray();
System.out.println("Please enter your words");
char[] out=br.readLine().toCharArray();
char key[][]=key(k);
decode(out,key);
}
}
catch(IOException e){
System.out.println("Error!");
}
}
}
评论0