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加密图解
CTR分组模式实现AES加密解密(go语言)
了解大概即可,内部涉及大量数学知识,甚是复杂。


代码实现

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加密解密