熟悉一下GO的AES加密库

 

package main

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

type ConnAes struct {
    key      string
    keyBlock cipher.Block
    iv       string
}

func NewConnAes(key string, iv string) (ca ConnAes, err error) {
    if len(iv) != aes.BlockSize {
        return ca, errors.New("error iv size not 16")
    }
    ca.key = key
    ca.iv = iv
    ca.keyBlock, err = aes.NewCipher([]byte(key))
    return ca, err
}
//加密
func (ca *ConnAes) Encrypt(src []byte) ([]byte, error) {
    paddinglen := aes.BlockSize - (len(src) % aes.BlockSize)
    for i := 0; i < paddinglen; i++ {
        src = append(src, byte(paddinglen))
    }
    enbuf := make([]byte, len(src))
    cbce := cipher.NewCBCEncrypter(ca.keyBlock, []byte(iv))
    cbce.CryptBlocks(enbuf, src)
    return enbuf, nil
}
//解密
func (ca *ConnAes) Decrypt(src []byte) ([]byte, error) {

    if (len(src) < aes.BlockSize) || (len(src)%aes.BlockSize != 0) {
        return nil, errors.New("error encrypt data size")
    }

    debuf := make([]byte, len(src))
    cbcd := cipher.NewCBCDecrypter(ca.keyBlock, []byte(iv))
    cbcd.CryptBlocks(debuf, src)
    paddinglen := int(debuf[len(src)-1])
    if paddinglen > 16 {
        return nil, errors.New("error encrypt data size")
    }
    return debuf[:len(src)-paddinglen], nil
}
时间: 2024-08-25 04:06:20

熟悉一下GO的AES加密库的相关文章

AES加密 C++调用Crypto++加密库 例子

这阵子写了一些数据加密的小程序,对比了好几种算法后,选择了AES,高级加密标准(英语:Advanced Encryption Standard,缩写:AES),听这名字就很厉害的样子 估计会搜索到这文章的,对AES算法已经有了些基本了解了吧,下面先简单介绍一下AES加密算法吧 (1)AES在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一. (2)AES加密数据块分组长度必须为128比特,密钥长度可以是128

透过 Delphi 使用二进位金钥做 AES 加密.

从 1994 年开始,笔者就开始接触加密与网路安全的世界,从鲁立忠老师的指导当中获益良多,后来在台湾的元智大学就读研究所的时候,也以此为研究主题. 在当时,电子商务是显学,Visa跟 Master Card还特别为了网路交易制作了厚厚三大本的商务通讯协定,命名为SET (Secure Electronic Transaction,安全电子交易),从客户端.商店端.银行端定义了绵绵密密的交易规范. 然而,网际网路的世界跟 Visa Master Card所熟悉的专用网路世界差的远了,不是大狗们(B

非对称技术栈实现AES加密解密

非对称技术栈实现AES加密解密 正如前面的一篇文章所述,https协议的SSL层是实现在传输层之上,应用层之下,也就是说在应用层上看到的请求还是明码的,对于某些场景下要求这些http请求参数是非可读的,这就要求在前端和后端不同的技术栈上完成信息的加密解密.当然我们通常完成这样专业的功能都会考虑使用相应的框架或者程序库来完成功能,前端或者NodeJS平台通常是JavaScript语言,JavaScript主流的加密解密库分别是SjclJS和CryptoJS, 本文以CryptoJS为例进行讨论.另

OC与JAVA通用的AES加密解密

最近项目中用到AES加密,但在网上找了很多的库都是OC与JAVA加密后不能项目解密,因为我们的服务器是用java写的,所以不能通用对于做iOS的就是个大麻烦,Android就比较悠哉用java写所以没什么事.不过,在把度娘全身搜遍后,还是让我找到了这个库,出处记不清了,之前找了好多好多的库.下面记录下使用方法. 例子:http://pan.baidu.com/s/1dDktRPn OC调用方法: // // ViewController.m // AESTest // // Created by

ecshop的aes加密(封装)

从一家做shopex,ecstore的公司到一家做b2b的ecshop的公司...来了就要实战,其他的不说了,先来了解什么是php的aes加密吧? aes(高级加密标准),AES的区块长度固定为128 比特,密钥长度则可以是128,192或256比特:是一个可逆的加密方式,同md5不同. AES分为几种模式,比如ECB,CBC,CFB等等,这些模式除了ECB由于没有使用IV而不太安全,其他模式差别并没有太明显,大部分的区别在IV和KEY来计算密文的方法略有区别. iv的作用? IV称为初始向量,

JNI调用c++实现AES加密解密

最近项目中用到数据加密解密的功能,由于Android.iOS以及服务器端都需要用到这个功能.而不同平台上加密出来的密文是不一样的,这样导致互相之间密文无法使用.于是决定使用C/C++完成加密解密,其他平台调用的方式进行处理. 加密解密实现 AES加密的具体实现过程本文暂不讨论,实现代码是直接从openssl源码中抽出来. 加密解密调用以下两个方法: int aes_encrypt(char * in, char* key, char * out) 加密//明文,密钥,密文 int aes_dec

关于httpd 2.x,mod_auth_mysql模块的安装配置以及对aes加密的支持

前言 在之前的一篇博文<Apache httpd2.2版本以及2.4版本部分实验>的实验二里面,提到了协议认证使用了mod_auth_mysql.so模块,本文将阐述该模块的安装,配置,以及对于aes加密特性的支持. 基于开发者文档的安装步骤 注:在笔者的CentOS7测试环境下并不支持aes加密 首先从模块提供的官方站点下载mod_auth_mysql-3.0.0.tar.gz,并下载对应的补丁mod_auth_mysql_3.0.0_patch_apache2.4.diff,解压缩之后,将

polarssl rsa &amp; aes 加密与解密

上周折腾加密与解密,用了openssl, crypto++, polarssl, cyassl, 说起真的让人很沮丧,只有openssl & polarssl两个库的RSA & AES 加密和解密,我用起来了,crypto++各种模板,各种多继承,看的头大,而且对各种常用的加密算法也不了解,所以这个库我在折腾了一天之后就放弃了:cyassl这个库现在没什么印象了:openssl没什么好说的,用起来很方便,尤其是使用win32openssl,都不用自己编译,下载下来安装好了就能用,着实方便:

JS和利用openssl的object C加密得到相同的aes加密密文

这是之前接到的一个工作内容,项目原本的登录操作是获得账号和密码以后,对密码进行一遍MD5加密,然后传递账号和密文到cgi文件.在c中获取到账户以后,从数据库中获取到密码,对密码进行一次MD5的加密,然后将该密文与post过来的密文进行对比,进行登录验证.也就是说,虽然进行了一次密码加密,但是在get/post的过程中,该密文是可见的,不符合客户的保密需求. 经过协商以后决定,在传递的过程中不再对密码进行传输,而是将账号与session进行组合,组合成一个新的字符串以后,将密码当做密钥,进行一次A