📄 tripledescore.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 + -