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

📄 desprobabilityalgorithm.java

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

import com.dmgc.security.cipher.util.*;

import java.security.*;

import java.io.*;


/**
 * <p>Title: DMGC SECURITY CIPHER LIB</p>
 * <p>Description: 上海信宁科技有限公司 安全密码库(JAVA version)</p>
 * <p>Copyright: Copyright (c) 2003</p>
 * <p>Company: 上海信宁科技有限公司</p>
 * 本类主要实现DES算法对文件的加解密,文件扩张为8:7.但是可以防制选择密文攻击,实现了概率加密
 * @author 陆荣幸  周渊   潘勇
 * @version 1.0
 */

public class DESProbabilityAlgorithm
    extends DESCore {
  /**
  * 生成一个非零随机字节
  * @return 一个非零随机字节
  */
 private byte getOneNonZeroByte(){
    byte[] c = new byte[1];
    byte ret;
    SecureRandom random = null;
    try {
      random = SecureRandom.getInstance("SHA1PRNG");
    }
    catch (Exception ex) {
      ex.printStackTrace();
    }
    random.nextBytes(c);
    ret = c[0];

    if (ret == 0x00) {
      ret =(byte)( ret | (byte)0x01);
    }

    return ret;
  }

  /**
   * 构造函数
   */
  public DESProbabilityAlgorithm() {
  }

  /**
   * DES概率加密
   * @param inFile 输入文件
   * @param outFile 输出文件
   * @param keys 密钥 字符串 十六进制形式
   * @throws FileNotFoundException 文件没有找到
   * @throws InvalidKeyException  密钥不正确
   * @throws IOException 输入输出异常
   * @throws java.lang.Exception  其它异常
   */
  public void Encrypt(String inFile, String outFile, String keys) throws
      FileNotFoundException, InvalidKeyException, IOException, Exception {
    FileInputStream fInput = null;
    FileOutputStream fOutput = null;
    //
    byte[] keyBytes = DESKeyGenerator.HexStringToByte(keys);

    try {
      //  输入文件
      fInput = new FileInputStream(inFile);
      //  输出文件
      fOutput = new FileOutputStream(outFile);
      //  输入文件的字节总长度
      int byteLength = fInput.available();
      //  剩余字节
      int padLength = 7 - byteLength % 7;
      //
      byte[] c = new byte[8];
      //
      byte[] oo = new byte[8];
      //
      byte[] first7 = DmgcMpInteger.getRandomByteArray(7);
      //
      System.arraycopy(first7, 0, c, 0, 7);
      //
      byte PadCount = (byte) padLength;
      //
      c[7] = PadCount;
      // 文件头生成
      DESSecretKey key0 = new DESSecretKey(keyBytes);
      //加密初始化
      coreInit(key0, false);
      //加密
      coreCrypt(c, 0, oo, 0);
      //写文件
      fOutput.write(oo, 0, 8);
      //
      if (padLength != 0) {
        byte[] pad = DmgcMpInteger.getRandomByteArray(padLength);
        //
        System.arraycopy(pad, 0, c, 0, padLength);
      }
      //
      // 用于填充后面的随机位,由于随机算法太费时间
     // byte myc = c[3];
     byte[] myc = new byte[1];

     SecureRandom random = null;
     try {
      random = SecureRandom.getInstance("SHA1PRNG");
     }
     catch (Exception ex) {
      ex.printStackTrace();
     }
     random.nextBytes(myc);





      //
      byte[] firstbuffer = new byte[7 - padLength];
      //
      int bufferLength = fInput.read(firstbuffer);
      //
      if (bufferLength != (7 - padLength)) {
        throw new Exception("Error");
      }
      //
      System.arraycopy(firstbuffer, 0, c, padLength + 1, 7 - padLength);
      //加密
      coreCrypt(c, 0, oo, 0);
      //写文件
      fOutput.write(oo, 0, 8);
      //
      byte[] buffer = new byte[7168];
      //
      while ( (bufferLength = fInput.read(buffer)) != -1) {
        for (int i = 0; i < bufferLength; i = i + 7) {
          System.arraycopy(buffer, i, c, 1, 7);
//          myc = (byte)((myc+1) % 255);
//          c[0] = myc;
          c[0] = myc[0];
          random.nextBytes(myc);
          coreCrypt(c, 0, oo, 0);
          fOutput.write(oo, 0, 8);

        }
      }
      //
      fInput.close();
      fOutput.close();
    }
    catch (FileNotFoundException ex) {
      ex.printStackTrace();
      throw new FileNotFoundException("File not found exception");
    }
    catch (InvalidKeyException ex) {
      ex.printStackTrace();
      throw new InvalidKeyException("Invalid key exception");
    }
    catch (IOException ex) {
      ex.printStackTrace();
      throw new IOException("IO Exception");
    }
    catch (Exception ex) {
      ex.printStackTrace();
      throw new Exception("Encryption Exception");
    }

  }

  /**
   * DES解密
   * @param inFile 输入文件
   * @param outFile 输出文件
   * @param keys 密钥 字符串  十六进制形式
   * @throws FileNotFoundException 文件没有找到
   * @throws InvalidKeyException  密钥不正确
   * @throws IOException 输入输出异常
   * @throws java.lang.Exception  其它异常
   */
  public void Decrypt(String inFile, String outFile, String keys) throws
      FileNotFoundException, InvalidKeyException, IOException, Exception {

    FileInputStream fInput = null;
    FileOutputStream fOutput = null;
   // byte[] keyBytes = keys.getBytes();

    byte[] keyBytes = DESKeyGenerator.HexStringToByte(keys);

    try {
      //  输入文件
      fInput = new FileInputStream(inFile);
      //  输出文件
      fOutput = new FileOutputStream(outFile);
      //  剩余字节
      int padLength = 0;
      //
      byte[] c = new byte[8];
      //
      byte[] oo = new byte[8];

      // 文件头生成
      DESSecretKey key0 = new DESSecretKey(keyBytes);
      //加密初始化
      coreInit(key0, true);
      //
      int bufferLength = 0;
      //
      byte[] buffer = new byte[8192];
      //
      boolean token = false;
      //
      int offset = 0;
      //
      while ( (bufferLength = fInput.read(buffer)) != -1) {
        for (int i = 0; i < bufferLength; i = i + 8) {
          System.arraycopy(buffer, i, c, 0, 8);
          coreCrypt(c, 0, oo, 0);
          if (token == true) {
            fOutput.write(oo, offset + 1 , 7 - offset);
            if (offset != 0) {
              offset = 0;
            }
          }
          else {
            offset = oo[7];
            token = true;
          }

        }
      }
      //
      fInput.close();
      fOutput.close();

    }

    catch (FileNotFoundException ex) {
      ex.printStackTrace();
      throw new FileNotFoundException("File not found exception");
    }
    catch (InvalidKeyException ex) {
      ex.printStackTrace();
      throw new InvalidKeyException("Invalid key exception");
    }
    catch (IOException ex) {
      ex.printStackTrace();
      throw new IOException("IO Exception");
    }
    catch (Exception ex) {
      ex.printStackTrace();
      throw new Exception("Encryption Exception");
    }

  }


//////////////////////////////////////////////////////////////////////////////////
  /**
   * 用于测试
   * @param args
   */
  public static void main(String[] args) {
    DESProbabilityAlgorithm DESProbabilityAlgorithm1 = new
        DESProbabilityAlgorithm();

  }

}

⌨️ 快捷键说明

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