安全
DES
- DES加密是最常用的對(duì)稱加密算法之一空郊。
- 所謂“對(duì)稱加密”指的就是從明文加密到密文和從密文解密到明文用的都是相同的一套密鑰與之相對(duì)應(yīng)的就是“非對(duì)稱加密”。
- 其它常見的對(duì)稱加密算法還有IDEA具帮、RC2避咆、RC4镶骗、SKIPJACK、RC5厉碟、AES等喊巍。
- DES加密可以給字節(jié)數(shù)組加密,也可以給文件加密箍鼓。
- 當(dāng)然在加解密之前我們需要獲取密鑰崭参,獲取密鑰可以通過我們給定的字節(jié)數(shù)組或者生成一個(gè)隨機(jī)的密鑰。密鑰其實(shí)就是一個(gè)8個(gè)長度的字節(jié)數(shù)組款咖。
/**
* 生成一個(gè)隨機(jī)的DES密鑰
* @throws Exception
*/
public static Key randomKey() throws Exception{
KeyGenerator generator = KeyGenerator.getInstance("DES");
SecretKey key = generator.generateKey();
byte[] arrKey = key.getEncoded();
System.out.println(Arrays.toString(arrKey));
System.out.println("密鑰Base64轉(zhuǎn)碼:" + Base64.encodeBase64String(arrKey));
System.out.println("密鑰16進(jìn)制顯示:" + Hex.encodeHexString(arrKey));
return key;
}
/**
* 根據(jù)byte數(shù)組獲得密鑰對(duì)象
* @param arrKey
* @return
* @throws Exception
*/
public static Key getKey(byte[] arrKey) throws Exception {
//實(shí)例化DES密鑰材料
DESKeySpec spec = new DESKeySpec(arrKey);
//實(shí)例化DES密鑰工廠
SecretKeyFactory factory = SecretKeyFactory.getInstance("DES");
return factory.generateSecret(spec);
}
從DESKeySpec類的構(gòu)造函數(shù)中可以看出何暮,只能傳入一個(gè)8位的字節(jié)數(shù)組實(shí)例化。
public DESKeySpec(byte abyte0[])
throws InvalidKeyException
{
this(abyte0, 0);
}
public DESKeySpec(byte abyte0[], int i)
throws InvalidKeyException
{
if(abyte0.length - i < 8)
{
throw new InvalidKeyException("Wrong key size");
} else
{
a = new byte[8];
System.arraycopy(abyte0, i, a, 0, 8);
return;
}
}
獲得密鑰后我們就可以進(jìn)行字節(jié)數(shù)組和文件的加解密工作之剧。
/**
* 加密字節(jié)數(shù)組形式的數(shù)據(jù)
* @param data
* @param key
* @return
* @throws Exception
*/
public static byte[] encryptByteArr(byte[] data, Key key) throws Exception {
// using DES in ECB mode
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
// 用密匙初始化Cipher對(duì)象
cipher.init(Cipher.ENCRYPT_MODE, key);
return cipher.doFinal(data);
}
/**
* 解密字節(jié)數(shù)組形式的密文
* @param data
* @param key
* @return
* @throws Exception
*/
public static byte[] decryptByteArr(byte[] data, Key key) throws Exception {
// using DES in ECB mode
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
// 用密匙初始化Cipher對(duì)象
cipher.init(Cipher.DECRYPT_MODE, key);
return cipher.doFinal(data);
}
/**
* DES加密文件
* @param file 明文文件
* @param dest 加密后的密文文件
* @param key 密鑰
* @throws NoSuchAlgorithmException
* @throws NoSuchPaddingException
* @throws InvalidKeyException
* @throws IOException
*/
public static void encryptFile(File file, File dest, Key key)
throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IOException {
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE, key);
InputStream is = new FileInputStream(file);
OutputStream out = new FileOutputStream(dest);
CipherInputStream cis = new CipherInputStream(is, cipher);
byte[] buffer = new byte[1024];
int r;
while ((r = cis.read(buffer)) > 0) {
out.write(buffer, 0, r);
}
cis.close();
is.close();
out.close();
}
/**
* DES解密文件
* @param file 需要解密的密文文件
* @param dest 解密出的明文文件
* @param key 密鑰
* @throws NoSuchAlgorithmException
* @throws NoSuchPaddingException
* @throws InvalidKeyException
* @throws IOException
*/
public static void decryptFile(File file, File dest, Key key)
throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException,
IOException {
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.DECRYPT_MODE, key);
InputStream is = new FileInputStream(file);
OutputStream out = new FileOutputStream(dest);
CipherInputStream cis = new CipherInputStream(is, cipher);
byte[] buffer = new byte[1024];
int r;
while ((r = cis.read(buffer)) > 0) {
out.write(buffer, 0, r);
}
cis.close();
is.close();
out.close();
}