密码课程设计第一个小题目,Playfair密码算法实现。JAVA版实现。

 

 
  1. import java.util.*; 
  2.  
  3. public class PlayfairCoder{ 
  4.  
  5.     public static int checkChar(char c){ 
  6.  
  7.         if(c>='A'&&c<='Y'
  8.  
  9.             return 1
  10.  
  11.         else 
  12.  
  13.             return 0;    
  14.  
  15.     } 
  16.  
  17.     /* 
  18.  
  19.      *格式化密钥材料 
  20.  
  21.      */ 
  22.  
  23.     public static String formatKey(String key){ 
  24.  
  25.         StringBuffer sb=new StringBuffer(); 
  26.  
  27.         HashSet<Character> hs=new HashSet<Character>(); 
  28.  
  29.         char n; 
  30.  
  31.         String k=key.toUpperCase(); 
  32.  
  33.         char[] detail=new char[25]; 
  34.  
  35.                 for(int i=0,j=65;i<25;i++,j++) 
  36.  
  37.                         detail[i]=(char)j; 
  38.  
  39.         for(int i=0;i<k.length();i++){ 
  40.  
  41.             n=k.charAt(i); 
  42.  
  43.             if(!hs.contains(n)&&checkChar(n)==1){ 
  44.  
  45.                 sb.append(n); 
  46.  
  47.                 hs.add(n); 
  48.  
  49.             } 
  50.  
  51.         } 
  52.  
  53.         int i=0
  54.  
  55.         while(sb.length()!=25){ 
  56.  
  57.             char t=detail[i]; 
  58.  
  59.             if(!hs.contains(t)){ 
  60.  
  61.                 sb.append(t); 
  62.  
  63.                 hs.add(t); 
  64.  
  65.             } 
  66.  
  67.             i++; 
  68.  
  69.         } 
  70.  
  71.         return sb.toString(); 
  72.  
  73.     } 
  74.  
  75.     /* 
  76.  
  77.      *生成密钥矩阵 
  78.  
  79.      */ 
  80.  
  81.     public static char[][] initKey(String k){ 
  82.  
  83.         char[][] key=new char[5][5]; 
  84.  
  85.         String s=formatKey(k); 
  86.  
  87.         int m=0
  88.  
  89.         for(int i=0;i<5;i++) 
  90.  
  91.             for(int j=0;j<5;j++){ 
  92.  
  93.                 key[i][j]=s.charAt(m); 
  94.  
  95.                 m++; 
  96.  
  97.         } 
  98.  
  99.         return key; 
  100.  
  101.     } 
  102.  
  103.     /* 
  104.  
  105.          *格式化明文 
  106.  
  107.          */ 
  108.  
  109.     public static String formatData(String data,String sign){ 
  110.  
  111.         String updata=data.toUpperCase(); 
  112.  
  113.         String ming="",temp=""
  114.  
  115.         char c; 
  116.  
  117.         Stack<Character> stack=new Stack<Character>(); 
  118.  
  119.         for(int i=0;i<updata.length();i++){ 
  120.  
  121.             c=updata.charAt(i); 
  122.  
  123.             if(checkChar(c)==1){ 
  124.  
  125.                 if(stack.size()%2!=0){ 
  126.  
  127.                     if(stack.peek()==c){ 
  128.  
  129.                         stack.push(sign.charAt(0)); 
  130.  
  131.                         stack.push(c); 
  132.  
  133.                     } 
  134.  
  135.                     else 
  136.  
  137.                         stack.push(c); 
  138.  
  139.                 } 
  140.  
  141.                 else 
  142.  
  143.                     stack.push(c); 
  144.  
  145.             } 
  146.  
  147.         } 
  148.  
  149.         while(stack.size()>0
  150.  
  151.             temp+=stack.pop(); 
  152.  
  153.         for(int i=temp.length()-1;i>-1;i--) 
  154.  
  155.             ming+=temp.charAt(i); 
  156.  
  157.         if(ming.length()%2!=0
  158.  
  159.             ming+=sign.charAt(0);    
  160.  
  161.         return ming; 
  162.  
  163.     } 
  164.  
  165.     public static String getEnData(char a,char b,char[][] k){ 
  166.  
  167.         String result=""
  168.  
  169.         int h=0,l=0,m=0,n=0
  170.  
  171.         for(int i=0;i<k.length;i++) 
  172.  
  173.             for(int j=0;j<k[i].length;j++){ 
  174.  
  175.                 if(a==k[i][j]){ 
  176.  
  177.                     h=i; 
  178.  
  179.                     l=j; 
  180.  
  181.                 } 
  182.  
  183.                 if(b==k[i][j]){ 
  184.  
  185.                     m=i; 
  186.  
  187.                     n=j; 
  188.  
  189.                 } 
  190.  
  191.         } 
  192.  
  193.         if(h!=m&&l!=n) 
  194.  
  195.             result=result+k[h][n]+k[m][l]; 
  196.  
  197.         else if(h==m){ 
  198.  
  199.             if(l==4
  200.  
  201.                 result=result+k[h][0]+k[h][n+1]; 
  202.  
  203.             else if(n==4
  204.  
  205.                 result=result+k[h][l+1]+k[h][0]; 
  206.  
  207.             else 
  208.  
  209.                 result=result+k[h][l+1]+k[h][n+1]; 
  210.  
  211.         } 
  212.  
  213.         else if(l==n){ 
  214.  
  215.             if(h==4
  216.  
  217.                                 result=result+k[0][l]+k[m+1][l]; 
  218.  
  219.                         else if(m==4
  220.  
  221.                                 result=result+k[h+1][l]+k[0][l]; 
  222.  
  223.                         else 
  224.  
  225.                                 result=result+k[h+1][l]+k[m+1][l]; 
  226.  
  227.                 } 
  228.  
  229.         return result; 
  230.  
  231.     } 
  232.  
  233.     public static String getDeData(char a,char b,char[][] k){ 
  234.  
  235.         String result=""
  236.  
  237.                 int h=0,l=0,m=0,n=0
  238.  
  239.                 for(int i=0;i<k.length;i++) 
  240.  
  241.                         for(int j=0;j<k[i].length;j++){ 
  242.  
  243.                                 if(a==k[i][j]){ 
  244.  
  245.                                         h=i; 
  246.  
  247.                                         l=j; 
  248.  
  249.                                 } 
  250.  
  251.                                 if(b==k[i][j]){ 
  252.  
  253.                                         m=i; 
  254.  
  255.                                         n=j; 
  256.  
  257.                                 } 
  258.  
  259.                 } 
  260.  
  261.                 if(h!=m&&l!=n) 
  262.  
  263.                         result=result+k[h][n]+k[m][l]; 
  264.  
  265.                 else if(h==m){ 
  266.  
  267.                         if(l==0
  268.  
  269.                                 result=result+k[h][4]+k[h][n-1]; 
  270.  
  271.                         else if(n==0
  272.  
  273.                                 result=result+k[h][l-1]+k[h][4]; 
  274.  
  275.                         else 
  276.  
  277.                                 result=result+k[h][l-1]+k[h][n-1]; 
  278.  
  279.                 } 
  280.  
  281.                 else if(l==n){ 
  282.  
  283.                         if(h==0
  284.  
  285.                                 result=result+k[4][l]+k[m-1][l]; 
  286.  
  287.                         else if(m==0
  288.  
  289.                                 result=result+k[h-1][l]+k[4][l]; 
  290.  
  291.                         else 
  292.  
  293.                                 result=result+k[h-1][l]+k[m-1][l]; 
  294.  
  295.                 } 
  296.  
  297.                 return result; 
  298.  
  299.     } 
  300.  
  301.     /* 
  302.  
  303.      *加密 
  304.  
  305.      */ 
  306.  
  307.     public static String encrypt(String key,String data,String sign){ 
  308.  
  309.         char[][] k=initKey(key); 
  310.  
  311.         String d=formatData(data,sign); 
  312.  
  313.         String endata=""
  314.  
  315.         int i=0,j=1
  316.  
  317.         char a,b; 
  318.  
  319.         while(j<d.length()){ 
  320.  
  321.             a=d.charAt(i); 
  322.  
  323.             b=d.charAt(j); 
  324.  
  325.             endata=endata+getEnData(a,b,k); 
  326.  
  327.             i+=2
  328.  
  329.             j+=2
  330.  
  331.         }    
  332.  
  333.         return endata; 
  334.  
  335.     } 
  336.  
  337.     /* 
  338.  
  339.      *解密 
  340.  
  341.      */ 
  342.  
  343.     public static String decrypt(String key,String data,String sign){ 
  344.  
  345.         char[][] k=initKey(key); 
  346.  
  347.         String dedata=""
  348.  
  349.         int i=0,j=1
  350.  
  351.         char a,b; 
  352.  
  353.         while(j<data.length()){ 
  354.  
  355.             a=data.charAt(i); 
  356.  
  357.             b=data.charAt(j); 
  358.  
  359.             dedata=dedata+getDeData(a,b,k); 
  360.  
  361.             i+=2
  362.  
  363.             j+=2
  364.  
  365.         } 
  366.  
  367.         dedata=dedata.replaceAll(sign,""); 
  368.  
  369.         return dedata; 
  370.  
  371.     }                    
  372.  
  373.     public static void main(String[] str){ 
  374.  
  375.         Scanner sc=new Scanner(System.in); 
  376.  
  377.         System.out.print("请输入密钥: "); 
  378.  
  379.         String arr=sc.nextLine(); 
  380.  
  381.         System.out.print("请输入明文: "); 
  382.  
  383.         String m=sc.nextLine(); 
  384.  
  385.         System.out.print("请输入标志字符"); 
  386.  
  387.         String sign=sc.nextLine().toUpperCase(); 
  388.  
  389.         String t=formatData(m,sign); 
  390.  
  391.         System.out.println("明文格式化: "+t+"\n密钥矩阵:"); 
  392.  
  393.         char[][] testarr=initKey(arr); 
  394.  
  395.         for(int i=0;i<5;i++) 
  396.  
  397.             for(int j=0;j<5;j++){ 
  398.  
  399.                 System.out.print(testarr[i][j]+"   "); 
  400.  
  401.                 if(j==4
  402.  
  403.                 System.out.println(""); 
  404.  
  405.         } 
  406.  
  407.         String jia=encrypt(arr,m,sign); 
  408.  
  409.         System.out.println("加密后: "+jia); 
  410.  
  411.         System.out.println("解密后: "+decrypt(arr,jia,sign)); 
  412.  
  413.      
  414.  
  415.     } 
  416.