理解线性反馈移位寄存器的基本构造,编程实现一个简单的线性反馈移位寄存器并用输出序列对给定明文实施逐比特加密。
输入一串字符串,利用产生的随机序列对字符串的每个字符逐个逐比特异或,产生的数,ASCII值变为对应的字符。
加密代码:
package com.jingfei.Encryptoin.com.jingfei.xulie;
import java.math.BigInteger;
import java.util.Scanner;
public class XuLieEncrypte {
public static void main(String[] args) {
//String string = "jingfei03163079";
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你要加密的序列:");
String string = scanner.nextLine();
StringBuffer numStr = new StringBuffer("1100");//序列初始值
char[] chars1 = new char[string.length()];//存储加密解密后的字符
final int n = 7;//每个字符二进制的位数
String encryptionString = cryption(string, chars1,numStr);//加密
System.out.println("\n加密结果为:"+encryptionString);
}
public static String cryption(String string, char[] chars1, StringBuffer numStr) {
String randomNum = getRandomNum(string.length() * 7, numStr);
for (int i = 0; i < string.length(); i++) {
String substring = randomNum.substring(i * 7, (i + 1) * 7);//随机序列分割
int j = string.charAt(i) ^ binaryToDecimal(substring);//逐个字符与随机序列异或
chars1[i]= (char) j;
}
return String.valueOf(chars1);
}
public static String getRandomNum(int n, StringBuffer numStr) {
for (int j = 0; j < n; j++) {
int i = numStr.charAt(0) ^ numStr.charAt(3);
numStr.insert(0, i);
}
numStr = numStr.reverse();
return numStr.substring(0, numStr.length() - 4);
}
public static String decimalToBinary(int decimalSource) {
BigInteger bi = new BigInteger(String.valueOf(decimalSource));
//转换成BigInteger类型 return bi.toString(2); //参数2指定的是转化成X进制,默认10进制 }
String b1 = bi.toString(2);
if (b1.length() == 6) {
return "0".concat(b1);
} else {
return b1;
}
}
public static int binaryToDecimal(String binarySource) {
BigInteger bi = new BigInteger(binarySource, 2);
//转换为BigInteger类型 return Integer.parseInt(bi.toString()); //转换成十进制 }
return Integer.parseInt(bi.toString());
}
}
解密代码:
package com.jingfei.Encryptoin.com.jingfei.xulie;
import java.math.BigInteger;
import java.util.Scanner;
public class XuLieDecrypte {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你要解密的序列:");
String string = scanner.nextLine();
StringBuffer numStr = new StringBuffer("1100");//序列初始值
char[] chars1 = new char[string.length()];//存储加密解密后的字符
final int n = 7;//每个字符二进制的位数
String decryptionString = cryption(string,numStr,chars1);//解密
System.out.println("\n解密结果为:"+decryptionString);
}
public static String cryption(String string,StringBuffer numStr,char[] chars1) {
String randomNum = getRandomNum(string.length() * 7, numStr);
for (int i = 0; i < string.length(); i++) {
String substring = randomNum.substring(i * 7, (i + 1) * 7);//随机序列分割
int j = string.charAt(i) ^ binaryToDecimal(substring);//逐个字符与随机序列异或
chars1[i]= (char) j;
}
if(chars1.length==string.length()){return String.valueOf(chars1);}
else {return String.valueOf(chars1).substring(0,string.length());}
}
public static String getRandomNum(int n, StringBuffer numStr) {
for (int j = 0; j < n; j++) {
int i = numStr.charAt(0) ^ numStr.charAt(3);
numStr.insert(0, i);
}
numStr = numStr.reverse();
return numStr.substring(0, numStr.length() - 4);
}
public static String decimalToBinary(int decimalSource) {
BigInteger bi = new BigInteger(String.valueOf(decimalSource));
//转换成BigInteger类型 return bi.toString(2); //参数2指定的是转化成X进制,默认10进制 }
String b1 = bi.toString(2);
if (b1.length() == 6) {
return "0".concat(b1);
} else {
return b1;
}
}
public static int binaryToDecimal(String binarySource) {
BigInteger bi = new BigInteger(binarySource, 2);
//转换为BigInteger类型 return Integer.parseInt(bi.toString()); //转换成十进制 }
return Integer.parseInt(bi.toString());
}
}
代码基本功能能实现。但有一点小问题是:当加密出来的密文有换行字符时,将密文复制到解密代码的输入中时,由于scanner.nextline(),不能将换行字符以及换行之后的字符录入字符串,所以解密时候会丢失换行字符和换行之后的字符对应的明文。
例如你如果加密的时候输入jingfei03163079就会出现上述情况!
谢谢!