package main
import (
"bytes"
"crypto/aes"
"crypto/cipher"
"fmt"
)
/*
需求:使用AES算法 CTR分组
AES:
-分组长度16
-密钥:16
CTR:
-不需要填充
-需要提供一个数字
1、创建一个cipher.Block接口。参数key为密钥,长度只能是16、24、32字节,用以选择AES-128、AES-192、AES-256。
func NewCipher(key []byte) (cipher.Block, error)
- 包:aes
- 参数1:秘钥
- 返回值1:cipher.Block接口
2、返回一个计数器模式的、底层采用block生成key流的Stream接口,初始向量iv的长度必须等于block的块尺寸。
func NewCTR(block Block, iv []byte) Stream
- 参数1:block
- 参数2:iv
- 返回值:密钥流
3、加密操作
Stream接口代表一个流模式的加/解密器。
type Stream interface {
// 从加密器的key流和src中依次取出字节二者xor后写入dst,src和dst可指向同一内存地址
XORKeyStream(dst, src []byte)
}
*/
func main(){
src := []byte("不是一番寒彻骨,哪得梅花扑鼻香!")
key := []byte("1234567887654321")
cipherData := aesCTREncrypt(src,key)
fmt.Printf("cipherData:%x\n",cipherData)
//调用解密函数
plainText := aesCTRDecrypt(cipherData,key)
fmt.Printf("decodeData:%s\n",plainText)
}
func aesCTREncrypt(src,key []byte) []byte{
fmt.Printf("加密开始,输入的数据为:%s\n",src)
//1、创建一个cipher.Block接口
block,err := aes.NewCipher(key)
if err != nil{
panic(err)
}
iv := bytes.Repeat([]byte("1"),block.BlockSize())
//2、选择分组模式
stream := cipher.NewCTR(block,iv)
//3、加密操作
stream.XORKeyStream(src/*密文*/,src/*明文*/)
return src
}
func aesCTRDecrypt(cipherData , key []byte )[]byte{
fmt.Printf("解密开始,输入的数据为:%x\n",cipherData)
//1、创建一个cipher.Block接口
block,err := aes.NewCipher(key)
if err != nil{
panic(err)
}
iv := bytes.Repeat([]byte("1"),block.BlockSize())
//2、选择分组模式
stream := cipher.NewCTR(block,iv)
//3、加密操作
stream.XORKeyStream(cipherData/*明文*/,cipherData/*明文*/)
return cipherData
}
AEC_CTR
最新推荐文章于 2024-07-03 17:48:45 发布