业务需要对接接口, 采用DES加密方式加密, 于是google一下go的DES加密方式,
go的DES的默认隐藏了ECB模式, 因为go认为ECB不安全, 所以不建议使用,就隐藏了,
然而接口却需要采用ECB模式(吐槽写文档的人, 并没有写明使用了ECB模式,
这让我耗费了大量的时间来猜测他的加密模式)
码 //ECB加密 func EncryptDES_ECB(src, key string) string { data := []byte(src) keyByte := []byte(key) block, err := des.NewCipher(keyByte) if err != nil { panic(err) } bs := block.BlockSize() //对明文数据进行补码 data = PKCS5Padding(data, bs) if len(data)%bs != 0 { panic("Need a multiple of the blocksize") } out := make([]byte, len(data)) dst := out for len(data) > 0 { //对明文按照blocksize进行分块加密 //必要时可以使用go关键字进行并行加密 block.Encrypt(dst, data[:bs]) data = data[bs:] dst = dst[bs:] } return fmt.Sprintf("%X", out) } //ECB解密 func DecryptDES_ECB(src, key string) string { data, err := hex.DecodeString(src) if err != nil { panic(err) } keyByte := []byte(key) block, err := des.NewCipher(keyByte) if err != nil { panic(err) } bs := block.BlockSize() if len(data)%bs != 0 { panic("crypto/cipher: input not full blocks") } out := make([]byte, len(data)) dst := out for len(data) > 0 { block.Decrypt(dst, data[:bs]) data = data[bs:] dst = dst[bs:] } out = PKCS5UnPadding(out) return string(out) } //CBC加密 func EncryptDES_CBC(src, key string) string { data := []byte(src) keyByte := []byte(key) block, err := des.NewCipher(keyByte ) if err != nil { panic(err) } data = PKCS5Padding(data , block.BlockSize()) //获取CBC加密模式 iv := keyByte //用密钥作为向量(不建议这样使用) mode := cipher.NewCBCEncrypter(block, iv) out := make([]byte, len(data)) mode .CryptBlocks(out, data) return fmt.Sprintf("%X", out) } //CBC解密 func DecryptDES_CBC(src, key string) string { keyByte := []byte(key) data, err := hex.DecodeString(src) if err != nil { panic(err) } block, err := des.NewCipher(keyByte) if err != nil { panic(err) } iv := keyByte //用密钥作为向量(不建议这样使用) mode := cipher.NewCBCDecrypter(block, iv) plaintext := make([]byte, len(data)) mode.CryptBlocks(plaintext, data) plaintext = PKCS5UnPadding(plaintext) return string(plaintext) } //明文补码算法 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 := int(origData[length-1]) return origData[:(length - unpadding)] }
转自https://my.oschina.net/imhuayi/blog/1541840
Go语言的DES加密(CBC模式, ECB模式) ---- 与java加密互通(转)
原文:https://www.cnblogs.com/leescre/p/10500808.html