常用加密算法之 AES 簡介及應用

相關系列文章

  • 常用加密算法之 SM4 簡介及應用
  • 常用加密算法之 RSA 簡介及應用

引言

AES(Advanced Encryption Standard,高級加密標準)是一種??廣泛使用的對稱分組加密算法??,它使用相同的密鑰進行加密和解密操作,以其高安全性、高效率和支持多種密鑰長度的特點,成為保護數據安全的基石技術之一。

AES的設計基于替代-置換網絡(SPN)結構,能夠有效抵抗多種密碼攻擊,保障數據在傳輸和存儲過程中的機密性與完整性。

一、AES算法核心原理

AES是一種??分組密碼算法??,它將明文數據分成固定長度的塊進行處理,每個塊的大小為128位(16字節)。其加密過程通過多輪循環的替換和置換操作實現。

1. 密鑰與輪數

AES支持三種不同長度的密鑰,每種密鑰對應不同的加密輪數:

? AES-128??:128位密鑰,10輪加密

??? AES-192??:192位密鑰,12輪加密

??? AES-256??:256位密鑰,14輪加密

密鑰長度越長,安全性越高,但計算開銷也相應增加。

2. 加密過程

AES的加密過程包含四個核心操作,每輪都會執行這些操作(最后一輪略有不同):

  1. ?字節替換(SubBytes)??:通過一個稱為S盒(Substitution box)的非線性替換表,將輸入數據的每個字節替換為另一個字節,增加算法的非線性特性,增強安全性。

  2. ??行移位(ShiftRows)??:將數據矩陣的每一行進行循環左移操作:第一行不變,第二行左移1字節,第三行左移2字節,第四行左移3字節。這打破了列的獨立性,增強了擴散效果。

  3. ??列混淆(MixColumns)??:將每列視為有限域GF(2^8)上的多項式,與一個固定多項式進行模乘運算,使每個輸出字節依賴于輸入列中的所有字節,實現列內的擴散(??最后一輪省略此步驟??)。

  4. ??輪密鑰加(AddRoundKey)??:將當前數據狀態與當前輪的輪密鑰進行簡單的按位異或(XOR)操作。??輪密鑰由初始密鑰通過密鑰擴展算法生成??,每一輪使用的輪密鑰都不同。

3. 密鑰擴展

密鑰擴展算法將初始密鑰擴展成多個輪密鑰(子密鑰)。擴展過程使用非線性變換和循環移位操作,確保每輪加密使用不同的密鑰,極大增強了安全性。

4. 解密過程

AES的解密過程是加密過程的逆操作,使用相同的密鑰,但以相反的順序執行逆操作(InvSubBytes、InvShiftRows、InvMixColumns)和應用輪密鑰。

二、AES的工作模式與填充

1. 常見工作模式

AES有多種工作模式,以適應不同的應用場景:
? ?ECB(電子密碼本)??:最簡單的工作模式,但安全性較低,相同的明文會生成相同的密文。

? ??CBC(密碼塊鏈接)??:引入初始化向量(IV),增強安全性,是廣泛使用的模式之一。

? ??CTR(計數器模式)??:將塊密碼轉換為流密碼,適用于流加密場景。

? ??GCM(伽羅瓦/計數器模式)??:提供加密和認證功能,適用于需要保證數據完整性和機密性的場景。

工作模式全稱特點適用場景
ECBElectronic Codebook簡單,并行計算,相同明文生成相同密文,安全性較低簡單數據加密,不推薦用于加密大量重復模式的數據
CBCCipher Block Chaining引入初始化向量(IV),鏈接模式,安全性高于ECB文件加密,SSL/TLS
CTRCounter將分組密碼轉換為流密碼,并行加密,需唯一計數器實時流媒體加密,高速網絡通信
GCMGalois/Counter Mode提供加密和認證功能,高效并行處理需要同時保證機密性和完整性的場景,如SSH

2. 填充模式

