CTR分组模式实现AES加密解密(go语言)
版权声明:本文为作者原创,如需转载,请注明出处
https://blog.****.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加密解密