AEC_CTR

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
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值