需求: 使用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)
}