📄 lfsrcipher.java
字号:
package cipher;
import javax.swing.*;
/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2006</p>
* <p>Company: </p>
* @author srt
* @version 1.0
*/
public class LFSRCipher
extends BaseCipher {
private int feedBackKey;
private int key;
private int lfsrSize;
private int keyStreamCircle;
LFSRCipher() {
super();
}
public int setFeedBackKey(String sFeedBackKey) { //置feedBackKey值
try {
feedBackKey = Integer.parseInt(sFeedBackKey, 16);
}
catch (NumberFormatException e) {
String label = "万分歉意!阁下输入的反馈密钥参数不是有效十六进制数,请重新输入!";
JOptionPane.showMessageDialog(null, label, "小郭襄的提醒",
JOptionPane.ERROR_MESSAGE);
return 0;
}
return 1;
}
public int setKey1(String sKey) { //置十六进制的sKey
try {
key = Integer.parseInt(sKey, 16);
}
catch (NumberFormatException e) {
String label = "万分歉意!阁下输入的初始化密钥参数不是有效十六进制数,请重新输入!";
JOptionPane.showMessageDialog(null, label, "小郭襄的提醒",
JOptionPane.ERROR_MESSAGE);
return 0;
}
return 1;
}
public int setLfsrSize(String lfsrSize) { //置lfsrSize值
int lfsrSizeTemp = 0;
try {
Integer.valueOf(lfsrSize);
}
catch (NumberFormatException e) {
String label = "万分歉意!阁下输入的LFSR大小参数不是整数,请重新输入!";
JOptionPane.showMessageDialog(null, label, "小郭襄的提醒",
JOptionPane.ERROR_MESSAGE);
return 0;
}
lfsrSizeTemp = Integer.parseInt(lfsrSize);
if (lfsrSizeTemp % 4 != 0) {
String label = "万分歉意!阁下输入的LFSR大小参数不是4的倍数,请重新输入!";
JOptionPane.showMessageDialog(null, label, "小郭襄的提醒",
JOptionPane.ERROR_MESSAGE);
return 0;
}
this.lfsrSize = lfsrSizeTemp;
return 1;
}
public int setKeyStreamCircle(String sKeyStreamCircle) { //置密钥流大小
try {
Integer.valueOf(sKeyStreamCircle);
}
catch (NumberFormatException e) {
String label = "万分歉意!阁下输入的密钥流大小参数不是整数,请重新输入!";
JOptionPane.showMessageDialog(null, label, "小郭襄的提醒",
JOptionPane.ERROR_MESSAGE);
return 0;
}
keyStreamCircle = Integer.parseInt(sKeyStreamCircle);
return 1;
}
private int countOf1(int i) { //计算i中的二进制表示里含有1的个数。如果个数为奇数,返回1;如果是偶数,返回0
String stemp = Integer.toBinaryString(i);
int sum = 0;
for (int j = 0; j < stemp.length(); j++) {
if (stemp.charAt(j) == '1') {
sum++;
}
}
return sum % 2;
}
public char generateKey() { //产生一个密钥流字符
String sKeyTemp = Integer.toBinaryString(key);
int temp = key & feedBackKey;
key = key >> 1;
if (countOf1(temp) != 0) { //说明异或后的值是1
key = 1 << (lfsrSize - 1) | key;
}
return sKeyTemp.charAt(sKeyTemp.length() - 1);
}
public String generateKeyStream() { //产生指定大小为keyStreamCircle的密钥流
StringBuffer sbtemp = new StringBuffer();
for (int i = 0; i < keyStreamCircle; i++) {
sbtemp.append(generateKey());
}
return sbtemp.toString();
}
private String generateKeyStream(int size) { //产生指定大小为size的密钥流
StringBuffer sbtemp = new StringBuffer();
for (int i = 0; i < size; i++) {
sbtemp.append(generateKey());
}
return sbtemp.toString();
}
private short BinaryStringToShort(String s) { //把二进制字符串s转化为相应的Short型的值
double j = 7;
short sum = 0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '1') {
sum += (short) Math.pow(2.0, j);
}
j--;
}
return sum;
}
private String shortToBinary(short a) { //把short型a转化为相应的二进制字符串
StringBuffer sbtemp = new StringBuffer("00000000");
String stemp = Integer.toBinaryString(a);
sbtemp.setLength(8 - stemp.length());
sbtemp.append(stemp);
return sbtemp.toString();
}
int decipher() {
short CiphertextTemp;
short keyTemp;
StringBuffer sbPlaintext = new StringBuffer();
for (int k = 0; k < sCiphertext.length(); k = k + 8) {
CiphertextTemp = BinaryStringToShort(sCiphertext.substring(k, k + 8));
keyTemp = BinaryStringToShort(generateKeyStream(8));
CiphertextTemp = (short) (CiphertextTemp ^ keyTemp);
sbPlaintext.append( (char) CiphertextTemp);
}
sPlaintext = sbPlaintext.toString();
return 1;
}
int encipher() {
short temp, temp1;
StringBuffer sbCiphertext = new StringBuffer();
for (int i = 0; i < sPlaintext.length(); i++) {
temp = BinaryStringToShort(generateKeyStream(8));
temp1 = (short) (temp ^ sPlaintext.charAt(i));
sbCiphertext.append(shortToBinary(temp1));
}
sCiphertext = sbCiphertext.toString();
return 1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -