Go語言中操作DES加密詳解
阿新 • • 發佈:2018-12-18
|
今天來講解一下加密函式中對稱加密的DES加密函式,利用go語言實現DES加密解密操作。加解密思路分析:
-
加密CBC分組模式 1:建立並返回一個使用DES演算法的cipher.block的介面 金鑰長度為64bit,即64/8位元組 2:對最後一個明文分組進行資料填充 DES是以64bit的明文為一個單位來進行加密的 最後一組不夠64bit的則需要進行資料填充 3:建立一個密碼分組為連結模式的,底層使用DES加密的BlockMode介面 4:加密連續的資料塊
-
解密 1:建立並返回一個使用DES演算法的cipher.block的介面 2:建立一個密碼分組為連結模式的,底層使用DES解密的BlockMode介面 3:資料塊解密 4:去掉最後一塊資料的填充資料
下面我們來看一下程式碼實現
package main import ( "crypto/des" "crypto/cipher" "fmt" "bytes" "encoding/base64" ) /*des加密解密*/ //des的cbc模式加密函式 //src :明文 //key :金鑰,大小為8byte func DesEncrypt_CBC(src ,key []byte)[]byte{ //傳遞兩個引數,src為需要加密的明文,返回[]byte型別資料 //1:建立並返回一個DES演算法的cipher.block介面 block,err:=des.NewCipher(key) //2:判斷是否建立成功 if err!=nil{ panic(err) } //3:對最後一個明文分組進行資料填充 src=PKCS5Padding(src,block.BlockSize()) //4:建立一個密碼分組為連結模式的,底層使用DES加密的BLockMode介面 // 引數iv的長度,必須等於b的塊尺寸 tmp:=[]byte("helloAAA") //初始化向量 blockmode:=cipher.NewCBCEncrypter(block,tmp) //5:加密連續的資料塊 dst:=make([]byte,len(src)) blockmode.CryptBlocks(dst,src) //fmt.Println("加密之後的資料:",dst) //6:將加密後的資料返回 return dst } //des解密函式 //src :要解密的密文 //key :金鑰,和加密金鑰相同,大小為8byte func DesDecrypt_CBC(src ,key []byte)[]byte{ //1:建立並返回一個使用DES演算法的cipher.block介面 block,err:=des.NewCipher(key) //2:判斷是否建立成功 if err!=nil{ panic(err) } //建立一個密碼分組為連結模式的,底層使用DES解密的BlockMode介面 tmp:=[]byte("helloAAA") blockMode:=cipher.NewCBCDecrypter(block,tmp) //解密資料 dst:=make([]byte,len(src)) blockMode.CryptBlocks(dst,src) //5:去掉最後一組填充資料 dst=PKCS5UnPadding(dst) //返回結果 return dst } //使用pkcs5的方式填充 func PKCS5Padding(ciphertext []byte,blockSize int)[]byte{ //1:計算最後一個分組缺多少位元組 padding:=blockSize-(len(ciphertext)%blockSize) //2:建立一個大小為padding的切片,每個位元組的值為padding padText:=bytes.Repeat([]byte{byte(padding)},padding) //3:將padText新增到原始資料的後邊,將最後一個分組缺少的位元組數補齊 newText:=append(ciphertext,padText...) return newText } //刪除pkcs5填充的尾部資料 func PKCS5UnPadding(origData []byte)[]byte{ //1:計算資料的總長度 length:=len(origData) //2:根據填充的位元組值得到填充的次數 number:=int(origData[length-1]) //3:將尾部填充的number個位元組去掉 return origData[:(length-number)] } func main(){ //測試 key:=[]byte("11111111") //用這個金鑰加密解密 //加密資料 result:=DesEncrypt_CBC([]byte("床前明月光,疑是地上霜,舉頭望明月,低頭是故鄉"),key) fmt.Println(base64.StdEncoding.EncodeToString(result)) //解密 result=DesDecrypt_CBC(result,key) fmt.Println("解密之後的資料:",string(result)) }
看一下效果 後期將講解別的加密演算法,例如對稱加密中的AES加密,非對稱加密,橢圓曲線加密演算法等等