偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

深入淺出AES算法

開發(fā) 開發(fā)工具 算法
高級加密標(biāo)準(zhǔn)(Advanced Encryption Standard,AES)是美帝2001年發(fā)布的塊加密算法,AES是屬于塊加密算法框架中的一個(gè)組件,所以理解AES的關(guān)鍵是搞清楚塊加密算法。下面,就一起來講講塊加密算法工作原理。

AES算法

高級加密標(biāo)準(zhǔn)(Advanced Encryption Standard,AES)是美帝2001年發(fā)布的塊加密算法,AES是屬于塊加密算法框架中的一個(gè)組件,所以理解AES的關(guān)鍵是搞清楚塊加密算法。(塊加密算法是一個(gè)“框”,AES只是“框”中的一個(gè)東西)

塊加密算法工作原理

塊加密算法也叫分組密碼工作模式(block mode of operation)它會(huì)把明文按等長的塊(Block)分組然后利用某種加密算法進(jìn)行加密——AES就屬于“某種加密算法”中的一種。用一幅圖表示二者關(guān)系:

塊加密算法和AES的關(guān)系

塊加密算法有三個(gè)關(guān)鍵部分

  • 填充方式,負(fù)責(zé)把明文切分成一塊一塊的。塊加密要求數(shù)據(jù)一定要符合塊大小,以AES為例它規(guī)定每個(gè)數(shù)據(jù)塊的大小是128個(gè)bit位(16字節(jié)),如果數(shù)據(jù)不足16字節(jié)那么必須**填充**到16字節(jié)。填充的數(shù)據(jù)是字節(jié)長度,比如一個(gè)5字節(jié)的塊需要填充到16個(gè)字節(jié),那么剩下的9個(gè)字節(jié)就全部寫上09 09 09……。 PKCS5Padding和PKCS7Padding是分別出在不同規(guī)范的兩個(gè)標(biāo)準(zhǔn),PKCS5規(guī)定了塊大小是8字節(jié);PKCS7沒有限制。由于AES已經(jīng)限制了塊的大小,所以它們兩個(gè)在AES里面其實(shí)沒有什么區(qū)別。所以在Java里面只提供了AES+PKC5Padding(AES+PKCS7Padding,這個(gè)說法不對,AES已經(jīng)限制了塊大小)。
  • 加密算法,負(fù)責(zé)對每一塊的明文進(jìn)行加密。對算法輸入明文和密鑰,算法輸出加密后的密文塊,常見的算法是AES、DES。
  • 工作方式,塊加密非常靈活利用不同的工作模式可以實(shí)現(xiàn)**并行、密文可變(每次加密得到的密文都不一樣)、容錯(cuò)**

塊加密算法的五種工作方式

按照塊加密算法的不同工作模式常見的有5種(為了簡化問題我只貼加密過程):

  • 電子密碼本(ECB,Electronic codebook)
  • 電子密碼本

Key是密鑰,Plaintext是明文,中間的Block Cipher Encryption是加密算法(比如AES就是其中一種)。密鑰和明文作為輸入經(jīng)過加密之后得到密文——Ciphertext。

ECB工作模式非常簡單,可以并行處理;一個(gè)線程負(fù)責(zé)把數(shù)據(jù)切分成N塊后由N個(gè)線程同時(shí)進(jìn)行加密。它的缺點(diǎn)是同樣的密鑰每次執(zhí)行加密出來的數(shù)據(jù)都是相同的。正常人看——比如我,這太正常了,但是“密碼專家”們認(rèn)為這太弱雞了(囧)。所以他們設(shè)計(jì)了一種特別的算法,通過一個(gè)叫“初始向量(IV,Initialization Vector)”的變量讓每次進(jìn)行加密得到的密文都不一樣(即便密鑰相同)。剩下的4種塊工作模式都屬于這種牛B的類型。

  • 密碼塊鏈接(CBC,Cipher-block chaining)
  • 密碼塊鏈接(CBC,Cipher-block chaining)

這里的輸入多了一個(gè)叫Initialization Vector(IV)的變量;明文和IV異或之后通過作為加密算法的一個(gè)變量輸入,密鑰作為另一個(gè)變量輸入。

CBC加密算法是一個(gè)串行算法,第二塊的加密依賴于***塊密文作為IV。所以計(jì)算它的時(shí)候只能按部就班一塊一塊的計(jì)算。

  • 密文反饋(CFB,Cipher feedback)
  • 密文反饋(CFB,Cipher feedback)

之前的塊加密都沒有解決容錯(cuò)問題——如果我一個(gè)數(shù)據(jù)塊壞掉了那么能不能解密出其余的數(shù)據(jù)塊。于是就有了CFB工作模式,注意觀察上圖,解密的時(shí)候如果***個(gè)密文塊損壞那么可以無視這塊內(nèi)容,直接用第二個(gè)密文作為輸入對第三個(gè)密文塊進(jìn)行解密。

  • 輸出反饋模式(OFB,Output feedback)
  • 輸出反饋模式(OFB,Output feedback)