當數據長度不是128位(16字節)的整數倍時,需要進行填充。常見的填充模式包括:

? ??PKCS5/PKCS7 Padding??:最常用的填充方案。如果需要填充n個字節,則每個填充字節的值都是n。

? ??Zero Padding??:用0x00字節填充不足的部分。需注意無法區分填充值和實際數據,可能需額外記錄數據長度。

? ??No Padding??:要求明文長度必須是塊大小的整數倍。

三、SpringBoot 集成 AES 加密算法實戰

下文 以 Java AES/CBC/PKCS5Padding 為例,實現 加密解密

PKCS5Padding 和 PKCS7Padding 填充方式一致

1. Maven 依賴

首先,在項目的 pom.xml文件中添加以下依賴:

<dependencies><!-- Bouncy Castle Provider 用于支持 PKCS7Padding --><dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk18on</artifactId><version>1.72</version> <!-- 請檢查最新版本 --></dependency><!-- Apache Commons Lang 用于字符串操作 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version> <!-- 請檢查最新版本 --></dependency>
</dependencies>

2. java 工具類AESUtil .java

/*** AES/CBC/PKCS5Padding 加密解密工具類 (JDK 8 原生支持)* 注意:密鑰和IV需要妥善管理,不建議硬編碼在代碼中* PKCS5Padding 和 PKCS7Padding 填充方式一致*/
public class AESUtil {// 加密算法、模式、填充方式private static final String ALGORITHM = "AES";private static final String TRANSFORMATION = "AES/CBC/PKCS5Padding"; // 使用 JDK 原生支持的 PKCS5Padding// 默認密鑰和初始化向量(IV),建議從外部配置讀取private static final String DEFAULT_KEY = "abcdefghigklmnop"; // 16字節 密鑰(必須為16、24或32字節)private static final String DEFAULT_IV = "abcdefghigklmnop"; // 16字節  初始化向量(必須為16字節)/*** AES/CBC/PKCS5Padding 加密* @param plaintext 待加密的明文* @return Base64編碼的加密字符串*/public static String encrypt(String plaintext) {return encrypt(plaintext, DEFAULT_KEY, DEFAULT_IV);}/*** AES/CBC/PKCS5Padding 加密* @param plaintext 待加密的明文* @param keyStr 密鑰(必須為16、24或32字節)* @param ivStr 初始化向量(必須為16字節)* @return Base64編碼的加密字符串*/public static String encrypt(String plaintext, String keyStr, String ivStr) {if (plaintext == null || plaintext.isEmpty()) {
//            throw new IllegalArgumentException("Plaintext cannot be null or empty");return "";}try {// 將密鑰和IV轉換為字節數組并封裝SecretKeySpec keySpec = new SecretKeySpec(keyStr.getBytes(StandardCharsets.UTF_8), ALGORITHM);IvParameterSpec ivSpec = new IvParameterSpec(ivStr.getBytes(StandardCharsets.UTF_8));// 獲取并初始化Cipher對象Cipher cipher = Cipher.getInstance(TRANSFORMATION); // 使用 JDK 原生支持的 PKCS5Paddingcipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);// 執行加密操作byte[] encryptedBytes = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8));// 返回Base64編碼的字符串return Base64.getEncoder().encodeToString(encryptedBytes);} catch (Exception e) {throw new RuntimeException("Encryption failed", e);}}/*** AES/CBC/PKCS5Padding 解密* @param ciphertext Base64編碼的密文* @return 解密后的明文*/public static String decrypt(String ciphertext) {return decrypt(ciphertext, DEFAULT_KEY, DEFAULT_IV);}/*** AES/CBC/PKCS5Padding 解密* @param ciphertext Base64編碼的密文* @param keyStr 密鑰(必須與加密時使用的密鑰一致)* @param ivStr 初始化向量(必須與加密時使用的IV一致)* @return 解密后的明文*/public static String decrypt(String ciphertext, String keyStr, String ivStr) {if (ciphertext == null || ciphertext.isEmpty()) {return "";
//            throw new IllegalArgumentException("Ciphertext cannot be null or empty");}try {// 將密鑰和IV轉換為字節數組并封裝SecretKeySpec keySpec = new SecretKeySpec(keyStr.getBytes(StandardCharsets.UTF_8), ALGORITHM);IvParameterSpec ivSpec = new IvParameterSpec(ivStr.getBytes(StandardCharsets.UTF_8));// 獲取并初始化Cipher對象Cipher cipher = Cipher.getInstance(TRANSFORMATION); // 使用 JDK 原生支持的 PKCS5Paddingcipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);// 先將Base64編碼的字符串解碼byte[] encryptedBytes = Base64.getDecoder().decode(ciphertext);// 執行解密操作byte[] decryptedBytes = cipher.doFinal(encryptedBytes);// 返回解密后的字符串return new String(decryptedBytes, StandardCharsets.UTF_8);} catch (Exception e) {throw new RuntimeException("Decryption failed", e);}}/*** 測試示例*/public static void main(String[] args) {String originalText = "hello AES CBC";// 加密String encryptedText = encrypt(originalText);System.out.println("加密后 (Base64): " + encryptedText);// 解密String decryptedText = decrypt(encryptedText);System.out.println("解密后: " + decryptedText);// 驗證System.out.println("解密是否成功: " + originalText.equals(decryptedText));}
}

