📄 desutil.java
字号:
package com.zrx.Util;
import java.io.*;
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
public class DesUtil {
public static void main(String[] args) {
String files = "e://test.txt.tdes";
File file = new File(files);
try {
String key = getKeyAuto();
System.out.println(key);
// DesUtil.decrypt(file,
// "F286378AAE43C24C07A2E9CBB04AA1455EB919F75D9B4ABF");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
public static void encrypt(File fileIn, String sKey) {
try {
if (sKey.length() == 48) {
byte[] bytK1 = getKeyByStr(sKey.substring(0, 16));
byte[] bytK2 = getKeyByStr(sKey.substring(16, 32));
byte[] bytK3 = getKeyByStr(sKey.substring(32, 48));
FileInputStream fis = new FileInputStream(fileIn);
byte[] bytIn = new byte[(int) fileIn.length()];
for (int i = 0; i < fileIn.length(); i++) {
bytIn[i] = (byte) fis.read();
}
// 加密
byte[] bytOut = encryptByDES(encryptByDES(encryptByDES(bytIn,
bytK1), bytK2), bytK3);
String fileOut = fileIn.getPath() + ".tdes";
FileOutputStream fos = new FileOutputStream(fileOut);
for (int i = 0; i < bytOut.length; i++) {
fos.write((int) bytOut[i]);
}
fos.close();
// 加密成功
} else {
// 加密失败
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 解密函数 输入: 要解密的文件,密码(由0-F组成,共48个字符,表示3个8位的密码)如:
* AD67EA2F3BE6E5ADD368DFE03120B5DF92A8FD8FEC2F0746 其中: AD67EA2F3BE6E5AD
* DES密码一 D368DFE03120B5DF DES密码二 92A8FD8FEC2F0746 DES密码三 输出:
* 对输入的文件解密后,保存到用户指定的文件中。
*/
public static void decrypt(File fileIn, String sKey,String fileOuts) {
try {
if (sKey.length() == 48) {
String strPath = fileIn.getPath();
if (strPath.substring(strPath.length() - 5).toLowerCase()
.equals(".tdes")) {
strPath = strPath.substring(0, strPath.length() - 5);
} else {
// 不是合法的加密文件
return;
}
byte[] bytK1 = getKeyByStr(sKey.substring(0, 16));
byte[] bytK2 = getKeyByStr(sKey.substring(16, 32));
byte[] bytK3 = getKeyByStr(sKey.substring(32, 48));
FileInputStream fis = new FileInputStream(fileIn);
byte[] bytIn = new byte[(int) fileIn.length()];
for (int i = 0; i < fileIn.length(); i++) {
bytIn[i] = (byte) fis.read();
}
// 解密
byte[] bytOut = decryptByDES(decryptByDES(decryptByDES(bytIn,
bytK3), bytK2), bytK1);
// 定义一个解密路径
File fileOut = new File(fileOuts);
fileOut.createNewFile();
FileOutputStream fos = new FileOutputStream(fileOut);
for (int i = 0; i < bytOut.length; i++) {
fos.write((int) bytOut[i]);
}
fos.close();
// 提示成功
} else {
// 提示失败
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 用DES方法加密输入的字节 bytKey需为8字节长,是加密的密码
*/
public static byte[] encryptByDES(byte[] bytP, byte[] bytKey)
throws Exception {
DESKeySpec desKS = new DESKeySpec(bytKey);
SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
SecretKey sk = skf.generateSecret(desKS);
Cipher cip = Cipher.getInstance("DES");
cip.init(Cipher.ENCRYPT_MODE, sk);
return cip.doFinal(bytP);
}
/**
* 用DES方法解密输入的字节 bytKey需为8字节长,是解密的密码
*/
public static byte[] decryptByDES(byte[] bytE, byte[] bytKey)
throws Exception {
DESKeySpec desKS = new DESKeySpec(bytKey);
SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
SecretKey sk = skf.generateSecret(desKS);
Cipher cip = Cipher.getInstance("DES");
cip.init(Cipher.DECRYPT_MODE, sk);
return cip.doFinal(bytE);
}
/**
* 输入密码的字符形式,返回字节数组形式。 如输入字符串:AD67EA2F3BE6E5AD
* 返回字节数组:{173,103,234,47,59,230,229,173}
*/
public static byte[] getKeyByStr(String str) {
byte[] bRet = new byte[str.length() / 2];
for (int i = 0; i < str.length() / 2; i++) {
Integer itg = new Integer(16 * getChrInt(str.charAt(2 * i))
+ getChrInt(str.charAt(2 * i + 1)));
bRet[i] = itg.byteValue();
}
return bRet;
}
/**
* 计算一个16进制字符的10进制值 输入:0-F
*/
public static int getChrInt(char chr) {
int iRet = 0;
if (chr == "0".charAt(0))
iRet = 0;
if (chr == "1".charAt(0))
iRet = 1;
if (chr == "2".charAt(0))
iRet = 2;
if (chr == "3".charAt(0))
iRet = 3;
if (chr == "4".charAt(0))
iRet = 4;
if (chr == "5".charAt(0))
iRet = 5;
if (chr == "6".charAt(0))
iRet = 6;
if (chr == "7".charAt(0))
iRet = 7;
if (chr == "8".charAt(0))
iRet = 8;
if (chr == "9".charAt(0))
iRet = 9;
if (chr == "A".charAt(0))
iRet = 10;
if (chr == "B".charAt(0))
iRet = 11;
if (chr == "C".charAt(0))
iRet = 12;
if (chr == "D".charAt(0))
iRet = 13;
if (chr == "E".charAt(0))
iRet = 14;
if (chr == "F".charAt(0))
iRet = 15;
return iRet;
}
private static String getByteStr(byte[] byt) {
String strRet = "";
for (int i = 0; i < byt.length; i++) {
// System.out.println(byt[i]);
strRet += getHexValue((byt[i] & 240) / 16);
strRet += getHexValue(byt[i] & 15);
}
return strRet;
}
private static String getHexValue(int s) {
String sRet = null;
switch (s) {
case 0:
sRet = "0";
break;
case 1:
sRet = "1";
break;
case 2:
sRet = "2";
break;
case 3:
sRet = "3";
break;
case 4:
sRet = "4";
break;
case 5:
sRet = "5";
break;
case 6:
sRet = "6";
break;
case 7:
sRet = "7";
break;
case 8:
sRet = "8";
break;
case 9:
sRet = "9";
break;
case 10:
sRet = "A";
break;
case 11:
sRet = "B";
break;
case 12:
sRet = "C";
break;
case 13:
sRet = "D";
break;
case 14:
sRet = "E";
break;
case 15:
sRet = "F";
}
return sRet;
}
/***************************************************************************
* 自动生成序列值
*
* @throws NoSuchAlgorithmException
*/
public static String getKeyAuto() throws NoSuchAlgorithmException {
KeyGenerator kg = KeyGenerator.getInstance("DES");
kg.init(56);
Key ke = kg.generateKey();
byte[] bytK1 = ke.getEncoded();
ke = kg.generateKey();
byte[] bytK2 = ke.getEncoded();
ke = kg.generateKey();
byte[] bytK3 = ke.getEncoded();
return getByteStr(bytK1) + getByteStr(bytK2) + getByteStr(bytK3);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -