深入淺出 Android AES 加密解密:從理論到實戰

深入淺出 Android AES 加密解密:從理論到實戰

在現代移動應用中,數據安全是不可忽視的一環。無論是用戶隱私保護,還是敏感信息的存儲與傳輸,加密技術都扮演著重要角色。本文將以 AES(Advanced Encryption Standard)加密算法 為核心,帶你深入了解其在 Android 中的應用,并通過代碼示例講解如何實現 AES-128 加密解密


一、為什么選擇 AES?

AES 是目前最廣泛使用的對稱加密算法之一,具有以下優勢:

  1. 安全性高:AES 支持 128、192 和 256 位密鑰長度。本文聚焦于 128 位加密,它在效率和安全性之間取得了平衡。
  2. 性能優秀:AES 是一種高效的塊加密算法,適合移動設備的資源約束環境。
  3. 廣泛支持:在 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。運行后輸出如下:

注意事項

  1. 密鑰長度:必須是 16 字節(128 位)。
  2. 密鑰保密:避免密鑰泄露,可結合 Android KeyStore 加強安全性。
  3. 編碼一致性:確保加密和解密使用相同的編碼格式(如 UTF-8)。

五、AES 的實際應用場景

  1. 敏感數據存儲:如密碼、支付信息。
  2. 數據傳輸保護:在客戶端和服務端之間加密數據傳輸。
  3. 文件加密:保護本地存儲的用戶數據。

六、總結與建議

本文通過實際代碼講解了 AES-128 加密解密的實現,展示了其強大與高效的特點。在 Android 開發中,AES 是一種可靠的加密選擇,但要注意:

  • 密鑰的安全管理至關重要。
  • 加密模式和填充方式需根據具體場景選擇。
  • 定期審查代碼,避免潛在的安全漏洞。

你是否在項目中使用過 AES 加密?歡迎留言分享你的經驗!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/65918.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/65918.shtml
英文地址,請注明出處:http://en.pswp.cn/web/65918.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

hadoop-yarn常用命令

