初始向量
當加密第乙個明文分組時,由於不存在 「前乙個密文分組」,因此需要事先準備乙個長度為乙個分組的位元序列來代替 「前乙個密文分組」,這個位元序列稱為初始化向量(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並沒有直接使用 加密 加密 ...