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

📄 playfair_java.txt

📁 加密解密,算法, 加密解密,算法,加密解密,算法
💻 TXT
字号:
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!");
		  }
}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -