golang 中AES加密詳解

2021-07-13 13:17:51 字數 2914 閱讀 1238

golang標準庫中對於aes加密的闡述得非常簡潔,如果沒有一定的密碼學基礎知識,是很容易迷惑的。

本文將完整地介紹aes加密的基本知識,並分析網路上常見的呼叫例項。

主要摘抄自wikipedia:塊密碼的工作模式

初始化向量(iv,initialization vector)是許多任務作模式中用於隨機化加密的一塊資料,因此可以由相同的明文,相同的金鑰產生不同的密文,而無需重新產生金鑰,避免了通常相當複雜的這一過程。

初始化向量與金鑰相比有不同的安全性需求,因此iv通常無須保密,然而在大多數情況中,不應當在使用同一金鑰的情況下兩次使用同乙個iv。對於cbc和cfb,重用iv會導致洩露明文首個塊的某些資訊,亦包括兩個不同訊息中相同的字首。對於ofb和ctr而言,重用iv會導致完全失去安全性。另外,在cbc模式中,iv在加密時必須是無法**的;特別的,在許多實現中使用的產生iv的方法,例如ssl2.0使用的,即採用上乙個訊息的最後一塊密文作為下乙個訊息的iv,是不安全的。

func pkcs5padding(ciphertext byte, blocksize int) byte , padding)//生成填充的文字

return

}func pkcs5unpadding(origdata byte) byte

func zeropadding(ciphertext byte, blocksize int) byte , padding)//用0去填充

return

}func zerounpadding(origdata byte) byte )

}

加密:

解密:

對每個密碼塊應用秘鑰,缺點在於同樣的平文塊會被加密成相同的密文塊;因此,它不能很好的隱藏資料模式。在某些場合,這種方法不能提供嚴格的資料保密性,因此並不推薦用於密碼協議中。下面的例子顯示了ecb在密文中顯示平文的模式的程度:該影象的乙個位圖版本(左圖)通過ecb模式可能會被加密成中圖,而非ecb模式通常會將其加密成下圖

而且由於每個塊分別加密,用它的協議本身不能提供資料完整性保護,易收到重放攻擊的影響。

加密:

解密:

在cbc模式中,每個平文塊先與前乙個密文塊進行異或後,再進行加密。在這種方法中,每個密文塊都依賴於它前面的所有平文塊。同時,為了保證每條訊息的唯一性,在第乙個塊中需要使用初始化向量。

cbc是最為常用的工作模式。它的主要缺點在於加密過程是序列的,無法被並行化,而且訊息必須被填充到塊大小的整數倍。解決後乙個問題的一種方法是利用密文竊取。

注意在加密時,平文中的微小改變會導致其後的全部密文塊發生改變,而在解密時,從兩個鄰接的密文塊中即可得到乙個平文塊。因此,解密過程可以被並行化,而解密時,密文中一位的改變只會導致其對應的平文塊完全改變和下乙個平文塊中對應位發生改變,不會影響到其它平文的內容。

示例中包含了多種模式下的aes使用,我們重點介紹最常見的cbc模式

func examplenewcbcencrypter() 

block, err := aes.newcipher(key)//生成加密用的block

if err != nil

// 對iv有隨機性要求,但沒有保密性要求,所以常見的做法是將iv包含在加密文字當中

ciphertext := make(byte, aes.blocksize+len(plaintext))

//隨機乙個block大小作為iv

//採用不同的iv時相同的秘鑰將會產生不同的密文,可以理解為一次加密的session

iv := ciphertext[:aes.blocksize]

if _, err := io.readfull(rand.reader, iv); err != nil

mode := cipher.newcbcencrypter(block, iv)

mode.cryptblocks(ciphertext[aes.blocksize:], plaintext)

// 謹記密文需要認證(i.e. by using crypto/hmac)

fmt.printf("%x\n", ciphertext)

}func examplenewcbcdecrypter()

iflen(ciphertext) < aes.blocksize

iv := ciphertext[:aes.blocksize]

ciphertext = ciphertext[aes.blocksize:]

// cbc mode always works in whole blocks.

iflen(ciphertext)%aes.blocksize !=0

mode := cipher.newcbcdecrypter(block, iv)

// cryptblocks可以原地更新

mode.cryptblocks(ciphertext, ciphertext)

fmt.printf("%s\n", ciphertext)

// output: exampleplaintext

}

AES加密解密詳解

一 什麼是aes?高階加密標準 英語 advanced encryption standard,縮寫 aes 是一種區塊加密標準。這個標準用來替代原先的des,已經被多方分析且廣為全世界所使用。那麼為什麼原來的des會被取代呢,原因就在於其使用56位金鑰,比較容易被破解。而aes可以使用128 19...

AES加密演算法詳解

aes 是乙個對稱密碼分組演算法,分組長度為128bit,金鑰長度為128 192 和 256 bit。整個加密過程如下圖所示。1.金鑰生成演算法 金鑰擴充套件過程 1 將種子金鑰按下圖所示的格式排列,然後每32bit分別記為w 0 w 1 w 2 w 3 2 依次取問w 5 w 6 w 43 記為...

Golang中,Aes加解密

今天在用golang解析php那邊用aes加密的乙個key。網上大多是用base64將結果編碼一下。而且用到了向量。我php 那邊沒有用到向量。所以golang這邊也是要去掉的。參考 的改了下。能夠和php通用。另外,需要注意的是加密的key只能是16,24,32.分別對應的是aes 128,aes...