一、算法描述
波雷费密码是一种对称式密码,是首种双字母取代的加密法。
下面描述算法步骤:
-
从1号二维码M05,提取明文信息和密文,M05格式:<xxx…xxx|yyy…yyy>,其中明文xxx…xxx,密钥部分信息为yyy…yyy中的提取所有英文字母信息。
-
将提取的英文字母作密匙。除去重复出现的字母。将密匙的字母逐个逐个加入5×5的矩阵内,剩下的空间将未加入的英文字母依A-Z的顺序加入。(将Q去除)
-
将要加密的讯息分成两个一组。若组内的字母相同,将X加到该组的第一个字母后,重新分组。若剩下一个字,也加入X字。
-
在每组中,找出两个字母在矩阵中的地方。
若两个字母不同行也不同列,在矩阵中找出另外两个字母,使这四个字母成为一个长方形的四个角。
若两个字母同行,取这两个字母右方的字母(若字母在最右方则取最左方的字母)。
若两个字母同列,取这两个字母下方的字母(若字母在最下方则取最上方的字母)。 -
新找到的两个字母就是原本的两个字母加密的结果。
-
取密文前3个字符与后三个字符(大写字母)作为对应6位的红外报警开启码。
二、算法过程示例
例:二维码内容为:<hidethegold|play5fair9example>。
1.明文信息hidethegold和密匙playfairexample
2.根据密钥形成5*5的矩阵。
P L A Y F
I R E X M
B C D G H
J K N O S
T U V W Z
3.明文处理为:“HI DE TH EG OL DX”
4.就会得到密文:“BM ND ZB XD KY GE”,
5.取密文前6个字符(大写字母)对应6位的报警码:0X42,0X4D,0X4E,0X44, 0X5A, 0X42
三、具体代码如下:
import sun.applet.Main;
public class blf {
public static void main(String[] args) {
String s = "<hidethegold|play5fair9example>";
get_blf(s);
}
public static void get_blf(String ssss){
String eng = "ABCDEFGHIJKLMNOPRSTUVWXYZ";
String beg = ssss.replaceAll("[<>0-9]", "");
String []ss = beg.split("\\|");
String mw = ss[0].toUpperCase();
String str = ss[1].toUpperCase();
str = removeMethod(str);
System.out.println(str);
int bs = str.length() / 5;
int ys = str.length() % 5;
System.out.println(ys);
System.out.println(bs);
char[][] arr = new char[5][5];
for (int i = 0; i < bs; i++) {
arr[i] = str.subSequence(i * 5, (i+1) * 5).toString().toCharArray();
}
String yss = str.subSequence(bs*5, (bs*5+ys)).toString();
String other = eng.replaceAll("["+ str +<