分类 GO 下的文章

GO语言AES加密示例

GO在自己的源代码里面给出了AES的加密写法https://golang.org/src/crypto/cipher/,但是不够详细,其实大部分场景是我们会指定KEY和IV,但是在大部分的使用场景都是要显示的指定这两个值,以下代码是我们在线上 运行的,当然KEY我更改过.

AES

/

CBC

/

PKCS5Padding
package main
import (
    "bytes"
    "crypto/aes"
    "crypto/cipher"
    "fmt"
    "encoding/base64"
)

func main() {
    TestCBCAES()
}

var commonIV = []byte{0x1A, 0x3B, 0x36, 0x22, 0xD6, 0xE2, 0x2E, 0xD0, 0x22, 0xFB, 0xB8, 0x75, 0xDD, 0x38, 0x22, 0x11}
var secretKey = []byte{0x12, 0x4D, 0x4A, 0x3E, 0xC2, 0x08, 0x4A, 0x21, 0x41, 0xC1, 0xD5, 0xC5, 0xA8, 0x6A, 0xEE, 0xA1}
var planText = []byte(`ciika test go aes`)

func TestCBCAES() {
    fmt.Printf("Plain Text : %s\n", planText)

    // 加密
    result, err := AESEncrypt(planText, commonIV, secretKey)
    if err != nil {
        panic(err)
    }
    //nkmnjWoKu89yXXe+tTDoZxJIe7q/RGAD2JqXDHRgPoU=
    fmt.Println(base64.StdEncoding.EncodeToString(result))
    fmt.Printf("Encrypted Hex Data : %x\n", result)

    // 解密
    origData, err := AESDecrypt(result, commonIV, secretKey)
    if err != nil {
        panic(err)
    }
    fmt.Printf("Decrypted String : %s\n", origData)
}

// 加密函数
func AESEncrypt(origData, iv []byte, key []byte) ([]byte, error) {
    block, err := aes.NewCipher(key)
    if err != nil {
        return nil, err
    }
    blockSize := block.BlockSize()
    origData = PKCS5Padding(origData, blockSize)
    blockMode := cipher.NewCBCEncrypter(block, iv)
    crypted := make([]byte, len(origData))
    blockMode.CryptBlocks(crypted, origData)
    return crypted, nil
}

// 解密函数
func AESDecrypt(crypted, iv []byte, key []byte) ([]byte, error) {
    block, err := aes.NewCipher(key)
    if err != nil {
        return nil, err
    }
    blockMode := cipher.NewCBCDecrypter(block, iv)
    origData := make([]byte, len(crypted))
    // origData := crypted
    blockMode.CryptBlocks(origData, crypted)
    origData = PKCS5UnPadding(origData)
    return origData, nil
}

// padding
func PKCS5Padding(ciphertext []byte, blockSize int) []byte {
    padding := blockSize - len(ciphertext)%blockSize
    padtext := bytes.Repeat([]byte{byte(padding)}, padding)
    return append(ciphertext, padtext...)
}

// unpadding
func PKCS5UnPadding(origData []byte) []byte {
    length := len(origData)
    // remove the last byte
    unpadding := int(origData[length-1])
    return origData[:(length - unpadding)]
}

 

运行结果为:

Plain Text : ciika test go aes 2+1yVpDBD4G+3RWACNsRTD2YLlYDT5UzEE57LsriKpI= Encrypted Hex Data : dbed725690c10f81bedd158008db114c3d982e56034f9533104e7b2ecae22a92 Decrypted String : ciika test go aes

以上代码运行的结果,在相同的KEY和IV的情况下载JAVA,PYTHON,LUA里面运行得出的结果是一致的。