您的位置:首页 > 其它

DES生成密钥文件实现加密解密

2012-06-27 14:44 981 查看
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.SecureRandom;
import java.util.UUID;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;

public class Encode {
public static void main(String[] args) {
gennerCodeFile();// 生成密钥文件
String str = "我爱你";// 要加密的文字
SecureRandom ensr = new SecureRandom();
SecureRandom desr = new SecureRandom();
try {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:\\key.des"));
SecretKey sk = (SecretKey) ois.readObject();
ois.close();
// 加密
Cipher ench = Cipher.getInstance("DES/ECB/PKCS5Padding");
ench.init(Cipher.ENCRYPT_MODE, sk, ensr);
byte[] result = ench.doFinal(str.getBytes());
// 把加密的文件转成16进制字符串
String enstr = convertBytesToStr(result);
System.out.println("根据加密文件加密后的字符串:" + enstr);
// 加密完成

// 解密
// 把16进制字符串转成byte数组
byte[] enarr = convertStrToBytes(enstr);
Cipher dech = Cipher.getInstance("DES/ECB/PKCS5Padding");
dech.init(Cipher.DECRYPT_MODE, sk, desr);
byte[] deresult = dech.doFinal(enarr);
System.out.println("解密后的文字:" + new String(deresult));
// 完成
} catch (Exception e) {
e.printStackTrace();
}
}

//生成密钥文件的方法
public static void gennerCodeFile() {
String codeStr = UUID.randomUUID().toString();//密钥字符串(可以自定义) 如'aaaaaaaaaaaaa'
try {
DESKeySpec dks = new DESKeySpec(codeStr.getBytes());
SecretKey sk = SecretKeyFactory.getInstance("DES").generateSecret(
dks);
FileOutputStream fos = new FileOutputStream("D:\\key.des", false);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(sk);
oos.close();
} catch (Exception e) {
e.printStackTrace();
}
}

//将16进制字符串转换成字节数组
public static byte[] convertStrToBytes(String digits) {

ByteArrayOutputStream baos = new ByteArrayOutputStream();
for (int i = 0; i < digits.length(); i += 2) {
char c1 = digits.charAt(i);
if ((i + 1) >= digits.length())
throw new IllegalArgumentException("hexUtil.odd");
char c2 = digits.charAt(i + 1);
byte b = 0;
if ((c1 >= '0') && (c1 <= '9'))
b += ((c1 - '0') * 16);
else if ((c1 >= 'a') && (c1 <= 'f'))
b += ((c1 - 'a' + 10) * 16);
else if ((c1 >= 'A') && (c1 <= 'F'))
b += ((c1 - 'A' + 10) * 16);
else
throw new IllegalArgumentException("hexUtil.bad");
if ((c2 >= '0') && (c2 <= '9'))
b += (c2 - '0');
else if ((c2 >= 'a') && (c2 <= 'f'))
b += (c2 - 'a' + 10);
else if ((c2 >= 'A') && (c2 <= 'F'))
b += (c2 - 'A' + 10);
else
throw new IllegalArgumentException("hexUtil.bad");
baos.write(b);
}
return (baos.toByteArray());

}

//将字节数组转换成16进制字符串
public static String convertBytesToStr(byte bytes[]) {

StringBuffer sb = new StringBuffer(bytes.length * 2);
for (int i = 0; i < bytes.length; i++) {
sb.append(convertDigit((int) (bytes[i] >> 4)));
sb.append(convertDigit((int) (bytes[i] & 0x0f)));
}
return (sb.toString());

}

private static char convertDigit(int value) {

value &= 0x0f;
if (value >= 10)
return ((char) (value - 10 + 'a'));
else
return ((char) (value + '0'));

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息