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

📄 des.java

📁 我学密码学时做的作业
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
package des;
/**
 * <p>Title: Des类</p>
 * <p>Description: 含有des算法核心</p>
 * <p>Copyright: Copyright (c) 2006</p>
 * <p>Company: </p>
 * @author maya
 * @version 1.0
 */
public class Des {

  /**
   * S表,静态16*4二维数组存放s1表
   */
  protected static byte[][] s1 = {
  {14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7},
  {0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8},
  {4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0},
  {15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13 }};

  /**
   * S表,静态16*4二维数组存放s2表
   */
  protected static byte[][] s2 = {
  {15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10},
  {3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5},
  {0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15},
  {13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9 }};

  /**
   * S表,静态16*4二维数组存放s3表
   */
  protected static byte[][] s3= {
  {10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8},
  {13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1},
  {13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7},
  {1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12 }};

  /**
   * S表,静态16*4二维数组存放s4表
   */
  protected static byte[][] s4 = {
  {7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15},
  {13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9},
  {10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4},
  {3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14 }};

  /**
   * S表,静态16*4二维数组存放s5表
   */
  protected static byte[][] s5 = {
  {2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9},
  {14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6},
  {4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14},
  {11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3 }};

  /**
   * S表,静态16*4二维数组存放s6表
   */
  protected static byte[][] s6 = {
  {12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11},
  {10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8},
  {9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6},
  {4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13 }};

  /**
   * S表,静态16*4二维数组存放s7表
   */
  protected static byte[][] s7 = {
  {4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1},
  {13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6},
  {1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2},
  {6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12}};

  /**
   * S表,静态16*4二维数组存放s8表
   */
  protected static byte[][] s8 = {
  {13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7},
  {1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2},
  {7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8},
  {2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11}};

  /**
   * 用于 S盒查找以确定对应的4位二进制数据
   */
  protected static byte[] binary={
        0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1,
        0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1,
        1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1,
        1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1 };


  /**
   * 存储生成的密文或解密所得的明文
   */
  protected byte[] output;

  /**
   * 存储将要加密的明文或将要解密的密文
   */
  protected byte[] workData=new byte[64];
  /**
   * 密钥
   */
  protected SubKey subKey;

  /**
    * 构造函数
    */
   public Des(){

    subKey=new SubKey();

  }

  /**
   * 构造函数
   * @param key String  输入字符串类型密钥
   */
  public Des(String key){
     subKey=new SubKey();
     subKey.setInkey(key);
     subKey.setSubKey();
  }

  /**
   * 设置密钥
   * @param inKey byte[] 输入数组类型的密钥
   */
  public void setKey(byte[] inKey){
      subKey.setInKey(inKey);
      subKey.setSubKey();
  }

  /**
   * 设置要加密/解密的明文或密文
   * @param workData byte[]  64bit要加密/解密的明文或密文
   */
  public void setWorkData(byte[] workData){
      this.workData=workData;
  }

  /**
   * 获取加密/解密的结果
   * @return byte[] 64bit的结果
   */
  public byte[] getOutput(){
      return this.output;
  }

  /**
   * 初始置换
   * @param workData byte[]   要置换的数组
   * @param bufout byte[]     置换的结果数组
   */
  protected void IP(byte[] workData,byte[] bufout){

        bufout[ 0] = workData[57];
        bufout[ 1] = workData[49];
        bufout[ 2] = workData[41];
        bufout[ 3] = workData[33];
        bufout[ 4] = workData[25];
        bufout[ 5] = workData[17];
        bufout[ 6] = workData[ 9];
        bufout[ 7] = workData[ 1];
        bufout[ 8] = workData[59];
        bufout[ 9] = workData[51];
        bufout[10] = workData[43];
        bufout[11] = workData[35];
        bufout[12] = workData[27];
        bufout[13] = workData[19];
        bufout[14] = workData[11];
        bufout[15] = workData[ 3];
        bufout[16] = workData[61];
        bufout[17] = workData[53];
        bufout[18] = workData[45];
        bufout[19] = workData[37];
        bufout[20] = workData[29];
        bufout[21] = workData[21];
        bufout[22] = workData[13];
        bufout[23] = workData[ 5];
        bufout[24] = workData[63];
        bufout[25] = workData[55];
        bufout[26] = workData[47];
        bufout[27] = workData[39];
        bufout[28] = workData[31];
        bufout[29] = workData[23];
        bufout[30] = workData[15];
        bufout[31] = workData[ 7];
        bufout[32] = workData[56];
        bufout[33] = workData[48];
        bufout[34] = workData[40];
        bufout[35] = workData[32];
        bufout[36] = workData[24];
        bufout[37] = workData[16];
        bufout[38] = workData[ 8];
        bufout[39] = workData[ 0];
        bufout[40] = workData[58];
        bufout[41] = workData[50];
        bufout[42] = workData[42];
        bufout[43] = workData[34];
        bufout[44] = workData[26];
        bufout[45] = workData[18];
        bufout[46] = workData[10];
        bufout[47] = workData[ 2];
        bufout[48] = workData[60];
        bufout[49] = workData[52];
        bufout[50] = workData[44];
        bufout[51] = workData[36];
        bufout[52] = workData[28];
        bufout[53] = workData[20];
        bufout[54] = workData[12];
        bufout[55] = workData[ 4];
        bufout[56] = workData[62];
        bufout[57] = workData[54];
        bufout[58] = workData[46];
        bufout[59] = workData[38];
        bufout[60] = workData[30];
        bufout[61] = workData[22];
        bufout[62] = workData[14];
        bufout[63] = workData[ 6];

  }

