📄 playfair.java
字号:
import java.io.*;
import java.util.*;
public class jackey {
//static char m[][]={{'m','o','n','a','r'},{'c','h','y','b','d'},{'e','f','g','i','k'},{'l','p','q','s','t'},{'u','v','w','x','z'}};
//static char a[],b[];//a[]明文b[]密文
public static void encode(char[] a,char m[][])
{
//char m[][]={{'m','c','e','l','u'},{'o','h','f','p','v'},{'n','y','g','q','w'},{'a','b','i','s','x'},{'r','d','k','t','z'}};
//char c[]=new char[100];
//c=a;
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];
}
// else
// {
// b[g*2]=m[r2][l1];
// b[g*2+1]=m[r1][l2];
// }
}
for(int i=0;i<a.length;i++)
{
System.out.print(b[i]);
}
}
public static void decode(char[] a,char m[][])
{
{
//char m[][]={{'m','c','e','l','u'},{'o','h','f','p','v'},{'n','y','g','q','w'},{'a','b','i','s','x'},{'r','d','k','t','z'}};
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];
}
// else
// {
// 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();
//HashSet<String> temp=new HashSet<String>();
//String b[]=a.toString();
//for(int i=0;i<a.length;i++)
//{
//temp.add(a);
//}
//temp.remove(' ');
//String[] g=temp.toArray(new String[0]);
//String[] s=(String[])g;
//a=s.toString().toCharArray();
//StringBuffer sb=new StringBuffer(temp.toArray().toString().valueOf(s));
//sb.deleteCharAt(0);
//sb.deleteCharAt(sb.length()-1);
//if(sb.length()>1)
//{
// for(int i=0;i<sb.length()/2;i++)
// {
// sb.deleteCharAt(2*i+1);
// //sb.deleteCharAt(2*i);
// }
//}
//a=sb.toString().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];
// for(int i=0;i<m1.length;i++)
//System.out.print(m1[i]);
//for(int i=0;i<5;i++)
// for(int j=0;j<5;j++)
// System.out.print(m[i][j]);
return m;
}
public static void main(String[] args)
{
/*try{
InputStreamReader Isr=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(Isr);
System.out.print("Please");
char[] in=br.readLine().toCharArray();
for(int i=0;i<in.length;i++)
{
if(in[i]=='j')
in[i]='i';
}
decode(in);
}catch(IOException e)
{}*/
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);
// for(int i=0;i<in.length;i++)
// {
// if(in[i]=='j')
// in[i]='i';
// }
encode(in,key);
//System.out.println("afterChange:"+f);
}
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);
//for(int i=0;i<out.length;i++)
// {
// if(out[i]=='j')
// out[i]='i';
// }
decode(out,key);
//System.out.println("afterChange:"+f);
}
}
catch(IOException e){
System.out.println("Error!");
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -