1. 程式人生 > >Go語言中操作DES加密詳解

Go語言中操作DES加密詳解

|

今天來講解一下加密函式中對稱加密的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加密,非對稱加密,橢圓曲線加密演算法等等