go語言實現對稱加密

2021-09-24 16:42:05 字數 4845 閱讀 6081

aes演算法+ctr分組模式

加密思路

第一步:建立aes密碼介面

func newcipher(key byte) (cipher.block, error)

引數:秘鑰

返回值:乙個分組介面

第二步:建立分組模式ctr

func newctr(block block, iv byte) stream

引數1:填寫分組介面

引數2:初始向量(大小與分組大小一致)

返回值:乙個stream介面物件

第三步:加密

xorkeystream(dst, src byte)

引數1:密文空間

引數2:明文

解密思路

與加密完全一致

**實現

//輸入明文,輸出密文

func

aesctrencrypt

(plaintext, key [

]byte)(

byte

,error

)//第二步:建立分組模式ctr

// iv 要與演算法長度一致,16位元組

// 使用bytes.repeat建立乙個切片,長度為blocksize(),16個字元"1"

iv := bytes.

repeat([

]byte

("1"

), block.

blocksize()

) stream := cipher.

newctr

(block, iv)

//第三步:加密

dst :=

make([

]byte

,len

(plaintext)

) stream.

xorkeystream

(dst, plaintext)

return dst,

nil}

//輸入密文,得到明文

func

aesctrdecrypt

(encryptdata, key [

]byte)(

byte

,error

)func

main()

fmt.

printf

("encryptdata: %x\n"

, encryptdata)

//呼叫解密函式

plaintext, err :=

aesctrdecrypt

(encryptdata,

byte

(key)

)if err !=

nil fmt.

printf

("解密後的資料: %s\n"

, plaintext)

}

des演算法+cbc分組模式

加密思路

第一步:建立des密碼介面

func newcipher(key byte) (cipher.block, error)

引數:秘鑰

返回值:乙個分組介面

第二步:建立分組模式cbc

func newcbcencrypter(b block, iv byte) blockmode

引數1:填寫分組介面

引數2:初始向量(大小與分組大小一致)

返回值:乙個blockmode介面物件

第三步:填充

封裝乙個填充函式

第四步:加密

cryptblocks(dst, src byte)

引數1:密文空間

引數2:明文

解密思路

第一步:建立des密碼介面

與加密一樣

第二步:建立分組模式cbc

func newcbcdecrypter(b block, iv byte) blockmode

引數1:填寫分組介面

引數2:初始向量(大小與分組大小一致)

返回值:乙個blockmode介面物件

第三步:解密

cryptblocks(dst, src byte)

引數1:明文空間

引數2:密文

第四步:去除填充

封裝乙個去除填充函式

**實現

func

descbcencrypt

(plaintext /*明文*/

, key [

]byte)(

byte

,error

)//第二步:建立cbc分組

// 返回乙個密碼分組鏈結模式的、底層用b解密的blockmode介面

// func newcbcencrypter(b block, iv byte) blockmode

blocksize := block.

blocksize()

//建立乙個8位元組的初始化向量

iv := bytes.

repeat([

]byte

("1"

), blocksize)

mode := cipher.

newcbcencrypter

(block, iv)

//第三步:填充

//todo

plaintext, err =

paddingnumber

(plaintext, blocksize)

if err !=

nil//第四步:加密

// type blockmode inte***ce

//密文與明文共享空間,沒有額外分配

mode.

cryptblocks

(plaintext /*密文*/

, plaintext /*明文*/

)return plaintext,

nil}

//輸入密文,得到明文

func

descbcdecrypt

(encryptdata, key [

]byte)(

byte

,error

)//第二步:建立cbc分組

iv := bytes.

repeat([

]byte

("1"

), block.

blocksize()

) mode := cipher.

newcbcdecrypter

(block, iv)

//第三步:解密

mode.

cryptblocks

(encryptdata /*明文*/

, encryptdata /*密文*/

)//第四步: 去除填充

//todo

encryptdata, err =

unpaddingnumber

(encryptdata)

if err !=

nil// return byte("hello world"), nil

return encryptdata,

nil}

//填充資料

func

paddingnumber

(src [

]byte

, blocksize int)(

byte

,error

) fmt.

println

("呼叫paddingnumber"

)//1. 得到分組之後剩餘的長度 5

leftnumber :=

len(src)

% blocksize //5

//2. 得到需要填充的個數 8 - 5 = 3

neednumber := blocksize - leftnumber //3

//3. 建立乙個slice,包含3個3

b :=

byte

(neednumber)

newslice := bytes.

repeat([

]byte

, neednumber)

//newslice ==》 byte

fmt.

printf

("newsclie : %v\n"

, newslice)

//4. 將新切片追加到src

src =

(src, newslice...

)return src,

nil}

//解密後去除填充資料

func

unpaddingnumber

(src [

]byte)(

byte

,error

)func

main()

fmt.

printf

("encryptdata: %x\n"

, encryptdata)

key =

"12345678"

//秘鑰

//呼叫解密函式

plaintext, err :=

descbcdecrypt

(encryptdata,

byte

(key)

)if err !=

nil fmt.

printf

("解密後的資料: %s\n"

, plaintext)

fmt.

printf

("解密後的資料 hex : %x\n"

, plaintext)

}

使用GO語言實現對稱加密,DES 3DES AES

package main import bytes crypto aes crypto cipher crypto des 填充最後乙個分組的函式 src 原始資料 blocksize 每個分組的資料長度 func padding src byte,blocksize int byte paddin...

Go語言實現Valid Parentheses

write a function called that takes a string of parentheses,and determines if the order of the parentheses is valid.the function should return true if ...

Go語言實現AES加密演算法(CTR模式)

aes是目前比較流行的對稱加密演算法,是一種分組密碼演算法,aes的分組長度為128位元 16位元組 而金鑰長度可以是128位元 192位元或256位元。實現 如下 import crypto aes crypto cipher fmt aec加密和解密 crt模式 func aec crt cry...