zoukankan      html  css  js  c++  java
  • golang AES对称加解密

    import (
    	"crypto/aes"
    	"crypto/cipher"
    	"crypto/rand"
    	"crypto/rsa"
    	"crypto/tls"
    	"crypto/x509"
    	"encoding/base64"
    	"errors"
    	"github.com/go-gomail/gomail"
    	"io"
    )
    
    const (
    	aesTable = "ywlSRb80TaCQ4b7b"
    )
    
    var (
    	aesBlock       cipher.Block
    	ErrAESTextSize = errors.New("ciphertext is not a multiple of the block size")
    	ErrAESPadding  = errors.New("cipher padding size error")
    )
    
    
    func init() {
    	var err error
    	aesBlock, err = aes.NewCipher([]byte(aesTable))
    	if err != nil {
    		panic(err)
    	}
    }
    
    
    // AES解密
    func aesDecrypt(src []byte) ([]byte, error) {
    	// 长度不能小于aes.Blocksize
    	if len(src) < aes.BlockSize*2 || len(src)%aes.BlockSize != 0 {
    		return nil, ErrAESTextSize
    	}
    	srcLen := len(src) - aes.BlockSize
    	decryptText := make([]byte, srcLen)
    	iv := src[srcLen:]
    	mode := cipher.NewCBCDecrypter(aesBlock, iv)
    	mode.CryptBlocks(decryptText, src[:srcLen])
    	paddingLen := int(decryptText[srcLen-1])
    	if paddingLen > 16 {
    		return nil, ErrAESPadding
    	}
    	return decryptText[:srcLen-paddingLen], nil
    }
    
    
    // AES加密
    
    func aesEncrypt(src []byte) ([]byte, error) {
    	padLen := aes.BlockSize - (len(src) % aes.BlockSize)
    	for i := 0; i < padLen; i++ {
    		src = append(src, byte(padLen))
    	}
    	srcLen := len(src)
    	encryptText := make([]byte, srcLen+aes.BlockSize)
    	iv := encryptText[srcLen:]
    	if _, err := io.ReadFull(rand.Reader, iv); err != nil {
    		return nil, err
    	}
    	mode := cipher.NewCBCEncrypter(aesBlock, iv)
    	mode.CryptBlocks(encryptText[:srcLen], src)
    	return encryptText, nil
    }
    
    func main() {
    	en, err := aesEncrypt([]byte("he"))
    	if err != nil {
    		panic(err)
    	}
    	println(string(en))
    	de, err := aesDecrypt(en)
    	if err != nil {
    		panic(err)
    	}
    	println(string(de))
    }
    

      

  • 相关阅读:
    当 IDENTITY_INSERT 设置为 OFF 时,不能向表 'tb_User' 中的标识列插入显式值。
    版本控制器Vss和svn
    判断浏览器刷新与关闭的代码
    web开发过程中要注意的问题(二)【转】
    JS版include函数
    兼容FF/IE的添加收藏夹的代码
    jQuery技巧总结
    把JS与CSS写在同一个文件里
    CSS hack浏览器兼容一览表
    利用JS获取IE客户端IP及MAC的实现
  • 原文地址:https://www.cnblogs.com/zipon/p/12857546.html
Copyright © 2011-2022 走看看