golang中crypto/aes包

综合技术 2018-12-08 阅读原文

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))
}
Go语言中文网

责编内容by:Go语言中文网阅读原文】。感谢您的支持!

您可能感兴趣的

Mini Rulebook for Go short declarations Short variable declarations rulebook How to use short variable declarations properly. ...
Not So Cozy: An Uncomfortable Examination of a Sus... Introduction FireEye devices detected intrusion attempts against multiple industries, including think tank, law...
gobox中的color和crypto 今天来说下gobox中的color和crypto两个box。 color color的主要作用是为在终端中输出的信息添加颜色。 用法示例 package mainimport ( "github.com/goin...
警惕!新型“撒旦”病毒来袭,360率先支持解密 “基因”编辑之后,Satan病毒离降维打击还远吗?... 基因编辑,对于人类来说,可谓是“潘多拉魔盒”,是悬在人类头顶的“达摩克利斯之剑”。毕竟这祖传的基因,不是你想改造就改造,想加buff就加buff的。 然鹅,对于撒旦(Satan)这样的勒索病毒来说,编辑“基因”,算不上什么神仙操作。过去...
Golang的WaitGroup陷阱 sync.WaitGroup 是并发环境中,一个相当常用的数据结构,用来等待所有协程的结束,在写代码的时候都是按着例子的样子写的,也没用深究过它的使用。前几日想着能不能在协程中执行 Add() 函数,答案是不能,这里介绍下。...