CBC雖然狂屌炸(每次都能算出不同的密文)但是不能并行,對于“時(shí)間就是金錢”的計(jì)算機(jī)來說是無法容忍的。于是就有了***次改進(jìn)——OFB。

注意IV和密鑰經(jīng)過加密后這里是可以并行的,其中一個(gè)線程用于和明文的異或;一個(gè)線程可以立馬計(jì)算“下次”加密。

  • 計(jì)數(shù)器模式(CTR,Counter mode)
  • 計(jì)數(shù)器模式

OFB算法的并行度太低,僅僅實(shí)現(xiàn)一部分并行,于是就有了第二次改進(jìn)——CTR算法,同時(shí)保證了并行度和密文可變性。

CTR算法中的IV變成了兩部分,***個(gè)是Nonce可以是一個(gè)隨機(jī)序列,第二部分是計(jì)數(shù)器(Countter),是一個(gè)遞增的數(shù)字。于是加密的時(shí)候通過組合Nonce和計(jì)算器就可以對得到有規(guī)律但是不相同的(每次密文都不同的關(guān)鍵是IV的可變)“IV”。

總結(jié)

從三個(gè)維度理解五種工作模式——密文是否固定、是否可以并行、有沒有容錯(cuò)

  • ECB密文固定,全并行
  • CBC密文可變,不可并行
  • CFB密文容錯(cuò),密文可變,不可并行
  • OFB密文可變,部分并行
  • CTR密文可變,全并行

需要注意的是除非數(shù)據(jù)量特別大否則我們不必在乎是否并行;容錯(cuò)在小數(shù)據(jù)量的時(shí)候也凸顯不出效果,所以CBC一般是***的選擇。

如何跨語言

很多朋友都碰到一個(gè)語言寫的AES加密在另個(gè)一語言解密不了的問題,究其原因是由于根本沒有理解AES的工作模式(可能就是Google了一下AES加密,然后代碼貼上收工)。所以我覺得跨語言的***步不是找到一種能在所有語言通用的工作模式——所有工作模式每個(gè)語言幾乎都支持;而是搞清楚你加密出來的數(shù)據(jù)是那種工作模式,有沒有用到IV?IV是通過什么方式傳遞給對方的?

比如下面的Java代碼:

我使用了CBC加密模式,這種模式涉及到IV,我們可以用一個(gè)固定的IV(比如用key作為IV)——但是意味著沒有了CBC的好處,密文可變。所以我用一個(gè)隨機(jī)16字節(jié)作為IV,返回的時(shí)候把它作為***個(gè)數(shù)據(jù)塊;解密的時(shí)候只要取出***個(gè)數(shù)據(jù)塊作為IV,然后再對余下的數(shù)據(jù)進(jìn)行解密。

如果我們不指定IV參數(shù)(init函數(shù)的第三個(gè)參數(shù)),那么iv就是一個(gè)隨機(jī)數(shù)。Java是不會(huì)主動(dòng)把IV附加到密文上,所以這種加密出來的數(shù)據(jù)是誰也沒有辦法解出來的。

【本文是51CTO專欄作者“邢森”的原創(chuàng)文章,轉(zhuǎn)載請聯(lián)系作者本人獲取授權(quán)】

戳這里,看該作者更多好文

責(zé)任編輯:趙寧寧 來源: 51CTO專欄
相關(guān)推薦

2011-07-04 10:39:57

Web

2021-03-16 08:54:35

AQSAbstractQueJava

2022-09-26 09:01:15

語言數(shù)據(jù)JavaScript

2019-01-07 15:29:07

HadoopYarn架構(gòu)調(diào)度器

2021-07-20 15:20:02

FlatBuffers阿里云Java

2012-05-21 10:06:26

FrameworkCocoa

2009-11-17 17:31:58

Oracle COMM

2024-01-09 12:05:24

SSH協(xié)議端口

2016-10-14 13:53:05

JavascriptDOMWeb

2010-07-16 09:11:40

JavaScript內(nèi)存泄漏

2016-10-14 14:32:58

JavascriptDOMWeb

2010-07-26 12:57:12

OPhone游戲開發(fā)

2023-12-04 13:22:00

JavaScript異步編程

2021-07-19 11:54:15

MySQL優(yōu)先隊(duì)列

2022-05-06 07:19:11

DOMDiff算法

2022-01-11 07:52:22

CSS 技巧代碼重構(gòu)

2025-03-27 09:38:35

2021-04-27 08:54:43

ConcurrentH數(shù)據(jù)結(jié)構(gòu)JDK8

2019-11-11 14:51:19

Java數(shù)據(jù)結(jié)構(gòu)Properties

2022-12-02 09:13:28

SeataAT模式
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號