通過Go實現AES加密和解密工具
本文包含如下兩個內容:
-
AES加密介紹及實現原理
-
Go實現AES加密和解密工具
AES加密介紹及實現原理
AES( advanced encryption standard)使用相同金鑰進行加密和解密,也就是 對稱加密 。其他的對稱加密如DES,由於DES金鑰長度只有56位如今的算力甚至可以在5分鐘內破解,而AES最高級別達到了256位金鑰長度,如果採用窮舉法,目前來看AES是一種”無法“被破解的加密存在。
關於 非對稱 加密我們在之前有一篇文章《理解https中的安全及其實現原理》進行了介紹,有興趣的可翻看檢視。
AES用在哪裡?
如果你正在瀏覽本文,那麼你就在使用AES(https協議中一部分使用了對稱加密)。
-
綠色上網:通過加密安全地連線到另一臺搬石頭砸腳的伺服器。
-
無線網路WIFI:和WAP2一起使用。
-
應用程式:wechat、JD、Alipay等使用 AES 加密照片和訊息或支付資訊。
-
存檔和壓縮工具:7z、WinZip 和 RAR。
-
作業系統元件:一些作業系統元件(如檔案系統)使用高階加密標準來確保安全性。
-
程式語言庫:Go、Python 和 C++ 等編碼庫實現了的AES加密(等會使用到)。
AES加密是如何實現的?
參考:
what-is-the-aes-algorithm?
What is AES encryption and how does it work?
Block cipher mode of operation
從巨集觀上來看AES加密過程中的一輪(根據不同的金鑰長度,輪數不一樣,下面會說到)如下:
1.資料分塊
首先把明文按照128bit拆分成若干個明文塊(圖上黃色塊),一個位元組包含 8 位,佈局為 4×4矩陣(上圖黃色部分),對最後一塊填充至128bit,填充方式有PKCS7Padding(採用)/PKCS5Padding/ZeroPadding,無論咋填充最後解密時都要去除這些多餘的填充。
2.金鑰擴充套件
AES通過Rijndael's key schedule 將金鑰被擴充套件為 (n+1) 個金鑰,其中 n 是加密過程中要遵循的輪數。AES每個標準規定了所要加密的輪數,對於128位金鑰,輪數是 10,要生成的金鑰個數為 10+1,總共 11 個金鑰。
標準 | 金鑰長度 | 輪數 | 分組長度 |
---|---|---|---|
AES-128 | 128位(16位元組) | 10 | 128位(16位元組) |
AES-192 | 192位(24位元組) | 12 | 128位(16位元組) |
AES-256 | 256位(32位元組) | 14 | 128位(16位元組) |
每一輪所要做的包括:位元組替代(SubBytes)、行移位(ShiftRows)、列混淆(MixColumns)、加輪金鑰(AddRoundKey)
3. 位元組替代(SubBytes)
每輪開始,首先進行SubBytes,位元組根據預定義的 Rijndael S-box (可以簡單認為是一個轉換表)規定的規則進行替換。對a[i,j]中的每個位元組進行一次轉換後得到b[i,j]
4.行移位(ShiftRows)
對上一步得到矩陣進行ShiftRows,第一行不變,第二行移動1位,第三行2位,第四行3位。
5.列混淆(MixColumns)
再對矩陣的每一列和 修補矩陣fixed matrix 的二維常量陣列做矩陣相乘,得到對應的輸出列。
6.加輪金鑰(AddRoundKey)
先將擴充套件金鑰Kn排列成4×4矩陣,然後讓輸入陣列的每一個位元組a[i,j]與金鑰對應位置的位元組k[i,j]異或一次,得到輸出b[i,j]。最後一輪不參與AddRoundKey
經過如上的10輪操作之後,得到了一個明文塊的加密字元。解密則進行反向加密。
AES加密模式
ECB
在上面加密過程中每一個明文塊都是獨立進行加密的,簡單且高效,但是如果一個段資料存在相關的明文塊,則加密後的密文也會相同,對安全性也有一定影響。
CBC
CBC加密模式如下圖所示,初始向量IV和明文異或,每個塊的密文作為後續塊的“向量”,讓每一個密文獨一無二。我們待會採用這種模式。
Go實現AES加密工具scode
ok,上面大致瞭解AES加密是如何工作起來的,接下來通過Go中的crypto/aes和crypto/cipher包實現的AES加密解密工具。
PKCS7Padding將待補足位元組數作為填充的位元組
使用 cipher的CBC模式對block加密和解密
迴圈從檔案中讀取100mb源資料用於加密後將密文寫入檔案,解密則讀取密文解密後將源資料寫入檔案。
參考:Golang AES 加密 解密
通過cobra新增命令後,建立命令的匿名函式
使用方式看起來如下:
scode工具包含2個命令encode和decode,解密檔案需要密碼。
完整程式碼:source
通過部落格檢視:iqsing.github.io
通過改進此工具建立一個自己隱私檔案加密和解密器。
參考:
[1] what-is-the-aes-algorithm?: http://www.educative.io/edpresso/what-is-the-aes-algorithm
[2]
What is AES encryption and how does it work?: http://cybernews.com/resources/what-is-aes-encryption/
Block cipher mode of operation: http://en.wikipedia.org/wiki/Block_cipher_mode_of_operation
Rijndael's key schedule: http://www.samiam.org/key-schedule.html
Golang AES 加密 解密: http://www.jianshu.com/p/0caab60fea9f
iqsing.github.io: http://iqsing.github.io
- 通過Go實現AES加密和解密工具
- 比心雲平臺基於阿里雲容器服務 ACK 的彈性架構實踐
- 比心雲平臺基於阿里雲容器服務 ACK 的彈性架構實踐
- 中科金財區塊鏈平臺容器化最佳實踐
- Go通過cobra快速構建命令列應用
- 從容器化到資源池化,數棧雲原生技術實踐探索之路
- Prometheus TSDB儲存原理
- 雲原生邊緣計算KubeEdge在智慧停車中的實踐
- 容器化後資源與成本優化實踐
- 去哪兒網業務大規模容器化最佳實踐
- PromQL全解析
- VIPKID 基於 Karmada 的容器 PaaS 平臺落地實踐
- 阿里雲容器服務差異化 SLO 混部技術實踐
- 理解https中的安全及其實現原理
- k8s基於RBAC的認證、授權介紹和實踐
- k8s 理解Service工作原理
- k8s env、configmap、secret外部資料載入配置
- 天翼雲基於 KubeEdge 的大規模 CDN 場景落地實踐
- 讓容器跑得更快:CPU Burst 技術實踐
- 讓容器跑得更快:CPU Burst 技術實踐