理解线性反馈移位寄存器的基本构造,编程实现一个简单的线性反馈移位寄存器并用输出序列对给定明文实施逐比特加密。
给定前一状态的输出,将该输出的线性函数再用作输入的移位寄存器。异或运算是最常见的单比特线性函数:对寄存器的某些位进行异或操作后作为输入,再对寄存器中的各比特进行整体移位
1.联结多项式: p = 1 + x + x^7
2.联结多项式: p = 1 + x^2 + x^5 + x^7
1 .p = 1 + x + x^7
package czx.xupt.lfsr;
import java.util.Scanner;
/**
* #Author:槐序二四
* #Time:2019/12/18 15:37
* #Motto:人间荒唐市侩 不如山中作怪.
*/
public class LFSR {
public static void main(String[] args) {
System.out.println("请输入线性反馈移位寄存器的初始状态(7位二进制):");
Scanner scanner = new Scanner(System.in);
String s = scanner.nextLine();
//打印输出序列的第一位
StringBuffer stringBuffer = new StringBuffer(s);
String substring3 = stringBuffer.substring(stringBuffer.length() - 1, stringBuffer.length());
System.out.println("输出位是:"+substring3);
System.out.println("序列开始");
int num = 0;
while (true) {
num++;
//截取出s0和s1
String substring = stringBuffer.substring(stringBuffer.length() - 1, stringBuffer.length());
String substring1 = stringBuffer.substring(stringBuffer.length() - 2, stringBuffer.length() - 1);
int i1 = Integer.parseInt(substring);
int i2 = Integer.parseInt(substring1);
//s0和s1进行异或
int i = i1 ^ i2;
//移除旧s0
StringBuffer delete = stringBuffer.delete(stringBuffer.length() - 1, stringBuffer.length());
//将异或的值给s6
StringBuffer insert = stringBuffer.insert(0, i);
//打印新序列
System.out.print(stringBuffer+" 输出位是:");
//打印输出位
String substring2 = insert.substring(insert.length() - 1, insert.length());
System.out.println(substring2);
//结束条件
String s1 = new String(insert);
if (s1.equals(s)) {
System.out.println("周期是:" + num);
break;
}
}
/**
* 加密
*/
System.out.println("请输入你想要加密的内容:");
Scanner scanner1 = new Scanner(System.in);
String s1 = scanner1.nextLine();
//将字符串的内容存进字符数组
char[] chars = s1.toCharArray();
String s2 = "";
String[] strings = new String[s1.length()];
for (int i = 0; i < chars.length; i++) {
//将字符数字存的字母转换成二进制
s2 = Integer.toBinaryString(chars[i]);
//将二进制数存入一个String数组
strings[i] = s2;
}
//定义字符串,逐比特异或后用来拼串
String s3 = "";
//定义String数组,用来存加密好的串
String[] strings1 = new String[s1.length()];
//遍历String数组,取出每个字母所对应的二进制数
for (int i = 0; i < strings.length; i++) {
String substring2 = s1.substring(i, i + 1);
System.out.print(substring2 + ":");
for (int j = 0; j < strings[i].length(); j++) {
//截取数字,进行逐比特加密
String substring = strings[i].substring(j, j + 1);
int i1 = Integer.parseInt(substring);
String substring1 = s.substring(j, j + 1);
int i2 = Integer.parseInt(substring1);
System.out.print(i1 ^ i2);
s3 += (i1 ^ i2) + "";
}
//存储拼好的串
strings1[i] = s3;
s3 = "";
System.out.println();
}
/**
* 解密
*/
String s4 = "";
//存解密好的串
String[] strings2 = new String[s1.length()];
for (int i = 0; i < strings1.length; i++) {
for (int j = 0; j < strings1[i].length(); j++) {
String substring = strings1[i].substring(j, j + 1);
int i1 = Integer.parseInt(substring);
String substring1 = s.substring(j, j + 1);
int i2 = Integer.parseInt(substring1);
s4 += (i1 ^ i2);
}
strings2[i] = s4;
s4 = "";
}
System.out.println("明文是:");
for (String s5 : strings2) {
int i = Integer.parseInt(s5, 2);
char c = (char) i;
System.out.println(s5+":"+c);
}
}
}
输出结果:
请输入线性反馈移位寄存器的初始状态(7位二进制):
1101011
输出位是:1
序列开始
0110101 输出位是:1
1011010 输出位是:0
1101101 输出位是:1
1110110 输出位是:0
1111011 输出位是:1
0111101 输出位是:1
1011110 输出位是:0
1101111 输出位是:1
0110111 输出位是:1
0011011 输出位是:1
0001101 输出位是:1
1000110 输出位是:0
1100011 输出位是:1
0110001 输出位是:1
1011000 输出位是:0
0101100 输出位是:0
0010110 输出位是:0
1001011 输出位是:1
0100101 输出位是:1
1010010 输出位是:0
1101001 输出位是:1
1110100 输出位是:0
0111010 输出位是:0
1011101 输出位是:1
1101110 输出位是:0
1110111 输出位是:1
0111011 输出位是:1
0011101 输出位是:1
1001110 输出位是:0
1100111 输出位是:1
0110011 输出位是:1
0011001 输出位是:1
1001100 输出位是:0
0100110 输出位是:0
1010011 输出位是:1
0101001 输出位是:1
1010100 输出位是:0
0101010 输出位是:0
1010101 输出位是:1
1101010 输出位是:0
1110101 输出位是:1
1111010 输出位是:0
1111101 输出位是:1
1111110 输出位是:0
1111111 输出位是:1
0111111 输出位是:1
0011111 输出位是:1
0001111 输出位是:1
0000111 输出位是:1
0000011 输出位是:1
0000001 输出位是:1
1000000 输出位是:0
0100000 输出位是:0
0010000 输出位是:0
0001000 输出位是:0
0000100 输出位是:0
0000010 输出位是:0
1000001 输出位是:1
1100000 输出位是:0
0110000 输出位是:0
0011000 输出位是:0
0001100 输出位是:0
0000110 输出位是:0
1000011 输出位是:1
0100001 输出位是:1
1010000 输出位是:0
0101000 输出位是:0
0010100 输出位是:0
0001010 输出位是:0
1000101 输出位是:1
1100010 输出位是:0
1110001 输出位是:1
1111000 输出位是:0
0111100 输出位是:0
0011110 输出位是:0
1001111 输出位是:1
0100111 输出位是:1
0010011 输出位是:1
0001001 输出位是:1
1000100 输出位是:0
0100010 输出位是:0
1010001 输出位是:1
1101000 输出位是:0
0110100 输出位是:0
0011010 输出位是:0
1001101 输出位是:1
1100110 输出位是:0
1110011 输出位是:1
0111001 输出位是:1
1011100 输出位是:0
0101110 输出位是:0
1010111 输出位是:1
0101011 输出位是:1
0010101 输出位是:1
1001010 输出位是:0
1100101 输出位是:1
1110010 输出位是:0
1111001 输出位是:1
1111100 输出位是:0
0111110 输出位是:0
1011111 输出位是:1
0101111 输出位是:1
0010111 输出位是:1
0001011 输出位是:1
0000101 输出位是:1
1000010 输出位是:0
1100001 输出位是:1
1110000 输出位是:0
0111000 输出位是:0
0011100 输出位是:0
0001110 输出位是:0
1000111 输出位是:1
0100011 输出位是:1
0010001 输出位是:1
1001000 输出位是:0
0100100 输出位是:0
0010010 输出位是:0
1001001 输出位是:1
1100100 输出位是:0
0110010 输出位是:0
1011001 输出位是:1
1101100 输出位是:0
0110110 输出位是:0
1011011 输出位是:1
0101101 输出位是:1
1010110 输出位是:0
1101011 输出位是:1
周期是:127
请输入你想要加密的内容:
caizixin0424
c:0001000
a:0001010
i:0000010
z:0010001
i:0000010
x:0010011
i:0000010
n:0000101
0:000101
4:000001
2:000111
4:000001
明文是:
1100011:c
1100001:a
1101001:i
1111010:z
1101001:i
1111000:x
1101001:i
1101110:n
110000:0
110100:4
110010:2
110100:4
2.p = 1 + x^2 + x^5 + x^7
package czx.xupt.lfsr;
import java.util.Scanner;
/**
* #Author:槐序二四
* #Time:2019/12/25 16:46
* #Motto:人间荒唐市侩 不如山中作怪.
*/
public class LFSR2 {
public static void main(String[] args) {
System.out.println("请输入线性反馈移位寄存器的初始状态(7位二进制):");
Scanner scanner = new Scanner(System.in);
String s = scanner.nextLine();
//打印输出序列的第一位
StringBuffer stringBuffer = new StringBuffer(s);
String substring3 = stringBuffer.substring(stringBuffer.length() - 1, stringBuffer.length());
System.out.println("输出位是:" + substring3);
System.out.println("序列开始");
int num = 0;
while (true) {
num++;
//截取出s0
String substring = stringBuffer.substring(stringBuffer.length() - 1, stringBuffer.length());
//截取s2
String substring1 = stringBuffer.substring(stringBuffer.length() - 3, stringBuffer.length() - 2);
//截取s5
String substring4 = stringBuffer.substring(stringBuffer.length() - 6, stringBuffer.length() - 5);
int i1 = Integer.parseInt(substring);
int i2 = Integer.parseInt(substring1);
int i3 = Integer.parseInt(substring4);
//s0和s1进行异或
int i = i1 ^ i2 ^ i3;
//移除旧s0
StringBuffer delete = stringBuffer.delete(stringBuffer.length() - 1, stringBuffer.length());
//将异或的值给s6
StringBuffer insert = stringBuffer.insert(0, i);
//打印新序列
System.out.print(stringBuffer + " 输出位是:");
//打印输出位
String substring2 = insert.substring(insert.length() - 1, insert.length());
System.out.println(substring2);
//结束条件
String s1 = new String(insert);
if (s1.equals(s)) {
System.out.println("周期是:" + num);
break;
}
}
/**
* 加密
*/
System.out.println("请输入你想要加密的内容:");
Scanner scanner1 = new Scanner(System.in);
String s1 = scanner1.nextLine();
//将字符串的内容存进字符数组
char[] chars = s1.toCharArray();
String s2 = "";
String[] strings = new String[s1.length()];
for (int i = 0; i < chars.length; i++) {
//将字符数字存的字母转换成二进制
s2 = Integer.toBinaryString(chars[i]);
//将二进制数存入一个String数组
strings[i] = s2;
}
//定义字符串,逐比特异或后用来拼串
String s3 = "";
//定义String数组,用来存加密好的串
String[] strings1 = new String[s1.length()];
//遍历String数组,取出每个字母所对应的二进制数
for (int i = 0; i < strings.length; i++) {
String substring2 = s1.substring(i, i + 1);
System.out.print(substring2 + ":");
for (int j = 0; j < strings[i].length(); j++) {
//截取数字,进行逐比特加密
String substring = strings[i].substring(j, j + 1);
int i1 = Integer.parseInt(substring);
String substring1 = s.substring(j, j + 1);
int i2 = Integer.parseInt(substring1);
System.out.print(i1 ^ i2);
s3 += (i1 ^ i2) + "";
}
//存储拼好的串
strings1[i] = s3;
s3 = "";
System.out.println();
}
/**
* 解密
*/
String s4 = "";
//存解密好的串
String[] strings2 = new String[s1.length()];
for (int i = 0; i < strings1.length; i++) {
for (int j = 0; j < strings1[i].length(); j++) {
String substring = strings1[i].substring(j, j + 1);
int i1 = Integer.parseInt(substring);
String substring1 = s.substring(j, j + 1);
int i2 = Integer.parseInt(substring1);
s4 += (i1 ^ i2);
}
strings2[i] = s4;
s4 = "";
}
System.out.println("明文是:");
for (String s5 : strings2) {
int i = Integer.parseInt(s5, 2);
char c = (char) i;
System.out.println(s5 + ":" + c);
}
}
}
输出结果:
请输入线性反馈移位寄存器的初始状态(7位二进制):
1101011
输出位是:1
序列开始
0110101 输出位是:1
1011010 输出位是:0
0101101 输出位是:1
1010110 输出位是:0
1101011 输出位是:1
周期是:5
请输入你想要加密的内容:
caizixin0424
c:0001000
a:0001010
i:0000010
z:0010001
i:0000010
x:0010011
i:0000010
n:0000101
0:000101
4:000001
2:000111
4:000001
明文是:
1100011:c
1100001:a
1101001:i
1111010:z
1101001:i
1111000:x
1101001:i
1101110:n
110000:0
110100:4
110010:2
110100:4