java 加密之對稱加密算法


簡介

對稱加密是指加密和解密使用相同密鑰的加密算法。

在對稱加密算法中,數據發送方將明文和加密密鑰一起經過算法處理后,使其變成復雜的密文發送出去。接收方收到密文后,若想解讀原文,則需要使用加密用過的密鑰及相同算法的逆算法對密文進行解密,才能使其恢復成可讀明文。

在大多數的對稱算法中,加密密鑰和解密密鑰是相同的,所以它要求發送方和接收方在安全通信之前,商定一個密鑰。對稱算法的安全性依賴於密鑰,密鑰泄漏意味着消息有被解密的風險,所以密鑰的保密性對通信的安全性至關重要。


常見算法

DES(Data Encryption Standard)數據加密標准:JDK實現的算法密鑰長度為56位。

3DES:三重DES,JDK實現的算法密鑰長度為112和168,默認168位。

AES:代替DES的算法,目前使用最多的對稱加密算法,官方並未報告被破解。AES 通常用於移動通信系統加密以及基於SSH協議的軟件。JDK實現的AES密鑰長度有128,192,256,默認128位。

此外還有 TDEA算法,Blowfish算法,RC5算法,IDEA算法,PBE算法等,目前使用 3DES 和 AES 較為廣泛。


DES

DES 的 java 實現:

public class MyDES {
//算法名稱
private static final String KEY_ALGORITHM = "DES";
//算法名稱/加密模式/填充方式
//DES共有四種工作模式,ECB:電子密碼本模式、CBC:加密分組鏈接模式、CFB:加密反饋模式、OFB:輸出反饋模式
private static final String CIPHER_ALGORITHM = "DES/ECB/PKCS5Padding";
//明文
private static final String str = "i am guo feng";

public static void main(String[] args) {

try {
//獲得DES生成者實例
KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_ALGORITHM);
//指定長度默認值,密鑰長度必須的8的倍數
keyGenerator.init(56);
//生成一個密鑰
SecretKey Key = keyGenerator.generateKey();
//得到加密私鑰的byte數組
byte[] byteKey = Key.getEncoded();

//key轉換
DESKeySpec desKeySpec = new DESKeySpec(byteKey);
SecretKeyFactory factory = SecretKeyFactory.getInstance(KEY_ALGORITHM);
SecretKey secretKey = factory.generateSecret(desKeySpec);

//加密
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] result = cipher.doFinal(str.getBytes());
System.out.println(new BigInteger(1, result).toString(16));

//解密
cipher.init(Cipher.DECRYPT_MODE, secretKey);
result = cipher.doFinal(result);
System.out.println(new String(result));
} catch (Exception e) {
e.printStackTrace();
}
}
}

輸出:

a9e281145f8d8fb48d63de3f7c11104f
i am guo feng

應用場景時序圖:

這里寫圖片描述


3DES 的 java 實現

代碼基本和 DES 類似:

public class My3DES {
//算法名稱
private static final String KEY_ALGORITHM = "DESede";
//算法名稱/加密模式/填充方式
//DES共有四種工作模式,ECB:電子密碼本模式、CBC:加密分組鏈接模式、CFB:加密反饋模式、OFB:輸出反饋模式
private static final String CIPHER_ALGORITHM = "DESede/ECB/PKCS5Padding";
//明文
private static final String str = "i am guo feng,iamguofeng@163.com";

public static void main(String[] args) {

try {
//獲得DES生成者實例
KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_ALGORITHM);
//指定長度默認值,密鑰長度必須的8的倍數
//keyGenerator.init(168);
keyGenerator.init(new SecureRandom());//也可以SecureRandom生成默認長度的key
//生成一個密鑰
SecretKey Key = keyGenerator.generateKey();
//得到加密私鑰的byte數組
byte[] byteKey = Key.getEncoded();

//key轉換
DESedeKeySpec desKeySpec = new DESedeKeySpec(byteKey);
SecretKeyFactory factory = SecretKeyFactory.getInstance(KEY_ALGORITHM);
SecretKey secretKey = factory.generateSecret(desKeySpec);

//加密
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] result = cipher.doFinal(str.getBytes());
System.out.println(new BigInteger(1, result).toString(16));

//解密
cipher.init(Cipher.DECRYPT_MODE, secretKey);
result = cipher.doFinal(result);
System.out.println(new String(result));
} catch (Exception e) {
e.printStackTrace();
}
}
}

輸出:

eefc742ff23c036719726193b72b7b0195d75ca448a89d5c9e12108530d5992fa012f12830dfcac1
i am guo feng,iamguofeng@163.com

AES

AES 的 java 實現:

public class MyAES {
private static final String KEY_ALGORITHM = "AES";
private static final String CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";
private static final String str = "i am guo feng,iamguofeng@163.com";

public static void main(String[] args) {
try {
//生成密鑰
KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_ALGORITHM);
keyGenerator.init(new SecureRandom());
SecretKey secretKey = keyGenerator.generateKey();
byte[] keyBytes = secretKey.getEncoded();

//轉換密鑰
Key key = new SecretKeySpec(keyBytes, KEY_ALGORITHM);

//加密
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] result = cipher.doFinal(str.getBytes());
System.out.println(new BigInteger(1, result).toString(16));

//解密
cipher.init(Cipher.DECRYPT_MODE, key);
result = cipher.doFinal(result);
System.out.println(new String(result));
} catch (Exception e) {
e.printStackTrace();
}
}
}

輸出:

dff98b1937c318fd0749f04087feb1552fb3a4ef423a78cadc8f1c799c194ddf37f4f6a63d565bd2ba015be09fe5fd71
i am guo feng,iamguofeng@163.com

AES和DES的應用場景時序圖相同。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com