1.DES对称加密算法
(1)DES概述
(2)DES应用场景
(3)DES算法实现
package com.java.security.des;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import org.apache.commons.codec.binary.Hex;
import org.junit.Test;
public class DESTest {
private String text="Jasper is a good student!";
@Test
public void testJDKDES(){
try {
//生成Key
KeyGenerator keyGenerator=KeyGenerator.getInstance("DES");
keyGenerator.init(56);//JDKDES实现--密钥长度默认是56位
SecretKey secretKey=keyGenerator.generateKey();
byte[] bytesKey=secretKey.getEncoded();
//Key转换
DESKeySpec desKeySpec=new DESKeySpec(bytesKey);
SecretKeyFactory factory=SecretKeyFactory.getInstance("DES");
SecretKey convertSecretKey=factory.generateSecret(desKeySpec);
//加密
Cipher cipher=Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey);
byte[] result=cipher.doFinal(text.getBytes());
System.out.println("加密:"+Hex.encodeHexString(result));
//解密
cipher.init(Cipher.DECRYPT_MODE, convertSecretKey);
result=cipher.doFinal(result);
System.out.println("解密:"+new String(result));
} catch (Exception e) {
e.printStackTrace();
}
}
}
(4)DES算法弊端
a>违反柯克霍夫原则(数据的安全基于密钥而不是算法的保密)
b>安全问题
2.3重DES对称加密算法
(1)3重DES概述
(2)3重DES算法实现
package com.java.security.des;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import org.apache.commons.codec.binary.Hex;
import org.junit.Test;
public class My3DESTest {
private String text="Jasper is a good student!";
@Test
public void testJDK3DES(){
try {
//生成Key
KeyGenerator keyGenerator=KeyGenerator.getInstance("DESede");
//keyGenerator.init(56);//JDKDES实现--密钥长度默认是56位
keyGenerator.init(new SecureRandom());//根据加密方式随机生成一个长度
SecretKey secretKey=keyGenerator.generateKey();
byte[] bytesKey=secretKey.getEncoded();
//Key转换
DESedeKeySpec desKeySpec=new DESedeKeySpec(bytesKey);
SecretKeyFactory factory=SecretKeyFactory.getInstance("DESede");
SecretKey convertSecretKey=factory.generateSecret(desKeySpec);
//加密
Cipher cipher=Cipher.getInstance("DESede/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey);
byte[] result=cipher.doFinal(text.getBytes());
System.out.println("加密:"+Hex.encodeHexString(result));
//解密
cipher.init(Cipher.DECRYPT_MODE, convertSecretKey);
result=cipher.doFinal(result);
System.out.println("解密:"+new String(result));
} catch (Exception e) {
e.printStackTrace();
}
}
}
(3)3重DES弊端
a>速度慢
b>效率低
3.AES算法(推荐使用)
(1)AES算法概述
(2)AES算法应用场景
(3)AES算法实现
package com.java.security.aes;
import java.security.Key;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.Hex;
import org.junit.Test;
public class AESTest {
private String text="Jasper is a good student!";
@Test
public void testJDKAES(){
try {
//生成Key
KeyGenerator keyGenerator=KeyGenerator.getInstance("AES");
keyGenerator.init(new SecureRandom());
SecretKey secretKey=keyGenerator.generateKey();
byte[] bytesKey=secretKey.getEncoded();
//转换Key
Key key=new SecretKeySpec(bytesKey, "AES");
//加密
Cipher cipher=Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] result=cipher.doFinal(text.getBytes());
System.out.println("加密1:"+Base64.encodeBase64String(result));
System.out.println("加密2:"+Hex.encodeHexString(result));
//解密
cipher.init(Cipher.DECRYPT_MODE, key);
result=cipher.doFinal(result);
System.out.println("解密:"+new String(result));
} catch (Exception e) {
e.printStackTrace();
}
}
}
4.PBE对称加密算法(已有加密算法的整合)
(1)PBE算法概述
(2)PBE算法实现
package com.java.security.pbe;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;
import org.apache.commons.codec.binary.Hex;
import org.junit.Test;
public class PBETest {
private String text="Jasper is a good student!";
@Test
public void testJDKPBE(){
try {
//初始化盐
SecureRandom random=new SecureRandom();
byte[] salt=random.generateSeed(8);
//口令与密钥
String password="Jasper";
PBEKeySpec pbeKeySpec=new PBEKeySpec(password.toCharArray());
SecretKeyFactory factory=SecretKeyFactory.getInstance("PBEWITHMD5andDES");
SecretKey key=factory.generateSecret(pbeKeySpec);
//加密
PBEParameterSpec parameterSpec=new PBEParameterSpec(salt, 100);
Cipher cipher=Cipher.getInstance("PBEWITHMD5andDES");
cipher.init(Cipher.ENCRYPT_MODE, key, parameterSpec);
byte[] result=cipher.doFinal(text.getBytes());
System.out.println("加密:"+Hex.encodeHexString(result));
//解密
cipher.init(Cipher.DECRYPT_MODE, key,parameterSpec);
result=cipher.doFinal(result);
System.out.println("解密:"+new String(result));
} catch (Exception e) {
e.printStackTrace();
}
}
}