一、DES
package md;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Hex;
public class DesUtil {
public static byte[] secretkey()
{
SecretKey secretKey=null;
try {
//密鑰生成器
KeyGenerator keyGenerator=KeyGenerator.getInstance("DES");
//設定密鑰的位數
keyGenerator.init(56);
//生成密鑰
secretKey=keyGenerator.generateKey();
} catch (NoSuchAlgorithmException e) {
// TODO 自動生成的 catch 塊
e.printStackTrace();
}
//傳回位元組數組
return secretKey.getEncoded();
}
public static byte[] Encrypt_data(byte[] key,byte[] data)
{
byte[] cipherByte=null;
SecretKey secretKey=new SecretKeySpec(key, "DES");
//使用Cipher進行加密
try {
//也可以設定為Cipher cipher=Cipher.getInstance("DES/ECB/PKCS5Padding");
Cipher cipher=Cipher.getInstance("DES");
try {
//設定加密和解密的模式
cipher.init(Cipher.ENCRYPT_MODE,secretKey);
} catch (InvalidKeyException e) {
// TODO 自動生成的 catch 塊
e.printStackTrace();
}
try {
cipherByte=cipher.doFinal(data);
} catch (IllegalBlockSizeException e) {
// TODO 自動生成的 catch 塊
e.printStackTrace();
} catch (BadPaddingException e) {
// TODO 自動生成的 catch 塊
e.printStackTrace();
}
} catch (NoSuchAlgorithmException e) {
// TODO 自動生成的 catch 塊
e.printStackTrace();
} catch (NoSuchPaddingException e) {
// TODO 自動生成的 catch 塊
e.printStackTrace();
}
return cipherByte;
}
public static byte[] DesCrypt(byte[] key,byte[] data)
{SecretKey secretKey=new SecretKeySpec(key, "DES");
//同樣的也是通過Cipher進行加密和解密
Cipher cipher=null;
byte[] final_Data=null;
try {
cipher = Cipher.getInstance("DES");
} catch (NoSuchAlgorithmException e) {
// TODO 自動生成的 catch 塊
e.printStackTrace();
} catch (NoSuchPaddingException e) {
// TODO 自動生成的 catch 塊
e.printStackTrace();
}
try {
cipher.init(cipher.DECRYPT_MODE,secretKey);
try {
final_Data= cipher.doFinal(data);
} catch (IllegalBlockSizeException e) {
// TODO 自動生成的 catch 塊
e.printStackTrace();
} catch (BadPaddingException e) {
// TODO 自動生成的 catch 塊
e.printStackTrace();
}
} catch (InvalidKeyException e) {
// TODO 自動生成的 catch 塊
e.printStackTrace();
}
return final_Data;
}
public static String encodeTOhex(byte[] c,boolean lowerCase)
{
return Hex.encodeHexString(c, lowerCase);
}
}
調用以及實作結果:
package md;
public class Des {
public static void main(String[] args) {
String cString="yangdidi";
byte[] secretkey=DesUtil.secretkey();
//生成初始化密鑰
String key_data=DesUtil.encodeTOhex(secretkey, true);
System.out.println("産生的密鑰為----"+key_data);
byte[] string=DesUtil.Encrypt_data(secretkey, cString.getBytes());
System.out.println("進行加密後的内容是-----"+DesUtil.encodeTOhex(string, true));
//進行解密
byte[] string2=DesUtil.DesCrypt(secretkey, string);
System.out.println("進行解密後的内容結果是----"+new String(string2));
}
}
産生的密鑰為----cb58ab2a70a8028f
進行加密後的内容是-----9f5d723eb3665ca08a77262a66ea41ca
進行解密後的内容結果是----yangdidi
二、3DES
package md;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Hex;
public class Desede{
public static byte[] initkey() throws Exception
{
KeyGenerator keyGenerator=KeyGenerator.getInstance("DESede");
keyGenerator.init(168);
SecretKey secrekey=keyGenerator.generateKey();
return secrekey.getEncoded();
}
public static byte[] EncryptData(byte[] data,byte[] key) throws Exception
{
SecretKey secretKey= new SecretKeySpec(key,"DESede");
//産生密鑰
Cipher cipher=Cipher.getInstance("DESede");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] encryptData=cipher.doFinal(data);
return encryptData;
}
public static byte[] Decrypt(byte[] data,byte[] key)throws Exception
{
SecretKey secretKey= new SecretKeySpec(key, "DESede");
Cipher cipher=Cipher.getInstance("DESede");
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] content=cipher.doFinal(data);
return content;
}
public static String byteToHex(byte[] data)
{
return Hex.encodeHexString(data, true);
}
public static void main(String args[]) throws Exception
{
String cString="yangdidi";
byte[] key=Desede.initkey();
//初始化key
System.out.println("産生的密鑰為"+Desede.byteToHex(key));
byte[] encryptData=Desede.EncryptData(cString.getBytes(),key);
System.out.println("加密的後内容為"+Desede.byteToHex(encryptData));
byte[] DecryptData=Desede.Decrypt(encryptData, key);
System.out.println("解密的後内容為"+new String(DecryptData));
}
}
實作結果;
産生的密鑰為f41340076d57ab54b9da54ec7f16293820e9d931cb9be9fd
加密的後内容為96328664860faf5087a4ae01823834f0
解密的後内容為yangdidi
三、AES(直接修改keyGenerator、Cipher)中的參數為AES
略
四、過程總結
1、建立SecretKey對象
keyGenerator keygenerator=KeyGenerator.getInstance("相關的算法名稱");
keygenerator.init(生成密鑰的位數);
Secretkey secrekey=keygenerator.generator();
secrekeygetEncoded();
2、通過Cipher來對資料進行加密和解密
因為密鑰一般都是通過位元組數組來進行存儲,那麼一般都是通過傳入byte[] 來建立出Secretkey
SecreKey secrekey =new SecretKeySpec(key,"相關的算法名稱");
Cipher cipher=Cipher.getInstance("相關的算法名稱”);
cipher.init(加密模式為Cipher.Encrypt_MODE,secretkey);
//如果為解密為 cipher.init(解密模式為Cipher.Decrypt_MODE,secretkey);
byte[] encryptData=cipher.doFinal(data);
3、如果需要設定相關的模式
Cipher cipher=Cipher.getInstance("相關的算法名稱/EBC/PKCS5Padding”);