Skip to content

Golang aes双向加解密 #57

Description

@dongjun111111

Golang aes双向加解密

密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,这个标准用来替代原先的DES。AES 加密数据块分组长度必须为128bit,密钥长度可以是128bit、192bit、256bit中的任意一个。

package main

import (
    "crypto/aes"
    "crypto/cipher"
    "crypto/rand"
    "encoding/hex"
    "errors"
    "fmt"
    "io"
    "sync"
)

// key
const aesTable = "abcdefghijklmnopkrstuvwsyz012345"

var (
    block cipher.Block
    mutex sync.Mutex
)

func main() {
    // encript
    encodeBytes, err := Encrypt([]byte("weloveyouchinese"))
    if err != nil {
        fmt.Println("Encrypt: ", err)
        return
    }

    // encode println
    fmt.Printf("Encrypt code: %x\n", string(encodeBytes))

    // decrypt
    decodeBytes, err := Decrypt(encodeBytes)
    if err != nil {
        fmt.Println("Decrypt: ", err)
        return
    }

    // decode println
    fmt.Println("Decrypt code: ", string(decodeBytes))
}

// AES加密
func Encrypt(src []byte) ([]byte, error) {
    // 验证输入参数
    // 必须为aes.Blocksize的倍数
    if len(src)%aes.BlockSize != 0 {
        return nil, errors.New("crypto/cipher: input not full blocks")
    }

    encryptText := make([]byte, aes.BlockSize+len(src))

    iv := encryptText[:aes.BlockSize]
    if _, err := io.ReadFull(rand.Reader, iv); err != nil {
        return nil, err
    }

    mode := cipher.NewCBCEncrypter(block, iv)

    mode.CryptBlocks(encryptText[aes.BlockSize:], src)

    return encryptText, nil
}

// AES解密
func Decrypt(src []byte) ([]byte, error) {
    // hex
    decryptText, err := hex.DecodeString(fmt.Sprintf("%x", string(src)))
    if err != nil {
        return nil, err
    }

    // 长度不能小于aes.Blocksize
    if len(decryptText) < aes.BlockSize {
        return nil, errors.New("crypto/cipher: ciphertext too short")
    }

    iv := decryptText[:aes.BlockSize]
    decryptText = decryptText[aes.BlockSize:]

    // 验证输入参数
    // 必须为aes.Blocksize的倍数
    if len(decryptText)%aes.BlockSize != 0 {
        return nil, errors.New("crypto/cipher: ciphertext is not a multiple of the block size")
    }

    mode := cipher.NewCBCDecrypter(block, iv)

    mode.CryptBlocks(decryptText, decryptText)

    return decryptText, nil
}

func init() {
    mutex.Lock()
    defer mutex.Unlock()

    if block != nil {
        return
    }

    cblock, err := aes.NewCipher([]byte(aesTable))
    if err != nil {
        panic("aes.NewCipher: " + err.Error())
    }

    block = cblock
}
output==>
Encrypt code: 0a3abe1e503aa3d701dbfe99f4f532544743c776a3c4073763398b6a21544063
Decrypt code:  weloveyouchinese

参考

http://outofmemory.cn/code-snippet/34958/golang-aes-add

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions