⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lfsrcipher.java

📁 LFSRCipher 经典的LFSRCipher加密解密算法源代码 JAVA编写
💻 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 + -