ESSAY / NOTE

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)
}