DES--------Golang对称加密之模式问题实战
1. 背景近期项目在对接第三方产品,传输过程中涉及到数据加密,数据加密流程为:
DES介绍
DES常见加密模式CBC(加密分组链接模式)
加密字符串为为AAA,则补位为AAA55555;加密字符串为BBBBBB,则补位为BBBBBB22;加密字符串为CCCCCCCC,则补位为CCCCCCCC88888888。 ECB(电子密码本模式)
CFB(加密反馈模式)
OFB(输出反馈模式)
DES加密之golang的CBC和ECB模式代码实现CBC和ECB模式加密func DesECBEncrypt(data,key []byte)([]byte,error) { block,err := des.NewCipher(key) if err != nil { return nil,err } bs := block.BlockSize() data = PKCS5Padding(data,bs) if len(data)%bs != 0 { return nil,errors.New("Need a multiple of the blocksize") } out := make([]byte,len(data)) dst := out for len(data) > 0 { block.Encrypt(dst,data[:bs]) data = data[bs:] dst = dst[bs:] } return out,nil } func DesCBCEncrypt(origData,key []byte) ([]byte,err } origData = PKCS5Padding(origData,block.BlockSize()) // origData = ZeroPadding(origData,block.BlockSize()) blockMode := cipher.NewCBCEncrypter(block,key) crypted := make([]byte,len(origData)) // 根据CryptBlocks方法的说明,如下方式初始化crypted也可以 // crypted := 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...) } CBC和ECB模式解密func DesECBDecrypt(data,err } bs := block.BlockSize() if len(data)%bs != 0 { return nil,errors.New("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 out,nil } func DesCBCDecrypt(crypted,err } blockMode := cipher.NewCBCDecrypter(block,key) //origData := make([]byte,len(crypted)) origData := crypted blockMode.CryptBlocks(origData,crypted) //origData = PKCS5UnPadding(origData) origData = PKCS5UnPadding(origData) return origData,nil } func PKCS5UnPadding(origData []byte) []byte { length := len(origData) unpadding := int(origData[length-1]) return origData[:(length - unpadding)] } 总结
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |