一、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”);