美文网首页go语言
golang中crypto/aes包

golang中crypto/aes包

作者: ljh123 | 来源:发表于2018-12-08 16:50 被阅读0次

    aes是对称加密算法,这篇博客只介绍怎么使用golang中怎么调用标准库已封装的算法实现,如果是要学习aes算法实现,移步百度

    有两个操作:加密和解密
    const BlockSize = 16
    功能说明:AES算法块(加密数据块)的字节长度。

    package main
    
    import (
        "bytes"
        "crypto/aes"
        "crypto/cipher"
        "log"
        "fmt"
    )
    
    // 填充数据
    func padding(src []byte, blockSize int) []byte {
        padNum := blockSize - len(src) % blockSize
        pad := bytes.Repeat([]byte{byte(padNum)}, padNum)
        return append(src, pad...)
    }
    
    // 去掉填充数据
    func unpadding(src []byte) []byte {
        n := len(src)
        unPadNum := int(src[n-1])
        return src[:n-unPadNum]
    }
    
    // 加密
    func encryptAES(src []byte, key []byte) ([]byte, error) {
        block, err := aes.NewCipher(key)
        if err != nil {
            return nil, err
        }
        src = padding(src, block.BlockSize())
        blockMode := cipher.NewCBCEncrypter(block, key)
        blockMode.CryptBlocks(src, src)
        return src, nil
    }
    
    // 解密
    func decryptAES(src []byte, key []byte) ([]byte, error) {
        block, err := aes.NewCipher(key)
        if err != nil {
            return nil, err
        }
        blockMode := cipher.NewCBCDecrypter(block, key)
        blockMode.CryptBlocks(src, src)
        src = unpadding(src)
        return src, nil
    }
    
    func main() {
        d := []byte("hello,ase")
        key := []byte("hgfedcba87654321")
        fmt.Println("加密前:", string(d))
        x1, err := encryptAES(d, key)
        if err != nil {
            log.Fatalln(err)
        }
        fmt.Println("加密后:", string(x1))
        x2, err := decryptAES(x1, key)
        if err != nil {
            log.Fatalln(err)
        }
        fmt.Println("解密后:", string(x2))
    }
    

    相关文章

      网友评论

        本文标题:golang中crypto/aes包

        本文链接:https://www.haomeiwen.com/subject/usrqhqtx.html