僅加解密
需要填充
ECB:不需要 IV 或 Nonce 值,安全性很弱,同一密鑰僅能加密一塊資料,
CBC:需要一個 IV 值,不能重復使用該值,但是相對于 CTR 危險度沒有那么高,即使使用不正確,也是相對安全的,
流模式
CTR:需要一個 IV 或 Nonce 值,不能重復使用該值,否則攻擊者可以對其進行完全破解,
認證加解密(可以保證資料的保密性、完整性、真實性)
OCB:僅需要一個亂數,速度更快,最推薦的認證加密方式,但有專利限制,
GCM:需要一個 IV 值,不能重復使用該值,否則攻擊者可以對其進行完全破解,因為它是 CTR 和 GMAC(GHASH) 的復雜組合,
填充方法
ZeroPadding:填充 0 值,會丟失原資料末尾的 '\0'(如果有),不推薦使用,
Pkcs7Padding:冗余填充,即長度不對齊 BlockSize(AES 是 16 位元組)時,將不夠的部分填充不夠的長度,如果剛好對齊 BlockSize,則新增一個 Block 填充 BlockSize,
填充是指按位元組填充明文中不夠對齊 BlockSize 的部分,填充方法之間沒有安全性區別,但推薦用 Pkcs7Padding 填充方法,因為 ZeroPadding 可能會丟失資料,
名詞解釋
IV
初始向量(initialization vector),是一個固定長度的輸入值,
一般的使用上會要求它是亂數或偽亂數(pseudorandom),
使用亂數產生的初始向量才能達到語意安全(訊息驗證碼也可能用到初始向量),并讓攻擊者難以對原文一致且使用同一把密鑰生成的密文進行破解,
在區塊加密中,使用了初始向量的加密模式被稱為區塊加密模式,
有些密碼運算只要求初始向量不要重復,并只要求它用是內部求出的亂數值(這類亂數實際上不夠亂,即不夠真正隨機),在這類應用下,初始向量通常被稱為 nonce(臨時使用的數值),是可控制的(stateful)而不是亂數,
這種作法是因為初始向量不會被寄送到密文的接收方,而是收發兩方透過事前約定的機制自行計算出對應的初始向量(不過,實作上還是經常會把 nonce 送過去以便檢查訊息的遺漏),計數器模式中使用序列的方式來作為初始向量,它就是一種可控制之初始向量的加密模式,
Nonce
是一個在加密通信中只能使用一次的數字,它可以不隨機或偽隨機,但一定不能重復,
例如用計數器實作 Nonce,初始化一個隨機值,每次使用后對其自增 1,下一次使用 Nonce 就不會是重復的,
在認證協議中,它往往是一個隨機或偽亂數,以避免重放攻擊,
Nonce 相對于 IV 實作起來更簡單,更不容易出錯,
參考資料
https://stackoverflow.com/questions/1220751/how-to-choose-an-aes-encryption-mode-cbc-ecb-ctr-ocb-cfb
https://stackoverflow.com/questions/51124995/aes-ctr-without-iv-same-key-for-multiple-messages-safe
如果發現文章內容有任何不正之處,歡迎評論指出,
如果該文對你有幫助,請在下方為我點個贊,
謝謝!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/97126.html
標籤:其他
