DES 3DES 加密演算法的呼叫

2021-08-20 10:53:19 字數 4444 閱讀 8334

初始向量

當加密第乙個明文分組時,由於不存在 「前乙個密文分組」,因此需要事先準備乙個長度為乙個分組的位元序列來代替 「前乙個密文分組」,這個位元序列稱為初始化向量(initializationvector),通常縮寫為 iv。

填充方式

當明文長度不為分組長度的整數倍時,需要在最後乙個分組中填充一些資料使其湊滿乙個分組長度。

採用3des、cbc模式、pkcs5padding,初始向量用key充當;另外,對於zero padding,還得約定好,對於資料長度剛好是block size的整數倍時,是否需要額外填充。

go中crypto/des包實現了 data encryption standard (des) and the triple data encryption algorithm (tdea)。檢視該包文件,發現相當簡單:定義了des塊大小(8bytes),定義了乙個keysizeerror。另外定義了兩個我們需要特別關注的函式,即

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

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

他們都是用來獲得乙個cipher.block。從名字可以很容易知道,des使用newcipher,3des使用newtripledescipher。引數都是金鑰(key)

使用des加密(des.newcipher),加密模式為cbc(cipher.newcbcencrypter(block, key)),填充方式pkcs5padding

func desencrypt(origdata, key byte) (byte, error) 

origdata = pkcs5padding(origdata, block.blocksize())

blockmode := cipher.newcbcencrypter(block, key)

crypted := make(byte, len(origdata))

blockmode.cryptblocks(crypted, origdata)

return crypted, nil

}

func desdecrypt(crypted, key byte) (byte, error) 

blockmode := cipher.newcbcdecrypter(block, key)

origdata := make(byte, len(crypted))

blockmode.cryptblocks(origdata, crypted)

origdata = pkcs5unpadding(origdata)

return origdata, nil

}

package main

import (

"bytes"

"crypto/cipher"

"crypto/des"

"encoding/base64"

"fmt"

)func main()

fmt.println(base64.stdencoding.encodetostring(result))

origdata, err := desdecrypt(result, key)

if err != nil

fmt.println(string(origdata))

}func desencrypt(origdata, key byte) (byte, error)

origdata = pkcs5padding(origdata, block.blocksize())

blockmode := cipher.newcbcencrypter(block, key)

crypted := make(byte, len(origdata))

blockmode.cryptblocks(crypted, origdata)

return crypted, nil

}func desdecrypt(crypted, key byte) (byte, error)

blockmode := cipher.newcbcdecrypter(block, key)

origdata := make(byte, len(crypted))

blockmode.cryptblocks(origdata, crypted)

origdata = pkcs5unpadding(origdata)

return origdata, nil

}func pkcs5padding(ciphertext byte, blocksize int) byte , padding)

return

}func pkcs5unpadding(origdata byte) byte

對比des,發現只是換了newtripledescipher。不過,需要注意的是,金鑰長度必須24byte,否則直接返回錯誤。

func tripledesencrypt(origdata, key byte) (byte, error) 

origdata = pkcs5padding(origdata, block.blocksize())

blockmode := cipher.newcbcencrypter(block, key[:8])

crypted := make(byte, len(origdata))

blockmode.cryptblocks(crypted, origdata)

return crypted, nil

}

func main() 

fmt.println(base64.stdencoding.encodetostring(result))

origdata, err := tripledesdecrypt(result, key)

if err != nil

fmt.println(string(origdata))

}

如果我們把主函式中key改為25位的1234567890123456789012345執行go run 3des.go,提示出現如下錯誤:

go run3des.go

panic: crypto/des: invalid key size25

goroutine1 [running]:

package main

import (

"bytes"

"crypto/cipher"

"crypto/des"

"encoding/base64"

"fmt"

)func main()

fmt.println(base64.stdencoding.encodetostring(result))

origdata, err := tripledesdecrypt(result, key)

if err != nil

fmt.println(string(origdata))

}// 3des加密

func tripledesencrypt(origdata, key byte) (byte, error)

origdata = pkcs5padding(origdata, block.blocksize())

blockmode := cipher.newcbcencrypter(block, key[:8])

crypted := make(byte, len(origdata))

blockmode.cryptblocks(crypted, origdata)

return crypted, nil

}// 3des解密

func tripledesdecrypt(crypted, key byte) (byte, error)

blockmode := cipher.newcbcdecrypter(block, key[:8])

origdata := make(byte, len(crypted))

blockmode.cryptblocks(origdata, crypted)

origdata = pkcs5unpadding(origdata)

return origdata, nil

}func pkcs5padding(ciphertext byte, blocksize int) byte , padding)

return

}func pkcs5unpadding(origdata byte) byte

DES加密演算法

命名空間 system.security.cryptography 定義訪問資料加密標準 des 演算法的加密服務提供程式 csp 版本的包裝物件。無法繼承此類。測試1加密頁面 protected void page load object sender,eventargs e response.r...

DES加密演算法

include include include include using namespace std const static char ip table 64 初始置換 const static char ipr table 64 初始逆置換表 static const char extensi...

3DES加密演算法

des是乙個經典的對稱加密演算法,但也缺陷明顯,即56位的金鑰安全性不足,已被證實可以在短時間內破解。為解決此問題,出現了3des,也稱triple des,3des為des向aes過渡的加密演算法,它使用3條56位的金鑰對資料進行三次加密。為了相容普通的des,3des並沒有直接使用 加密 加密 ...