一、YARN命令介紹 1. YARN命令簡介 YARN提供了一組命令行工具,用于管理和監控YARN應用程序和集群。 2. yarn application命令 (1) yarn application命令的基本語法 yarn application命令的基本語法如下: yarn application [genericOptions] [comma…

R語言的語法糖

R語言的語法糖 引言 在編程語言中,所謂的“語法糖”是指那些使得程序員能夠以更簡潔、直觀的方式書寫代碼的語法形式。R語言作為一種用于統計分析和數據可視化的編程語言,具有豐富的功能和靈活的語法。本文將深入探討R語言中的語法糖,幫助讀…

React Fiber框架中的Render渲染階段——workLoop(performUnitOfWork【beginWork與completeWork】)

觸發渲染過程——renderRoot renderRoot 是一個函數,用于觸發渲染工作。它通常會調用并遞歸地執行一系列的渲染任務,直到完成整個更新過程。這個過程包括執行 Fiber 樹中的 beginWork 和 completeWork,以及渲染新狀態或 DOM。 function ren…

【優先算法】思還故里閭,欲歸道無因 - 前綴和

本篇博客給大家帶來的是前綴和算法的知識點, 也是一樣通過OJ題理解,掌握,應用該算法. 🐎文章專欄: 算法 🚀若有問題 評論區見 ? 歡迎大家點贊 評論 收藏 分享 如果你不知道分享給誰,那就分享給薯條. 你們的支持是我不斷創作的動力 . 王子,公主請閱&…

億道三防丨三防筆記本是什么意思?和普通筆記本的優勢在哪里?

三防筆記本是什么意思?和普通筆記本的優勢在哪里? 在現代社會中,筆記本電腦已經成為人們工作和生活中不可或缺的一部分。然而,在一些特殊行業或環境中,普通筆記本電腦由于其脆弱性和對環境條件的敏感性,往…

SOME/IP 協議詳解——服務發現

文章目錄 1. Introduction (引言)2. SOME/IP Service Discovery (SOME/IP-SD)2.1 General(概述)2.2 SOME/IP-SD Message Format2.2.1 通用要求2.2.2 SOME/IP-SD Header2.2.3 Entry Format2.2.4 Options Format2.2.4.1 配置選項(Co…

MATLAB語言的函數實現

MATLAB語言中的函數實現詳解 引言 MATLAB(矩陣實驗室)是一種高級語言和互動環境,廣泛應用于數值計算、數據分析、可視化以及工程與科學計算等多個領域。MATLAB的強大之處在于其豐富的函數庫以及用戶自定義函數的能力。本文將深入探討MATLAB…

Go語言之路————go環境的初始化

Go語言之路————go環境的初始化 前言一、Go的安裝二、環境配置三、初始化一個新項目四、常用的一些指令 前言 我是一名多年Java開發人員,因為工作需要現在要學習go語言,Go語言之路是一個系列,記錄著我從0開始接觸Go,到后面能正…

鼠標過濾驅動

文章目錄 概述代碼參考資料 概述 其編寫過程大體與鍵盤過濾驅動相似,只需要切換一下附加的目標設備以及創建的設備類型等。但在該操作后依然無法捕獲到Vmware創建的win7操作系統的鼠標irp信息,于是通過在獲取鼠標驅動,遍歷其所有的設備進而附…

鴻蒙UI開發——基于onTouch事件實現表情選擇膠囊

1、背 景 有朋友留言說,抖音APP中,長按評論按鈕觸發的快捷表情選擇膠囊動畫比較好(效果如下圖),希望使用鴻蒙ArkTs也實現一個類似的。 本文在鴻蒙ArkTs下也實現一個類似的效果,如下: 首先&…

Node.js——http 模塊(二)

個人簡介 👀個人主頁: 前端雜貨鋪 🙋?♂?學習方向: 主攻前端方向,正逐漸往全干發展 📃個人狀態: 研發工程師,現效力于中國工業軟件事業 🚀人生格言: 積跬步…

研華 PCI-1751 驅動更新導LabVIEW致程序異常

問題描述: 某 LabVIEW 程序長期運行正常,但在使用研華 PCI-1751 數據采集卡運行一段時間后,程序開始出現不正常的行為。具體過程如下: 初始問題: 更換新的 PCI-1751 板卡后,驅動程序被更新,但程…

接上篇基于Alertmanager 配置釘釘告警

Alertmanager 是一個用于處理和管理 Prometheus 警報的開源工具。它負責接收來自 Prometheus 服務器的警報,進行去重、分組、靜默、抑制等操作,并通過電子郵件、PagerDuty、Slack 等多種渠道發送通知。 主要功能 去重:合并相同或相似的警報&…

網絡原理(三)—— 傳輸層 之 UDP 和 TCP協議

傳輸層 在傳輸層兩大關鍵的協議就是UDP和TCP協議了,除此之外,還有別的傳輸層協議,本文章將介紹UDP和TCP協議,重點介紹TCP協議。 首先回顧TCP和UDP 的特點: UDP:不可靠傳輸,面向數據包&#xf…

針對服務器磁盤爆滿,MySql數據庫始終無法啟動,怎么解決

(點擊即可進入聊天助手) 很多站長在運營網站的過程當中都會遇到一個問題,就是網站突然無法打開,數據一直無法啟動 無論是強制重啟還是,刪除網站內的所有應用,數據庫一直無法啟動 這個時候,就需要常見的運維手段了,需要對服務器后臺各個資源,進行逐一排查…

高性能現代PHP全棧框架 Spiral

概述 Spiral Framework 誕生于現實世界的軟件開發項目是一個現代 PHP 框架,旨在為更快、更清潔、更卓越的軟件開發提供動力。 特性 高性能 由于其設計以及復雜精密的應用服務器,Spiral Framework框架在不影響代碼質量以及與常用庫的兼容性的情況下&a…

【面試題】Spring/SpringBoot部分[2025/1/6 ~ 2025/1/12]

Spring/SpringBoot部分[2025/1/6 ~ 2025/1/12] 1. 說說 Spring 啟動過程?2. 說說 Springboot 的啟動流程?3. 你了解的 Spring 都用到哪些設計模式?4. Spring 有哪幾種事務傳播行為?5. SpringBoot 是如何實現自動配置的?6. Spring…

【機器學習:十八、更高級的神經網絡概念】

1. 梯度下降法的改進:Adam算法 1.1 Adam算法簡介 Adam(Adaptive Moment Estimation)是一種優化算法,結合了動量梯度下降和 RMSProp 的優點,在處理稀疏梯度和高維空間優化時表現尤為出色。其核心在于動態調整每個參數…

計算機網絡之---VPN與隧道協議

VPN與隧道協議 VPN(虛擬專用網絡)和隧道協議是現代網絡安全技術的重要組成部分,它們主要用于在不安全的公共網絡(如互聯網)上建立一個安全的私密網絡連接。VPN通過加密通信和認證機制,確保數據的隱私性和完…

【STM32-學習筆記-6-】DMA

文章目錄 DMAⅠ、DMA框圖Ⅱ、DMA基本結構Ⅲ、不同外設的DMA請求Ⅳ、DMA函數Ⅴ、DMA_InitTypeDef結構體參數①、DMA_PeripheralBaseAddr②、DMA_PeripheralDataSize③、DMA_PeripheralInc④、DMA_MemoryBaseAddr⑤、DMA_MemoryDataSize⑥、DMA_MemoryInc⑦、DMA_DIR⑧、DMA_Buff…