Go語言中操作三重DES加密詳解

|版權聲明:本文爲博主原創文章,未經博主允許不得轉載。博客地址: https://blog.csdn.net/sgsgy5

1.三重DES

現在DES已經可以在現實的時間內被暴力破解,因此我們需要一種用來替代DES的分組密碼,三重DES就是出於這個目的被開發出來的。

三重DES(triple-DES)是爲了增加DES的強度,將DES重複3次所得到的一種密碼算法,通常縮寫爲3DES。

2.三重DES的加密

三重DES的加解密機制如圖所示:

加->解->加 -> 目的是爲了兼容des

3des祕鑰長度24字節 = 1234567a 1234567b 1234567a

明文: 10

祕鑰1: 2

祕鑰2: 3

祕鑰3: 4

加密算法: 明文+祕鑰

解密算法: 密文-祕鑰

10+2-3+4

在這裏插入圖片描述
在這裏插入圖片描述

明文經過三次DES處理才能變成最後的密文,由於DES密鑰的長度實質上是56比特,因此三重DES的密鑰長度就是56×3=168比特, 加上用於錯誤檢測的標誌位8x3, 共192bit。

從上圖我們可以發現,三重DES並不是進行三次DES加密(加密–>加密–>加密),而是加密–>解密–>加密的過程。在加密算法中加人解密操作讓人感覺很不可思議,實際上這個方法是IBM公司設計出來的,目的是爲了讓三重DES能夠兼容普通的DES。

當三重DES中所有的密鑰都相同時,三重DES也就等同於普通的DES了。這是因爲在前兩步加密–>解密之後,得到的就是最初的明文。因此,以前用DES加密的密文,就可以通過這種方式用三重DES來進行解密。也就是說,三重DES對DES具備向下兼容性。

如果密鑰1和密鑰3使用相同的密鑰,而密鑰2使用不同的密鑰(也就是隻使用兩個DES密鑰),這種三重DES就稱爲DES-EDE2。EDE表示的是加密(Encryption) -->解密(Decryption)–>加密(Encryption)這個流程。

密鑰1、密鑰2、密鑰3全部使用不同的比特序列的三重DES稱爲DES-EDE3。

儘管三重DES目前還被銀行等機構使用,但其處理速度不高,而且在安全性方面也逐漸顯現出了一些問題。

3.Go中對3DES的操作

加解密實現思路
  • 加密 - CBC分組模式

    1. 創建並返回一個使用3DES算法的cipher.Block接口
       - **祕鑰長度爲64bit*3=192bit, 即 192/8 = 24字節(byte)**
    2. 對最後一個明文分組進行數據填充
       - 3DES是以64比特的明文(比特序列)爲一個單位來進行加密的
       - 最後一組不夠64bit, 則需要進行數據填充( **參考第三章**)
    3. 創建一個密碼分組爲鏈接模式的, 底層使用3DES加密的BlockMode接口
    4. 加密連續的數據塊
    
  • 解密

    1. 創建並返回一個使用3DES算法的cipher.Block接口
    2. 創建一個密碼分組爲鏈接模式的, 底層使用3DES解密的BlockMode接口
    3. 數據塊解密
    4. 去掉最後一組的填充數據
    
加解密的代碼實現

3DES加密代碼

// 3DES加密
func TripleDESEncrypt(src, key []byte) []byte {
	// 1. 創建並返回一個使用3DES算法的cipher.Block接口
	block, err := des.NewTripleDESCipher(key)
	if err != nil{
		panic(err)
	}
	// 2. 對最後一組明文進行填充
	src = PKCS5Padding(src, block.BlockSize())
	// 3. 創建一個密碼分組爲鏈接模式, 底層使用3DES加密的BlockMode模型
	blockMode := cipher.NewCBCEncrypter(block, key[:8])
	// 4. 加密數據
	dst := src
	blockMode.CryptBlocks(dst, src)
	return dst
}

3DES解密代碼

// 3DES解密
func TripleDESDecrypt(src, key []byte) []byte {
	// 1. 創建3DES算法的Block接口對象
	block, err := des.NewTripleDESCipher(key)
	if err != nil{
		panic(err)
	}
	// 2. 創建密碼分組爲鏈接模式, 底層使用3DES解密的BlockMode模型
	blockMode := cipher.NewCBCDecrypter(block, key[:8])
	// 3. 解密
	dst := src
	blockMode.CryptBlocks(dst, src)
	// 4. 去掉尾部填充的數據
	dst = PKCS5UnPadding(dst)
	return dst
}

重要的函數說明

  1. 生成一個底層使用3DES加解密的Block接口對象

    函數對應的包: import "crypto/des"
    func NewTripleDESCipher(key []byte) (cipher.Block, error)
    	- 參數 key: 3des對稱加密使用的密碼, 密碼長度爲(64*3)bit,(8*3)byte
    	- 返回值 cipher.Block: 創建出的使用DES加/解密的Block接口對象
    
  2. 創建一個密碼分組爲CBC模式, 底層使用b加密的BlockMode接口對象

    函數對應的包: import "crypto/cipher"
    func NewCBCEncrypter(b Block, iv []byte) BlockMode
        - 參數 b: 使用des.NewTripleDESCipher 函數創建出的Block接口對象
        - 參數 iv: 事先準備好的一個長度爲一個分組長度的比特序列, 每個分組爲64bit,8byte
        - 返回值: 得到的BlockMode接口對象
    
  3. 使用cipher包的BlockMode接口對象對數據進行加解密

    接口對應的包: import "crypto/cipher"
    type BlockMode interface {
        // 返回加密字節塊的大小
        BlockSize() int
        // 加密或解密連續的數據塊,src的尺寸必須是塊大小的整數倍,src和dst可指向同一內存地址
        CryptBlocks(dst, src []byte)
    }
    接口中的 CryptBlocks(dst, src []byte) 方法:
        - 參數 dst: 傳出參數, 存儲加密或解密運算之後的結果 
        - 參數 src: 傳入參數, 需要進行加密或解密的數據切片(字符串)
    
  4. 創建一個密碼分組爲CBC模式, 底層使用b解密的BlockMode接口對象

    函數對應的包: import "crypto/cipher"
    func NewCBCDecrypter(b Block, iv []byte) BlockMode
        - 參數 b: 使用des.NewTripleDESCipher 函數創建出的Block接口對象
        - 參數 iv: 事先準備好的一個長度爲一個分組長度的比特序列, 每個分組爲64bit,8byte, 
                   該序列的值需要和NewCBCEncrypter函數的第二個參數iv值相同
        - 返回值: 得到的BlockMode接口對象
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章