golang desede(3des)加解密
阿新 • • 發佈:2018-11-08
package main import ( "bytes" "crypto/cipher" "crypto/des" "encoding/base64" "encoding/hex" "fmt" "strings" ) const ( KEY = "FRNX" IV = "23456789" ) func main() { miwen := "7379533330307A63724F554661783369495A653253393533775377426948704A" str := decode(miwen) str fmt.Println(str) } func genKey(key string) string { if len(key) < 32 { key += strings.Repeat("0", 32) } return key[:32] } func decode(miwen string) string { s, _ := hex.DecodeString(miwen) x, _ := base64.StdEncoding.DecodeString(string(s)) k, _ := base64.StdEncoding.DecodeString(genKey(KEY)) str, _ := tripleDesDecrypt(x, k) return string(str) } // 3DES解密 func tripleDesDecrypt(crypted, key []byte) ([]byte, error) { block, err := des.NewTripleDESCipher(key) if err != nil { fmt.Println(err.Error()) return nil, err } blockMode := cipher.NewCBCDecrypter(block, []byte(IV)) origData := make([]byte, len(crypted)) // origData := crypted blockMode.CryptBlocks(origData, crypted) origData = PKCS5UnPadding(origData) // origData = ZeroUnPadding(origData) return origData, nil } // 3DES加密 func TripleDesEncrypt(origData, key []byte) ([]byte, error) { block, err := des.NewTripleDESCipher(key) if err != nil { return nil, err } origData = PKCS5Padding(origData, block.BlockSize()) // origData = ZeroPadding(origData, block.BlockSize()) blockMode := cipher.NewCBCEncrypter(block, []byte(IV)) crypted := make([]byte, len(origData)) blockMode.CryptBlocks(crypted, origData) return crypted, nil } func PKCS5Padding(ciphertext []byte, blockSize int) []byte { padding := blockSize - len(ciphertext)%blockSize padtext := bytes.Repeat([]byte{byte(padding)}, padding) return append(ciphertext, padtext...) } func PKCS5UnPadding(origData []byte) []byte { length := len(origData) // 去掉最後一個位元組 unpadding 次 unpadding := int(origData[length-1]) return origData[:(length - unpadding)] }