⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 playfair.java

📁 playfair加密解密算法 其中i与q绑定在一起希望大家能够喜欢
💻 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 + -