 /**
  * 32bit到48bit的E扩展
  * @param op byte[]  输入要扩展的32bit数组
  * @param ER byte[]  输出扩展好的48bit数组
  */
 protected void expand32To48bit(byte[] op,byte[] ER){

      ER[ 0] = op[31];
      ER[ 1] = op[ 0];
      ER[ 2] = op[ 1];
      ER[ 3] = op[ 2];
      ER[ 4] = op[ 3];
      ER[ 5] = op[ 4];
      ER[ 6] = op[ 3];
      ER[ 7] = op[ 4];
      ER[ 8] = op[ 5];
      ER[ 9] = op[ 6];
      ER[10] = op[ 7];
      ER[11] = op[ 8];
      ER[12] = op[ 7];
      ER[13] = op[ 8];
      ER[14] = op[ 9];
      ER[15] = op[10];
      ER[16] = op[11];
      ER[17] = op[12];
      ER[18] = op[11];
      ER[19] = op[12];
      ER[20] = op[13];
      ER[21] = op[14];
      ER[22] = op[15];
      ER[23] = op[16];
      ER[24] = op[15];
      ER[25] = op[16];
      ER[26] = op[17];
      ER[27] = op[18];
      ER[28] = op[19];
      ER[29] = op[20];
      ER[30] = op[19];
      ER[31] = op[20];
      ER[32] = op[21];
      ER[33] = op[22];
      ER[34] = op[23];
      ER[35] = op[24];
      ER[36] = op[23];
      ER[37] = op[24];
      ER[38] = op[25];
      ER[39] = op[26];
      ER[40] = op[27];
      ER[41] = op[28];
      ER[42] = op[27];
      ER[43] = op[28];
      ER[44] = op[29];
      ER[45] = op[30];
      ER[46] = op[31];
      ER[47] = op[ 0];
 }

 /**
  * 异或操作,执行: op1^op2=op1
  * @param op1 byte[]  输入/输出
  * @param op2 byte[]  输入
  */
 protected void XOR(byte[] op1,byte[] op2){
          int len=op1.length;
          for (int i = 0; i<len; i++) {
                  op1[i]=(byte)(op1[i] ^ op2[i]);
        }
  }

  /**
   * S盒操作
   * @param ER byte[]   s盒输入
   * @param temp byte[]  s盒输出
   */
  protected void sBox(byte[] ER,byte[] temp){
          /* 8 s-functions */
        int valindex;
        valindex = s1[2*ER[ 0]+ER[ 5]][2*(2*(2*ER[ 1]+ER[ 2])+ ER[ 3])+ER[ 4]];
        valindex = valindex * 4;
        temp[ 0] = (byte)binary[0+valindex];
        temp[ 1] = (byte)binary[1+valindex];
        temp[ 2] = (byte)binary[2+valindex];
        temp[ 3] = (byte)binary[3+valindex];
        valindex = s2[2*ER[ 6]+ER[11]][2*(2*(2*ER[ 7]+ER[ 8])+ ER[ 9])+ER[10]];
        valindex = valindex = valindex * 4;
        temp[ 4] = (byte)binary[0+valindex];
        temp[ 5] = (byte)binary[1+valindex];
        temp[ 6] = (byte)binary[2+valindex];
        temp[ 7] = (byte)binary[3+valindex];
        valindex = s3[2*ER[12]+ER[17]][2*(2*(2*ER[13]+ER[14])+ ER[15])+ER[16]];
        valindex = valindex = valindex * 4;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -