常用的Java加密技術和核心代碼系列:
Base64以及關於Base64遇到的坑 https://blog.csdn.net/haponchang/article/details/106094115
消息摘要算法 https://blog.csdn.net/haponchang/article/details/106096542
對稱加密(DES、3DES、AES、PBE) https://blog.csdn.net/haponchang/article/details/106096766
非對稱加密(RSA、DH) https://blog.csdn.net/haponchang/article/details/106097998
數字簽名證書 https://blog.csdn.net/haponchang/article/details/106098779
概念
採用單鑰密碼系統的加密方法,同一個密鑰可以同時用作信息的加密和解密,這種加密方法稱爲對稱加密,也稱爲單密鑰加密。而因爲加密和解密都使用同一個密鑰,如何把密鑰安全地傳遞到解密者手上就成了必須要解決的問題。當然,安全性較低帶來的優點就是優計算量小、加密速度快、加密效率高。
常見對稱加密算法有DES、3DES、AES、PBE
DES
DES,全稱爲“Data Encryption Standard”,中文名爲“數據加密標準”,是一種使用密鑰加密的塊算法。DES 算法爲密碼體制中的對稱密碼體制,又被稱爲美國數據加密標準,是 1972 年美國 IBM 公司研製的對稱密碼體制加密算法。 明文按 64 位進行分組,密鑰長 64 位,密鑰事實上是 56 位參與 DES 運算(第8、16、24、32、40、48、56、64 位是校驗位, 使得每個密鑰都有奇數個 1)分組後的明文組和 56 位的密鑰按位替代或交換的方法形成密文組的加密方法。
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;
public class DESStrategy {
private Cipher cipher;
private SecretKey generateKey;
public String encode(String src) {
try {
KeyGenerator keyGenerator = KeyGenerator.getInstance ("DES");
keyGenerator.init (56);//size
SecretKey secretKey = keyGenerator.generateKey ( );
byte[] keyBytes = secretKey.getEncoded ( );
DESKeySpec desKeySpec = new DESKeySpec (keyBytes);
SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance ("DES");
generateKey = secretKeyFactory.generateSecret (desKeySpec);
cipher = Cipher.getInstance ("DES/ECB/PKCS5Padding");
cipher.init (Cipher.ENCRYPT_MODE, generateKey);
byte[] resultBytes = cipher.doFinal (src.getBytes ( ));
return Hex.encodeHexString (resultBytes);
} catch (Exception e) {
e.printStackTrace ( );
}
return null;
}
public String decode(String src) {
try {
cipher.init (Cipher.DECRYPT_MODE, generateKey);
byte[] result = Hex.decodeHex (src.toCharArray ( ));
return new String (cipher.doFinal (result));
} catch (Exception e) {
e.printStackTrace ( );
}
return null;
}
}
3DES
3DES,也就是“Triple DES”,中文名“三重數據加密算法”,它相當於是對每個數據塊應用三次 DES 加密算法。由於計算機運算能力的增強,原版 DES 密碼的密鑰長度變得容易被暴力破解;3DES 即是設計用來提供一種相對簡單的方法,即通過增加 DES 的密鑰長度來避免類似的攻擊,而不是設計一種全新的塊密碼算法。
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;
public class _3DESStrategy {
private Cipher cipher;
private SecretKey generateKey;
public String encode(String src) {
try {
KeyGenerator keyGenerator = KeyGenerator.getInstance ("DESede");
keyGenerator.init (168);//size
SecretKey secretKey = keyGenerator.generateKey ( );
byte[] keyBytes = secretKey.getEncoded ( );
DESedeKeySpec desKeySpec = new DESedeKeySpec (keyBytes);
SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance ("DESede");
generateKey = secretKeyFactory.generateSecret (desKeySpec);
cipher = Cipher.getInstance ("DESede/ECB/PKCS5Padding");
cipher.init (Cipher.ENCRYPT_MODE, generateKey);
byte[] resultBytes = cipher.doFinal (src.getBytes ( ));
return Hex.encodeHexString (resultBytes);
} catch (Exception e) {
e.printStackTrace ( );
}
return null;
}
public String decode(String src) {
try {
cipher.init (Cipher.DECRYPT_MODE, generateKey);
byte[] result = Hex.decodeHex (src.toCharArray ( ));
return new String (cipher.doFinal (result));
} catch (Exception e) {
e.printStackTrace ( );
}
return null;
}
}
AES
AES,全稱爲“Advanced Encryption Standard”,中文名“高級加密標準”,在密碼學中又稱 Rijndael 加密法,是美國聯邦政府採用的一種區塊加密標準。AES 加密算法作爲新一代的數據加密標準匯聚了強安全性、高性能、高效率、易用和靈活等優點。AES 設計有三個密鑰長度:128,192,256 位。相對而言,AES 的 128 密鑰比 DES 的 56 密鑰強了 1021 倍。
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 AESStrategy {
private Cipher cipher;
private SecretKey generateKey;
public String encode(String src) {
try {
KeyGenerator keyGenerator = KeyGenerator.getInstance ("AES");
keyGenerator.init (128);//size
SecretKey secretKey = keyGenerator.generateKey ( );
byte[] keyBytes = secretKey.getEncoded ( );
generateKey = new SecretKeySpec (keyBytes, "AES");
cipher = Cipher.getInstance ("AES/ECB/PKCS5Padding");
cipher.init (Cipher.ENCRYPT_MODE, generateKey);
byte[] resultBytes = cipher.doFinal (src.getBytes ( ));
return Hex.encodeHexString (resultBytes);
} catch (Exception e) {
e.printStackTrace ( );
}
return null;
}
public String decode(String src) {
try {
cipher.init (Cipher.DECRYPT_MODE, generateKey);
byte[] result = Hex.decodeHex (src.toCharArray ( ));
return new String (cipher.doFinal (result));
} catch (Exception e) {
e.printStackTrace ( );
}
return null;
}
}
PBE
PBE,全稱爲“Password Base Encryption”,中文名“基於口令加密”,是一種基於密碼的加密算法,其特點是使用口令代替了密鑰,而口令由用戶自己掌管,採用隨機數雜湊多重加密等方法保證數據的安全性。
PBE算法沒有密鑰的概念,把口令當做密鑰了。因爲密鑰長短影響算法安全性,還不方便記憶,這裏我們直接換成我們自己常用的口令就大大不同了,便於我們的記憶。但是單純的口令很容易被字典法給窮舉出來,所以我們這裏給口令加了點“鹽”,這個鹽和口令組合,想破解就難了。同時我們將鹽和口令合併後用消息摘要算法進行迭代很多次來構建密鑰初始化向量的基本材料,使破譯更加難了。
public String encode(String src){
try{
SecureRandom secureRandom = new SecureRandom();
byte[] salt = secureRandom.generateSeed(8);
String password = "amuro";
PBEKeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray());
SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("PBEWITHMD5andDES");
generateKey = secretKeyFactory.generateSecret(pbeKeySpec);
pbeParameterSpec = new PBEParameterSpec(salt, 100);
cipher = Cipher.getInstance("PBEWITHMD5andDES");
cipher.init(Cipher.ENCRYPT_MODE, generateKey, pbeParameterSpec);
byte[] resultBytes = cipher.doFinal(src.getBytes());
return Hex.encodeHexString(resultBytes);
}
catch(Exception e){
e.printStackTrace();
}
return null;
}
public String decode(String src){
try{
cipher.init(Cipher.DECRYPT_MODE, generateKey, pbeParameterSpec);
byte[] result = Hex.decodeHex(src.toCharArray());
return new String(cipher.doFinal(result));
}
catch(Exception e){
e.printStackTrace();
}
return null;
}