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

📄 tripledescore.java

📁 对称和非对称加密
💻 JAVA
字号:
package com.dmgc.security.cipher.symmetic.tripledes;

import java.security.InvalidKeyException;
import java.security.Key;
import java.io.*;

/**
 * <p>Title: DMGC SECURITY CIPHER LIB</p>
 * <p>Description: 上海信宁科技有限公司 安全密码库(JAVA version)</p>
 * <p>Copyright: Copyright (c) 2003</p>
 * <p>Company: 上海信宁科技有限公司</p>
 * * <p>
 * 为了克服DES缺点,可使用三重DES方式来实现
 * <p>
 * 三重DES密钥编码方式是24字节数组,包括三个8字节的单个DES密钥,依次为
 *  - K1, K2 and K3.
 * 加密与解密执行如下:
 * <ul>
 *   <li> C = E<sub>K3</sub>(D<sub>K2</sub>(E<sub>K1</sub>(P)))
 *   <li> P = D<sub>K1</sub>(E<sub>K2</sub>(D<sub>K3</sub>(C)))
 * </ul>
 * <p>
 * @author 陆荣幸  周渊   潘勇
 * @version 1.0
 */

abstract public class TripleDESCore {

  /**
   * DES算法块大小
   */

  private static final int BLOCK_SIZE = 8;

  /**
   * 三重DES密钥长度
   */

  private static final int KEY_LENGTH = 24;
  /**
   * 三重DES可选长度
   */

  private static final int ALT_KEY_LENGTH = 21;
  /**
   * DES密钥长度
   */

  private static final int DES_KEY_LENGTH = 8;

  /**
   * 实例的DES1
   */
  private BasicDES des1;
  /**
   * 实例的DES2
   */

  private BasicDES des2;
  /**
   * 实例的DES3
   */

  private BasicDES des3;

  /**
   * 构造函数
   */
  public TripleDESCore() {
    des1 = new BasicDES();
    des2 = new BasicDES();
    des3 = new BasicDES();

  }

  /**
   * 三重DES算法初始化
   * @param key
   * @param decrypt
   * @throws InvalidKeyException
   */
  protected void coreInit(Key key, boolean decrypt) throws InvalidKeyException {
    byte[] userkey = key.getEncoded();
    if (userkey == null)
      throw new InvalidKeyException("Null user key");

    int len = 0;

    if (userkey.length == KEY_LENGTH) {
      len = 8;
    }
    else if (userkey.length == ALT_KEY_LENGTH) {
      len = 7;
    }
    else {
      throw new InvalidKeyException("Invalid user key length");
    }

    byte[] k = new byte[len];
    System.arraycopy(userkey, 0, k, 0, len);
    BasicDESSecretKey sk = new BasicDESSecretKey(k);
    des1.coreInit(sk, decrypt);

    System.arraycopy(userkey, len, k, 0, len);
    sk = new BasicDESSecretKey(k);
    des2.coreInit(sk, !decrypt);

    System.arraycopy(userkey, len + len, k, 0, len);
    sk = new BasicDESSecretKey(k);
    des3.coreInit(sk, decrypt);

    if (decrypt) {
      BasicDES des = des1;
      des1 = des3;
      des3 = des;
    }
  }

  /**
   * 执行核心的加密解密
   */
  protected void coreCrypt(byte[] in, int inOffset, byte[] out, int outOffset) {
    des1.coreCrypt(in, inOffset, out, outOffset);
    des2.coreCrypt(out, outOffset, out, outOffset);
    des3.coreCrypt(out, outOffset, out, outOffset);
  }

  /////////////////////////////////////////////////////////////////////////////
  /**
   * 加密文件
   * @param inFile 输入文件 由路径与文件名构成
   * @param outFile 输出文件 由路径与文件名构成
   * @param keys 密钥,由字符串构成 十六进制形式
   */
  abstract public void Encrypt(String inFile, String outFile, String keys) throws
      FileNotFoundException, InvalidKeyException, IOException, Exception;

  /**
   * 解密文件
   * @param inFile 输入文件 由路径与文件名构成
   * @param outFile 输出文件 由路径与文件名构成
   * @param keys 密钥,由字符串构成 十六进制形式
   */

  abstract public void Decrypt(String inFile, String outFile, String keys) throws
      FileNotFoundException, InvalidKeyException, IOException, Exception;

}

⌨️ 快捷键说明

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