1. 程式人生 > >CTR分組模式實現AES加密解密(go語言)

CTR分組模式實現AES加密解密(go語言)

版權宣告:本文為作者原創,如需轉載,請註明出處
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加密圖解
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加密解密