四、前端 Vue 中使用 AES-CBC-Pkcs7 加密解密

1. 安裝 CryptoJS 庫

首先,使用 npm 或 yarn 安裝 crypto-js

npm install crypto-js
# 或
yarn add crypto-js

2. 創建工具文件 AESUtils.js

創建一個單獨的 JavaScript 文件(如 cryptoUtils.js)來存放加密解密函數,方便復用:

import CryptoJS from 'crypto-js';
// const CryptoJS = require('crypto-js'); //引用AES源碼js
const key = CryptoJS.enc.Utf8.parse("abcdefghigklmnop"); //密鑰
const iv = CryptoJS.enc.Utf8.parse("abcdefghigklmnop"); //密鑰偏移量// 加密方法 - AES-CBC-Pkcs7
export function EncryptCBCPkcs7(word) {const encrypted = CryptoJS.AES.encrypt(word, key, {iv: iv,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7});return encrypted.toString();
}// 解密方法 - AES-CBC-Pkcs7
export function DecryptCBCPkcs7(word) {const decrypt = CryptoJS.AES.decrypt(word, key, {iv: iv,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7});return decrypt.toString(CryptoJS.enc.Utf8);
}

3. 測試使用

// 引入js
import { EncryptCBCPkcs7,DecryptCBCPkcs7 } from '@/utils/AESUtils';
//編寫測試方法
function test(){try {const encrypted = EncryptCBCPkcs7('Hello, World!');console.log('加密結果:', encrypted);const decrypted = DecryptCBCPkcs7(encrypted);console.log('解密結果:', decrypted);} catch (error) {console.error('錯誤:', error);}
}

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

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

相關文章

Java面試問題記錄(一)

一、Java 核心基礎與進階1、我們知道 Java 中存在 “值傳遞” 和 “引用傳遞” 的說法&#xff0c;你能結合具體例子&#xff0c;說明 Java 到底是值傳遞還是引用傳遞嗎&#xff1f;這背后涉及到 JVM 中哪些內存區域的交互&#xff1f;Java中只有值傳遞&#xff0c;不存在引用傳…

Redis 主從復制、哨兵與 Cluster 集群部署

文章摘要 本文基于 VMware 虛擬機環境&#xff0c;詳細講解 Redis 高可用架構的核心組件與部署流程&#xff0c;涵蓋三大核心模塊&#xff1a;Redis 主從復制&#xff08;實現數據備份與讀寫分離&#xff09;、Redis 哨兵&#xff08;基于主從復制實現故障自動轉移&#xff0c;…

