您的位置:首页 > 编程语言 > Go语言

熟悉一下GO的AES加密库

2016-03-01 20:21 507 查看
 

package main

import (
"crypto/aes"
"crypto/cipher"
"errors"
)

type ConnAes struct {
key      string
keyBlock cipher.Block
iv       string
}

func NewConnAes(key string, iv string) (ca ConnAes, err error) {
if len(iv) != aes.BlockSize {
return ca, errors.New("error iv size not 16")
}
ca.key = key
ca.iv = iv
ca.keyBlock, err = aes.NewCipher([]byte(key))
return ca, err
}
//加密
func (ca *ConnAes) Encrypt(src []byte) ([]byte, error) {
paddinglen := aes.BlockSize - (len(src) % aes.BlockSize)
for i := 0; i < paddinglen; i++ {
src = append(src, byte(paddinglen))
}
enbuf := make([]byte, len(src))
cbce := cipher.NewCBCEncrypter(ca.keyBlock, []byte(iv))
cbce.CryptBlocks(enbuf, src)
return enbuf, nil
}
//解密
func (ca *ConnAes) Decrypt(src []byte) ([]byte, error) {

if (len(src) < aes.BlockSize) || (len(src)%aes.BlockSize != 0) {
return nil, errors.New("error encrypt data size")
}

debuf := make([]byte, len(src))
cbcd := cipher.NewCBCDecrypter(ca.keyBlock, []byte(iv))
cbcd.CryptBlocks(debuf, src)
paddinglen := int(debuf[len(src)-1])
if paddinglen > 16 {
return nil, errors.New("error encrypt data size")
}
return debuf[:len(src)-paddinglen], nil
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: