加法密码和乘法密码结合就构成仿射密码,仿射密码的加密算法是:
C= Ek(m)=(k1*m+k2) mod n
在这里我们规定n=26;其中明文信息为26个小写字母(az)集合,密文为26个大写字母(AZ)集合,然后在对大写字母作进一步操作;秘钥K=(k1,K2)(k1={0,3,5,7,9};K2={0~9});m为小写字母在集合中的位置(如:小写字母为a,则m=0;小写字母若为z,则m=25);通过计算所得结果C为大写字母集合中该位置所对应的大写字母(如:C=0,则所得结果为A;C=25,则所得结果为Z)。
本算法明文信息7个小写字母组成,通过加密算法后得到6字节数据,该数据将作为红外控制码,具体操作如下:
1.从扫描的二维码中顺序取出7小写字母,并提取秘钥(K1为二维码字符串中第一个数字,K2为二维码中最后一个数字);
2.通过计算公式得到对应的7个大写字母,并取对应的ASCII值做如下计算;
3.将所得结果的第一个数据与第二个数据求差(绝对值)作为控制码的第1字节;
4.将第二个数据与第三个数据求和作为控制码的第2字节;
5.将第三个数据与第四个数据求差(绝对值)作为控制码的第3字节;
6.将第四个数据与第五个数据求和作为控制码的第4字节;
7.将第五个数据与第六个数据求差(绝对值)作为控制码的第5字节;
8.将第六个数据与第七个数据求和作为控制码的第6字节;
若明文信息为abcdefg,密钥K=(3,1);
1.通过计算公式(k1*m+k2) %26,计算得到7个对应的大写字母为:BEHKNQT
2.取7个大写字母对应的ASCII数据为:0x42 0x45 0x48 0x4B 0x4E 0x51 0x54
3.计算得到密文第1字节:0x03 =0x45 -0x42
4.密文第2字节:0x8d = 0x45 +0x48
5.密文第3字节:0x03 = 0x4B -0x48
6.密文第4字节:0x99= 0x4B +0x4E
7.密文第5字节:0x03=0x51-0x4E
8.密文第6字节:0xa5=0x51+0x54
9.所以加密计算之后的6字节红外控制码为:0x03 0x8d 0x03 0x99 0x03 0xa5
public class FS_encrypt {
//加密
public static String A_Z = "ABCDEFGHIGKLMNOPQRSTUVWXYZ";
public static String a_z = "abcdefghijklmnopqrstuvwxyz";
public static void main(String[] args) {
String s = "!B1%D1&D45*D2,F2|F4AAA";
// (k1*m+k2) mod n
getResult(s);
}
public static int getK1(String s){
int k1 = 0;
s = s.replaceAll("[^0-9]", "");
k1 = Integer.parseInt(s.charAt(0) + "");
System.out.println("k1="