DES 和 3DES 加解密的使用,加密时,不足8的倍数请补充到8的倍数
package com.crypto;
import java.security.spec.KeySpec;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.DESedeKeySpec;
public class MyDES {
static String DES = "DES/ECB/NoPadding";
static String TriDes = "DESede/ECB/NoPadding";
public static byte[] des_crypt(byte key[], byte data[]) {
try {
KeySpec ks = new DESKeySpec(key);
SecretKeyFactory kf = SecretKeyFactory.getInstance("DES");
SecretKey ky = kf.generateSecret(ks);
Cipher c = Cipher.getInstance(DES);
c.init(Cipher.ENCRYPT_MODE, ky);
return c.doFinal(data);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static byte[] des_decrypt(byte key[], byte data[]) {
try {
KeySpec ks = new DESKeySpec(key);
SecretKeyFactory kf = SecretKeyFactory.getInstance("DES");
SecretKey ky = kf.generateSecret(ks);
Cipher c = Cipher.getInstance(DES);
c.init(Cipher.DECRYPT_MODE, ky);
return c.doFinal(data);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static byte[] trides_crypt(byte key[], byte data[]) {
try {
byte[] k = new byte[24];
int len = data.length;
if(data.length % 8 != 0){
len = data.length - data.length % 8 + 8;
}
byte [] needData = null;
if(len != 0)
needData = new byte[len];
for(int i = 0 ; i< len ; i++){
needData[i] = 0x00;
}
System.arraycopy(data, 0, needData, 0, data.length);
if (key.length == 16) {
System.arraycopy(key, 0, k, 0, key.length);
System.arraycopy(key, 0, k, 16, 8);
} else {
System.arraycopy(key, 0, k, 0, 24);
}
KeySpec ks = new DESedeKeySpec(k);
SecretKeyFactory kf = SecretKeyFactory.getInstance("DESede");
SecretKey ky = kf.generateSecret(ks);
Cipher c = Cipher.getInstance(TriDes);
c.init(Cipher.ENCRYPT_MODE, ky);
return c.doFinal(needData);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static byte[] trides_decrypt(byte key[], byte data[]) {
try {
byte[] k = new byte[24];
int len = data.length;
if(data.length % 8 != 0){
len = data.length - data.length % 8 + 8;
}
byte [] needData = null;
if(len != 0)
needData = new byte[len];
for(int i = 0 ; i< len ; i++){
needData[i] = 0x00;
}
System.arraycopy(data, 0, needData, 0, data.length);
if (key.length == 16) {
System.arraycopy(key, 0, k, 0, key.length);
System.arraycopy(key, 0, k, 16, 8);
} else {
System.arraycopy(key, 0, k, 0, 24);
}
KeySpec ks = new DESedeKeySpec(k);
SecretKeyFactory kf = SecretKeyFactory.getInstance("DESede");
SecretKey ky = kf.generateSecret(ks);
Cipher c = Cipher.getInstance(TriDes);
c.init(Cipher.DECRYPT_MODE, ky);
return c.doFinal(needData);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static void main(String[] args) {
byte k1[] = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, (byte) 0x88 };
byte k2[] = { (byte) 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11 };
byte k24[] = new byte[24];
System.arraycopy(k1, 0, k24, 0, 8);
System.arraycopy(k2, 0, k24, 8, 8);
System.arraycopy(k1, 0, k24, 16, 8);
byte data[] = //
hexToBytes("00000000" + "00000000" + "00000000" + "00000000"
+ "0000c619" + "f4fb7bde" + "51309100" + "00110000"
+ "00000000" + "00000000" + "00000000" + "00000000"
+ "00000000" + "00000000" + "00000000" + "00000000"
+ "00000000" + "00000000" + "00000000" + "00000000"
+ "00000000" + "00000000" + "00000000" + "00000000"
+ "00000000" + "00000000" + "00000000" + "00000000"
+ "00000000" + "00000000" + "00000000" + "00000000");
// data = new byte[8];
// byte des_crypt[] = des_crypt(k1, data);
// byte des_descrypt[] = des_decrypt(k2, des_crypt);
// byte result[] = des_crypt(k1, des_descrypt);
byte result[] = trides_crypt(k24, data);
// byte origin[] = trides_decrypt(k24, result);
System.out.println("Result = " + result);
}
public static byte[] hexToBytes(String str) {
if (str == null) {
return null;
} else if (str.length() < 2) {
return null;
} else {
int len = str.length() / 2;
byte[] buffer = new byte[len];
for (int i = 0; i < len; i++) {
buffer[i] = (byte) Integer.parseInt(str.substring(i * 2,
i * 2 + 2), 16);
}
return buffer;
}
}
}