深入淺出 Android AES 加密解密:從理論到實戰
在現代移動應用中,數據安全是不可忽視的一環。無論是用戶隱私保護,還是敏感信息的存儲與傳輸,加密技術都扮演著重要角色。本文將以 AES(Advanced Encryption Standard)加密算法 為核心,帶你深入了解其在 Android 中的應用,并通過代碼示例講解如何實現 AES-128 加密解密。
一、為什么選擇 AES?
AES 是目前最廣泛使用的對稱加密算法之一,具有以下優勢:
- 安全性高:AES 支持 128、192 和 256 位密鑰長度。本文聚焦于 128 位加密,它在效率和安全性之間取得了平衡。
- 性能優秀:AES 是一種高效的塊加密算法,適合移動設備的資源約束環境。
- 廣泛支持:在 Android 平臺上,AES 加密已內置支持,開發者無需額外引入第三方庫。
二、AES-128 加密原理
AES 使用對稱加密方式,意味著加密和解密使用同一密鑰。其核心原理如下:
- 輸入數據(明文):需要加密的原始信息。
- 密鑰:用于加密和解密的固定長度字符串(16 字節對應 128 位)。
- 加密模式:AES 提供多種工作模式,如 ECB、CBC、CFB 等。本文采用 AES/CBC/PKCS5Padding,即:
- CBC(Cipher Block Chaining):一種分組加密模式,增強數據安全性。
- PKCS5Padding:填充方式,用于保證明文塊長度符合加密算法要求。
三、Android 實現 AES 加密解密
以下代碼實現了 AES-128 的加密和解密,并以實際例子展示了完整過程。
1. 代碼核心實現
package com.exap.service.moive.aeslib;import java.nio.charset.StandardCharsets;
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;public class Aes128Util {private static final String AES = "AES";private static final String AES_CBC_PKCS5PADDING = "AES/CBC/PKCS5Padding";/*** AES128位加密字符串* * @param plaintext 待加密的字符串* @param key 密鑰(16個字符的字符串)* @return 加密后的Base64編碼字符串* @throws Exception 加密異常*/public static String encrypt(String plaintext, String key) throws Exception {SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), AES);Cipher cipher = Cipher.getInstance(AES_CBC_PKCS5PADDING);IvParameterSpec ivSpec = new IvParameterSpec(key.getBytes(StandardCharsets.UTF_8));cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivSpec);byte[] encryptedBytes = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8));return Base64.getEncoder().encodeToString(encryptedBytes);}/*** AES128位解密字符串* * @param encryptedText Base64編碼的加密字符串* @param key 密鑰(16個字符的字符串)* @return 解密后的字符串* @throws Exception 解密異常*/public static String decrypt(String encryptedText, String key) throws Exception {SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), AES);Cipher cipher = Cipher.getInstance(AES_CBC_PKCS5PADDING);IvParameterSpec ivSpec = new IvParameterSpec(key.getBytes(StandardCharsets.UTF_8));cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivSpec);byte[] encryptedBytes = Base64.getDecoder().decode(encryptedText);byte[] decryptedBytes = cipher.doFinal(encryptedBytes);return new String(decryptedBytes, StandardCharsets.UTF_8);}public static void mainTest() {String plaintext = "ec74d721051c:1732856541:test";String key = "aaaaaaaa:1732856"; // 16個字符的密鑰try {System.out.println("[Aes128Util]原始字符串: " + plaintext);String encryptedText = encrypt(plaintext, key);System.out.println("[Aes128Util]加密后的字符串: " + encryptedText);String decryptedText = decrypt(encryptedText, key);System.out.println("[Aes128Util]解密后的字符串: " + decryptedText);} catch (Exception e) {e.printStackTrace();}}
}
2. 核心邏輯解析
(1) 加密
- 密鑰生成:通過
SecretKeySpec
使用 UTF-8 編碼生成密鑰。 - 初始化向量(IV):與密鑰一致,用于加密時初始化 Cipher。
- Base64 編碼:將加密后的二進制數據轉為易于傳輸的字符串。
(2) 解密
- Base64 解碼:將加密字符串還原為字節數組。
- 解密過程:通過 Cipher 反向操作,將密文解密為原文。
四、運行結果分析
假設明文為:ec74d721051c:1732856541:test
,密鑰為:aaaaaaaa:1732856
。運行后輸出如下:
注意事項
- 密鑰長度:必須是 16 字節(128 位)。
- 密鑰保密:避免密鑰泄露,可結合 Android KeyStore 加強安全性。
- 編碼一致性:確保加密和解密使用相同的編碼格式(如 UTF-8)。
五、AES 的實際應用場景
- 敏感數據存儲:如密碼、支付信息。
- 數據傳輸保護:在客戶端和服務端之間加密數據傳輸。
- 文件加密:保護本地存儲的用戶數據。
六、總結與建議
本文通過實際代碼講解了 AES-128 加密解密的實現,展示了其強大與高效的特點。在 Android 開發中,AES 是一種可靠的加密選擇,但要注意:
- 密鑰的安全管理至關重要。
- 加密模式和填充方式需根據具體場景選擇。
- 定期審查代碼,避免潛在的安全漏洞。
你是否在項目中使用過 AES 加密?歡迎留言分享你的經驗!