ElementUI 中 validateField 對部分表單字段數組進行校驗時多次回調問題

目錄 方案一&#xff1a;循環調用 Promise.all 合并結果 方案二&#xff1a;直接傳入數組字段 總結 在實際業務中&#xff0c;我們有時只需要對表單的部分字段進行校驗。ElementUI 提供的 validateField 方法支持單個字段&#xff0c;也支持字段數組&#xff0c;但在使用時…

Visual Studio 2026 震撼發布!AI 智能編程時代正式來臨

Visual Studio 2026 震撼發布&#xff01;AI 智能編程時代正式來臨 Visual Studio 2026 Insider圖標 開發者們的開發環境即將迎來前所未有的智能革命&#xff0c;微軟用Visual Studio 2026 重新定義了編碼體驗。 2025年9月10日&#xff0c;微軟正式推出了Visual Studio 2026 In…

Gamma AI:高效制作PPT的智能生成工具

你有沒有過這種崩潰時刻&#xff1f;領導讓你下午交一份產品介紹 PPT&#xff0c;你打開模板網站翻了半小時沒找到合適的&#xff0c;好不容易選了個模板&#xff0c;又得手動調整文字間距、搭配圖片&#xff0c;光是把數據做成圖表就花了一小時&#xff0c;最后趕出來的 PPT 還…

Python副業新玩法:用Flask搭小程序后端,躺賺被動收入的秘密

凌晨1點&#xff0c;林浩合上電腦時&#xff0c;手機彈出一條微信消息——是上周幫一家社區水果店搭的小程序后端&#xff0c;商家發來了當月的服務費到賬提醒。他靠在椅背上笑了&#xff1a;這是這個月第8筆“睡后收入”&#xff0c;加起來剛好覆蓋了下個月的房貸。半年前&…

