golang Aes

package models

import (
    "bytes"
    "crypto/aes"
    "crypto/cipher"
    "errors"
)

const (
    ivDefValue = "0102030405060708"
)

func AesEncrypt(plaintext []byte, key []byte) ([]byte, error) {
    block, err := aes.NewCipher(key)
    if err != nil {
        return nil, errors.New("invalid decrypt key")
    }
    blockSize := block.BlockSize()
    plaintext = PKCS5Padding(plaintext, blockSize)
    iv := []byte(ivDefValue)
    blockMode := cipher.NewCBCEncrypter(block, iv) 

    ciphertext := make([]byte, len(plaintext))
    blockMode.CryptBlocks(ciphertext, plaintext)

    return ciphertext, nil
}

func AesDecrypt(ciphertext []byte, key []byte) ([]byte, error) {

    block, err := aes.NewCipher(key)
    if err != nil {
        return nil, errors.New("invalid decrypt key")
    }   

    blockSize := block.BlockSize()

    if len(ciphertext) < blockSize {
        return nil, errors.New("ciphertext too short")
    }   

    iv := []byte(ivDefValue)
    if len(ciphertext)%blockSize != 0 {
        return nil, errors.New("ciphertext is not a multiple of the block size")
    }   

    blockModel := cipher.NewCBCDecrypter(block, iv)

    plaintext := make([]byte, len(ciphertext))
    blockModel.CryptBlocks(plaintext, ciphertext)
    plaintext = PKCS5UnPadding(plaintext)

    return plaintext, nil
}

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

func PKCS5UnPadding(src []byte) []byte {
    length := len(src)
    unpadding := int(src[length-1])
    return src[:(length - unpadding)]
}

  

时间: 2024-10-27 09:39:44

golang Aes的相关文章

golang AES/ECB/PKCS5 加密解密 url-safe-base64

因为项目的需要用到golang的一种特殊的加密解密算法AES/ECB/PKCS5,但是算法并没有包含在标准库中,经过多次失败的尝试,终于解码成功,特此分享: /* 描述 : golang AES/ECB/PKCS5 加密解密 date : 2016-04-08 author: herohenu */ package main import ( "bytes" "crypto/aes" "crypto/cipher" "encoding/

Golang加密系列之AES

这里我们只讨论使用aes加密算法,pkcs7padding,CBC模式模式进行加密. 加密代码: func Encrypt(plantText, key []byte) ([]byte, error) {    block, err := aes.NewCipher(key) //选择加密算法    if err != nil {       return nil, err    }    plantText = PKCS7Padding(plantText, block.BlockSize()

Go语言(golang)开源项目大全

转http://www.open-open.com/lib/view/open1396063913278.html内容目录Astronomy构建工具缓存云计算命令行选项解析器命令行工具压缩配置文件解析器控制台用户界面加密数据处理数据结构数据库和存储开发工具分布式/网格计算文档编辑器Encodings and Character SetsGamesGISGo ImplementationsGraphics and AudioGUIs and Widget ToolkitsHardwareLangu

[Golang]Go Packages

----------------------------------------------------------------------------------------------------------- 程序包标准类库 其他程序包     子库     社区标准类库 名称     摘要 存档            tar     tar包实现了对档案的压缩.      zip     zip程序包对读写ZIP文档提供支持. bufio     bufio包实现了输入/输出缓冲.它包含

[转]Go语言(golang)开源项目大全

内容目录 Astronomy 构建工具 缓存 云计算 命令行选项解析器 命令行工具 压缩 配置文件解析器 控制台用户界面 加密 数据处理 数据结构 数据库和存储 开发工具 分布式/网格计算 文档 编辑器 Encodings and Character Sets Games GIS Go Implementations Graphics and Audio GUIs and Widget Toolkits Hardware Language and Linguistics 日志 机器学习 Math

java aes CBC的填充方式发现

如下的java代码,手动对block进行填充后,使其为16的整数倍后,加密的时候竟然强行再填充了16位,我在尝试用golang实现这段加密时,反复修改了很久,发现golang版的总是比java加密出来并base64的结果少了20位,于是把各个步骤中间结果打出来,发现并没有什么不同,然后尝试在golang后面强行追加了16个填充,那么填充什么呢?没错,我就是从0x0到0x10一个一个试出来的,最后发现当填充16个0x10时,golang跟java的加密结果就完全一样了,下面贴出golang跟jav

golang实现aes-cbc-256加密解密过程记录

我为什么吃撑了要实现go的aes-cbc-256加密解密功能? 之前的项目是用php实现的,现在准备用go重构,需要用到这个功能,这么常用的功能上网一搜一大把现成例子,于是基于go现有api分分钟实现一对加密解密函数,你想得没错,一跑就失败,好了不废话了,go的aes-cbc实现由两个限制 1:面临两个问题 1:go秘钥长度必须是16/24/32 go源码如下,我们的秘钥长度是29,不符合啊 // NewCipher creates and returns a new cipher.Block.

Golang(十一)TLS 相关知识(二)OpenSSL 生成证书

0. 前言 接前一篇文章,上篇文章我们介绍了数字签名.数字证书等基本概念和原理 本篇我们尝试自己生成证书 参考文献:TLS完全指南(二):OpenSSL操作指南 1. OpenSSL 简介 OpenSSL 是一个开源项目,其组成主要包括三个组件: openssl:多用途的命令行工具 libcrypto:加密算法库 libssl:加密模块应用库,实现了ssl及tls OpenSSL 主要用于秘钥证书管理.对称加密和非对称加密 1.1 指令 常用指令包括:genrsa.req.x509 1.1.1

微信用户加密数据解密 -golang版本

背景 因为小程序先前端获取的用户数据的openId和UnionId属于用户隐私数据,需要进行对用户加密数据进行解密才能获取,官方提供的有解密demo有php,python,C++等语言版本的,但是没有golang版本,所以今天写下博客,写下golang版的解密. 加密数据解密算法 接口如果涉及敏感数据(如wx.getUserInfo当中的 openId 和 unionId),接口的明文内容将不包含这些敏感数据.开发者如需要获取敏感数据,需要对接口返回的加密数据(encryptedData) 进行