文章目錄
- 一、什么是加密算法?
- 二、常見的加密算法有哪些?
- 2.1 對稱加密
- 2.2 非對稱加密
- 2.3 哈希算法
- 三、加密算法代碼展示
- 3.1 MD5加密
- 3.2 秘鑰加密
- 3.3 AES加密解密
- 四、加密算法的使用場景
一、什么是加密算法?
加密算法是一種通過數學方法將明文轉換為密文的過程,其目的是防止未經授權的訪問。它的核心特征有:機密性、完整性、認證性和不可否認性。
二、常見的加密算法有哪些?
加密算法主要分為以下兩類:
2.1 對稱加密
對稱加密使用相同的密鑰進行加密和解密,特點是速度快、適合處理明文數據。常見的對稱加密算法包括:
- DES:早期標準,現因密鑰長度短(56位)已不安全。
- AES:當前主流算法,支持128、192、256位密鑰,廣泛應用于SSL/TLS、磁盤加密等。
2.2 非對稱加密
非對稱加密使用一對密鑰(公鑰和私鑰),公鑰加密,私鑰解密,安全性高但速度較慢。常見算法包括:
- RSA:基于大整數分解難題,廣泛用于數字簽名和密鑰交換。
- ECC:基于橢圓曲線數學,密鑰長度短但安全性高,適合資源受限環境。
2.3 哈希算法
哈希算法將任意長度的數據映射為固定長度的哈希值,用于數據完整性驗證和密碼存儲。常見算法包括:
- MD5:128位,已不推薦用于安全場景,因存在碰撞風險。
- SHA-256:256位,SHA-2家族成員,廣泛用于區塊鏈和數字證書。
- bcrypt:專為密碼哈希設計,安全性高。
三、加密算法代碼展示
3.1 MD5加密
public static void main(String[] args) throws NoSuchAlgorithmException, UnsupportedEncodingException {String content = "a";int hash = content.hashCode();// 根據算法名稱獲取MD5算法對象MessageDigest messageDigest = MessageDigest.getInstance("MD5");// 獲取MD5算法對象byte[] bytes = content.getBytes("UTF-8");// 對字節數組進行摘要messageDigest.update(bytes);// 獲取摘要后的結果byte[] resultArray = messageDigest.digest();System.out.println("原文 = " + content);System.out.println("原文字節數組 = " + Arrays.toString(bytes));System.out.println("密文字節數組 = " + Arrays.toString(resultArray));System.out.println("密文 = " + Tools.toHexString(resultArray));}
運行結果如下:
原文 = a
原文字節數組 = [97]
密文字節數組 = [12, -63, 117, -71, -64, -15, -74, -88, 49, -61, -103, -30, 105, 119, 38, 97]
密文 = 0cc175b9c0f1b6a831c399e269772661
3.2 秘鑰加密
public static void main(String[] args) {try {Mac mac = Mac.getInstance("HmacMD5");// 初始化,傳入密鑰KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacMD5");// 生成(隨機)秘鑰SecretKey secretKey = keyGenerator.generateKey();mac.init(secretKey);mac.update("hello".getBytes());byte[] bytes = mac.doFinal();// 將密文轉為16進制字符串String result = Tools.toHexString(bytes);System.out.println("密文:" + result);} catch (NoSuchAlgorithmException e) {throw new RuntimeException(e);} catch (InvalidKeyException e) {throw new RuntimeException(e);}}
3.3 AES加密解密
public class AESKit {public static void main(String[] args) {// AES加密:128位:16字節String msg = "我本將心向明月奈何明月照溝渠";String encrypt = AESKit.encrypt("1234567890abcdef", msg);System.out.println("原文 = " + msg);System.out.println("密文 = " + encrypt);String decrypt = AESKit.decrypt("1234567890abcdef", encrypt);System.out.println("解密 = " + decrypt);}// 加密public static String encrypt(String key, String content) {try {// 1.創建加密對象Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");SecretKey secretKey = new SecretKeySpec(key.getBytes("UTF-8"), "AES");// 2.初始化加密對象cipher.init(Cipher.ENCRYPT_MODE, secretKey);// 3.加密byte[] bytes= cipher.doFinal(content.getBytes("UTF-8"));// 4.返回密文return Base64.getEncoder().encodeToString(bytes);} catch (Exception e) {throw new RuntimeException(e);}}// 解密public static String decrypt(String key, String encryptMsg) {try {// 1.創建加密對象Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");SecretKey secretKey = new SecretKeySpec(key.getBytes("UTF-8"), "AES");// 2.初始化解密對象cipher.init(Cipher.DECRYPT_MODE, secretKey);// 3.解密byte[] bytes = Base64.getDecoder().decode(encryptMsg);byte[] resultBytes = cipher.doFinal(bytes);return new String(resultBytes);} catch (Exception e) {throw new RuntimeException(e);}}
}
測試結果如下:
原文 = 我本將心向明月奈何明月照溝渠
密文 = C6lGmU3jvX+7At/0IXXXyKCr2WWolqXCPlDLySdXvDga8a4Bf/GTpsb7PANKcNGL
解密 = 我本將心向明月奈何明月照溝渠
四、加密算法的使用場景
加密算法在以下領域發揮重要作用:
網絡安全:SSL/TLS協議使用RSA和AES保護HTTPS通信。
數據存儲:磁盤加密使用AES保護敏感數據。
區塊鏈:SHA-256用于比特幣的挖礦和交易驗證。
身份認證:RSA和ECC用于數字簽名,確保身份可信。