基于PyQt5和阿里云TTS的語音合成應用開發實戰[附源碼】

項目概述 本文將詳細介紹一個基于PyQt5圖形界面框架和阿里云TTS(Text-to-Speech)服務的語音合成桌面應用程序的開發過程。該應用提供了完整的文字轉語音功能,包括多音色選擇、參數調節、實時試聽、語速調節和音頻下載等特性。 技術棧 前端界面: PyQt5 語音合成: 阿里云TTS服…

基于esp32c3 rust embassy 的墨水屏程序

EPD Reader 基于ESP32-C3的電子墨水屏閱讀器&#xff0c;支持ap 配網、sntp 時間同步、txt閱讀、天氣預報、顯示節假日信息、農歷顯示、自動休眠、web配置等功能。這是在另一個項目 一個rust embassy esp32c3 的練習項目-CSDN博客的基礎上修改的 。 界面比較粗糙&#xff0c;以…

Spring 單例測試及線程安全

創建一個賬戶類 package com.duanhw.demo22.account;import org.springframework.beans.factory.annotation.Value;//Service public class AccountService {Value("1000")private Integer balance;//存款public void deposit(Integer amount){int newbalance balanc…

【vue】組件寬度調整失效后,調整的方法

父容器布局限制 若組件放置在柵格布局&#xff08;如display: grid&#xff09;或彈性容器中&#xff0c;父元素的寬度限制可能導致子組件寬度失效。解決方案是為父容器設置明確的寬度&#xff0c;或通過百分比布局實現自適應16。例如&#xff1a; <div style"width:…

Java 在Word 文檔中插入頁眉頁腳:一份實用的編程指南

在現代企業應用中&#xff0c;Java 開發者經常需要處理各種文檔操作&#xff0c;其中對 Word 文檔的自動化處理尤為常見。無論是生成報告、合同還是其他商業文檔&#xff0c;頁眉頁腳作為文檔結構的重要組成部分&#xff0c;承載著公司 Logo、頁碼、版權信息等關鍵內容。手動添…

深入解析Dart虛擬機運行原理

Dart虛擬機運行原理 一、Dart虛擬機 1.1 引言 Dart VM是一種虛擬機&#xff0c;為高級編程語言Dart提供執行環境&#xff0c;但這并意味著Dart在D虛擬機上執行時&#xff0c;總是采用解釋執行或者JIT編譯。 例如還可以使用Dart虛擬機的AOT管道將Dart代碼編譯為機器代碼&#xf…

光譜相機在AI眼鏡領域中的應用

一、核心應用場景?健康監測系統??實時生理指標分析?&#xff1a;通過眼周皮膚光譜特征&#xff0c;監測血氧(SpO?)和血紅蛋白變化&#xff0c;精度可達2%?血糖無創檢測?&#xff1a;近紅外光譜(900-1700nm)分析淚液成分&#xff0c;臨床測試相關系數R0.87?疲勞度評估?…

如何通過url打開本地文件文件夾

安裝部署 https://github.com/jixn-hu/notion_link_opener 這是我自己開發的一個后端服務&#xff0c;要一直開著 部署好后 會打開一個前端頁面填下好你文件或者文件夾 點擊生成短鏈就可以直接打開本地的文件夾了

第一篇:如何在數組中操作數據【數據結構入門】

記錄以下自己重溫數據結構的筆記&#xff0c;附帶自己實現的C代碼&#xff0c; 其中部分Python代碼是網上教程里的&#xff0c;順手粘貼過來&#xff0c;做一對比/ &#xff08;Python確實簡潔&#xff0c;但是C更好理解不是嗎哈哈哈&#xff09;數組的定義 數組&#xff1a;線…

基于STM32的單片機開發復盤

硬件介紹 底盤&#xff1a;幻爾阿克曼底盤&#xff1b;2個直流霍爾電機、1個PWM舵機開發板&#xff1a;幻爾Ros Controller V1.2&#xff08;STM32F407VET6&#xff09;電源&#xff1a;因為是學習階段&#xff0c;沒有配電池&#xff0c;使用120W可調電源&#xff08;3V~12V&a…

面試常問:注冊中心宕機,遠程調用還能成功嗎?

在微服務架構里&#xff0c;注冊中心&#xff08;像 Nacos、Eureka、Consul 等&#xff09;是服務發現與治理的核心。可要是注冊中心突然宕機&#xff0c;微服務間的遠程調用還能順利進行嗎&#xff1f;這是面試時很常被問到的問題&#xff0c;下面我們就來深入剖析。一、遠程調…

《用 Python 和 Matplotlib 繪制折線圖:從入門到實戰的可視化指南》

《用 Python 和 Matplotlib 繪制折線圖:從入門到實戰的可視化指南》 一、引言:數據可視化的力量,從一張折線圖開始 在我多年的開發與教學經歷中,最常被問到的問題之一是:“如何讓數據更直觀?”我的答案始終如一:用圖說話。而在眾多圖表類型中,折線圖以其簡潔、清晰的…

Seate的XA模式和AT模式

目錄 一、XA模式 【1】兩階段提交 【2】Seata的XA模型 【3】優缺點 【4】實現XA模式 二、AT模式 【1】Seata的AT模型 【2】AT與XA的區別 【3】臟寫問題 【4】優缺點 【5】實現AT模式 一、XA模式 XA 規范 是 X/Open 組織定義的分布式事務處理&#xff08;DTP&#xf…

CTFHub SSRF通關筆記6:Gopher Redis原理詳解與滲透實戰

目錄 一、SSRF Gopher Redis 1、功能簡介 2、攻擊原理 &#xff08;1&#xff09;SSR的作用 &#xff08;2&#xff09;Gopher 協議特性 &#xff08;3&#xff09;攻擊 Redis 步驟 二、gopherus 1、功能簡介 2、攻擊Redis服務方法 三、Gopherus安裝 1、源碼下載 2…