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
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章