波雷费密码是一种对称式密码,是首种双字母取代的加密法。
下面描述算法步骤:
1,从1号二维码M05,提取明文信息和密文,M05格式:& lt; xxx…xxx | yyy…yyy>,其中明文xxx…xxx,密钥部分信息为yyy…yyy中的提取所有英文字母信息。
2,将提取的英文字母作密匙。除去重复出现的字母。将密匙的字母逐个逐个加入5×5的矩阵内,剩下的空间将未加入的英文字母依a - z的顺序加入。(将问去除)
3,将要加密的讯息分成两个一组。若组内的字母相同,将X加到该组的第一个字母后,重新分组。若剩下一个字,也加入X字。
4,在每组中,找出两个字母在矩阵中的地方。
若两个字母不同行也不同列,在矩阵中找出另外两个字母,使这四个字母成为一个长方形的四个角。
若两个字母同行,取这两个字母右方的字母(若字母在最右方则取最左方的字母)。
若两个字母同列,取这两个字母下方的字母(若字母在最下方则取最上方的字母)。
5,新找到的两个字母就是原本的两个字母加密的结果。
6,取密文前3个字符与后三个字符(大写字母)作为对应6位的红外报警开启码。
例:二维码内容为:& lt; hidethegold | play5fair9example>。
1。明文信息hidethegold和密匙playfairexample
2。根据密钥形成5 * 5的矩阵。
F P L Y I R E X M B C D G H J K N O S T U V W Z
3。明文处理为:“嗨DE TH如OL DX”
4。就会得到密文:“BM ND ZB XD KY通用电气”,
5。取密文前6个字符(大写字母)对应6位的报警码:0×,0 x4d 0 x4e 0 x44 0 x5a 0×
进口sun.applet.Main; 公开课blf { 公共静态void main (String [] args) { 字符串s=" & lt; hidethegold | play5fair9example>”; get_blf(年代); } 公共静态孔隙get_blf(字符串sss) { 字符串eng=癆BCDEFGHIJKLMNOPRSTUVWXYZ”; 字符串求=ssss.replaceAll (“[& lt;在0 - 9]"," "); String[]党卫军=beg.split (“\ \ |”); 字符串mw=党卫军[0].toUpperCase (); 字符串str=党卫军[1].toUpperCase (); str=removeMethod (str); System.out.println (str); int b=str.length ()/5; int y=str.length () % 5; System.out.println (y); System.out.println (bs); char [] [] arr=新char [5] [5]; for (int i=0;我& lt;废话;我+ +){ arr[我]=str.subSequence(我* 5 (i + 1) * 5) .toString () .toCharArray (); } 字符串)yss=str.subSequence (b * 5 (b * 5 + y) .toString (); 其他=eng字符串。replaceAll (“[+ str +“]”, " "); system . out。println(“其他=" +其他); arr [b]=() yss + other.subSequence (0, (5-ys))) .toString () .toCharArray (); int bs1=b + 1;//把余数补全 int oth=25 - (bs1 * 5);//剩下的长度 其他=W有蛄?(5 - y) (oth + 5 - y) .toString (); system . out。println(“其他=" +其他); int c=5 - bs1; system . out。println (c=" + c); for (int i=0;我& lt;c;我+ +){ system . out。println (“bs1=" + bs1); arr (bs1 + +)=W有蛄?我* 5 (i + 1) * 5) .toString () .toCharArray (); } for (int i=0;我& lt;arr.length;我+ +){ for (int j=0;j & lt;加勒比海盗[我]. length;j + +) { system . out。打印(arr[我][j] + \ t); } System.out.println (); }//arr [0]="); 字符串s2=" "; for (int i=0;我& lt;s1.length;我+ +){ s2 +=解决(加勒比海盗,s1[我]); } System.out.println (s2); 字符串鳍=" "; for (int i=0;我& lt;6;我+ +){ 鳍+=s2.charAt(我); } byte [] br=fin.getBytes (); for (int i=0;我& lt;br.length;我+ +){ System.out.print (decimalToHex (br[我])+“t \”); } } 公共静态字符串解析(char[][]加勒比海盗,字符串s1) { int=99; int b=99; int a1=99; int b1=99; 字符串res=" "; for (int i=0;我& lt;arr.length;我+ +){ for (int j=0;j & lt;加勒比海盗[我]. length;j + +) { 如果((arr[我][j]==s1.charAt (0))) {=我; b=j; }else if (arr[我][j]==s1.charAt (1)) { a1=我; b1=j; } 如果((!=99),,(b !=99),,(a1 !=99),,(b1 !=99)) { 如果(((a1 - a) !=0),,(((b1 - b) !=0))) { res=" + arr[一](b1) + arr [a1] [b]; }else if ((a1 -==0),,(b1 - b !=0)) { 如果((b==4)) { res=" + arr[一][0]+ arr [a1] (b1 + 1); }else if (b1==4) { res=" + arr arr[一][b + 1] + [a1] [0]; 其他}{ res=" + arr arr[一][b + 1] + [a1] (b1 + 1); } }else if ((a1 - !=0),,(b1 - b==0)) { 如果((==4)){ res=" + arr [0] [b] + arr [a1 + 1] (b1); }else if (a1==4) { res=" + arr arr [+ 1] [b] + [0] (b1); 其他}{ res=" + arr arr [+ 1] [b] + [a1 + 1] (b1); } } } } } 返回res; } 公共静态字符串removeMethod (String s) { StringBuffer某人=new StringBuffer (); int len=s.length (); for (int i=0;我& lt;兰;我+ +){ 字符c=s.charAt(我); 如果(s.indexOf (c)==s.lastIndexOf (c)){//此字符第一次位置和最后位置一致即肯定没有重复的直接添加 sb.append (c); }{//同其他理次字符出现过多次 int fristposition=s.indexOf (c);//次字符第一次出现的位置 如果(fristposition==我){//第一次出现的位置和当前位置一致即第一次出现添加 sb.append (c); } } } 返回sb.toString (); } 公共静态字符串decimalToHex(字节小数){ 十六进制字符串=" "; 而(小数!=0){ int hexValue=https://www.yisu.com/zixun/decimal % 16; 十六进制=toHexChar (hexValue) +十六进制; 十进制=(字节)(十进制/16); } 返回十六进制; }//将0 ~ 15的十进制数转换成0 ~ F的十六进制数 公共静态字符toHexChar (int hexValue) { 如果(hexValuejava实现波雷费密码算法示例代码