GO实现AES加密CTR模式分组
需求: 使用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
– 秘钥
– cipher.Block接口
2. 选择分组模式:ctr
返回一个计数器模式的、底层采用block生成key流的Stream接口,初始向量iv的长度必须等于block的块尺寸。
func NewCTR(block Block, iv []byte) Stream
– block
– iv
– 秘钥流
3. 加密操作
type Stream interface {
// 从加密器的key流和src中依次取出字节二者xor后写入dst,src和dst可指向同一内存地址
XORKeyStream(dst, src []byte)
}
package main
import (
"bytes"
"crypto/aes"
"crypto/cipher"
"fmt"
)
func aesCTREncrypt(src,key []byte) []byte {
fmt.Printf("明文:%s\n",src)
//1. 创建一个cipher.Block接口。
block,err := aes.NewCipher(key)
if err != nil{
panic(err)
}
fmt.Println("AES Block Size is :",block.BlockSize())
iv := bytes.Repeat([]byte("1"),block.BlockSize())
//2、选择分组模式
steam := cipher.NewCTR(block,iv)
//3、加密操作
steam.XORKeyStream(src/*密文*/,src/*明文*/)
return src
}
//解密与解密代码相同
func aesCTRDencrypt(keyData,key []byte) []byte {
//创建aes-block
block,err := aes.NewCipher(key)
if err != nil{
panic(err)
}
iv := bytes.Repeat([]byte("1"),block.BlockSize())
//选择分组模式
steam := cipher.NewCTR(block,iv)
//解密操作
steam.XORKeyStream(keyData/*明文*/,keyData)
return keyData
}
func main() {
src := []byte("世界你好")
key := []byte("1234567812345678")
cipherData := aesCTREncrypt(src,key)
fmt.Printf("加密数据为:%x\n",cipherData)
//解密操作
result := aesCTRDencrypt(cipherData,key)
fmt.Printf("解密数据为:%s",result)
}