CTR分組模式實現AES加密解密(go語言)
阿新 • • 發佈:2018-11-17
版權宣告:本文為作者原創,如需轉載,請註明出處
https://blog.csdn.net/weixin_42940826
AES演算法簡介
AES演算法是為了取代DES演算法而生,雖然3DES演算法仍然可以使用,但是效率比較低下,AES演算法是在眾多演算法中選拔出來的,安全性高,效率高,在對稱密碼中被廣泛使用,適合使用CBC和CTR分組模式,尤其是CTR分組模式。
常見問題
Q1:AES安全嗎?
安全, 效率高, 推薦使用
Q2:是不是分組密碼?分組長度是多少?
是,128bit = 16位元組
Q3:AES祕鑰長度?
128bit = 16位元組
192bit = 24位元組
256bit = 32位元組
go中的祕鑰長度只能是16位元組
AES加密圖解
瞭解大概即可,內部涉及大量數學知識,甚是複雜。
程式碼實現
package main
import (
"crypto/aes"
"crypto/cipher"
"fmt"
)
func AES_CTR_crypter(key []byte,plainText []byte)[]byte{
//指定使用AES加密演算法
block,_:=aes.NewCipher(key)
//給到一個iv值,長度等於block的塊尺寸,即16byte
iv:=[]byte("mylenthis16bytes")
//CTR模式是不需要填充的,返回一個計數器模式的,底層採用block生成key流的srtream介面
stream:=cipher.NewCTR(block,iv)
cipherText:=make([]byte,len(plainText))
//加密操作
stream.XORKeyStream(cipherText,plainText)
return cipherText
}
func main() {
key:=[]byte("ineedapassword16")
plainText:=[]byte("golangisthebestlanguageofall:)")
cipherText:=AES_CTR_crypter(key,plainText)
fmt.Println (cipherText)
fmt.Println(string(AES_CTR_crypter(key,cipherText)))
}
好的,到這裡我們的AES加密解密演算法就全部實現了!
什麼,我在逗你?不存在的,這就是推薦CTR分組模式的原因,CTR分組模式加密和解密的過程是一模一樣的
什麼?你不信?好吧,那我們還是給出解密的程式碼吧
func Aes_CTR_Decrypt(cipherText,key []byte)[]byte{
//1.指定演算法:aes
block, _ := aes.NewCipher(key)
//2.返回一個計數器模式的、底層採用block生成key流的Stream介面,初始向量iv的長度必須等於block的塊尺寸。
iv := []byte("abcdefghabcdefgh")
stream := cipher.NewCTR(block, iv)
//3.解密操作
plainText := make([]byte,len(cipherText))
stream.XORKeyStream(plainText,cipherText)
return plainText
}
加密解密對比一下會發現是一模一樣的,這就是CTR的神奇之處,因此這一段程式碼可以重複呼叫,無需寫兩遍,具體原因可以參考CTR加密解密流程圖,
在我的文章底部有連結。
以上就是CTR模式的AES加密解密了,歡迎來我部落格一起交流學習: )
相關連結
對稱加密演算法常用的五種分組模式(ECB/CBC/CFB/OFB/CTR)
CBC分組模式實現的DES和3DES加密解密