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())

   blockModel := cipher.NewCBCEncrypter(block, key)

   ciphertext := make([]byte, len(plantText))

   blockModel.CryptBlocks(ciphertext, plantText)
   return ciphertext, nil
}

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

解密代码:

func Decrypt(ciphertext, key []byte) ([]byte, error) {
   keyBytes := []byte(key)
   block, err := aes.NewCipher(keyBytes) //选择加密算法
   if err != nil {
      return nil, err
   }
   blockModel := cipher.NewCBCDecrypter(block, keyBytes)
   plantText := make([]byte, len(ciphertext))
   blockModel.CryptBlocks(plantText, ciphertext)
   plantText = PKCS7UnPadding(plantText, block.BlockSize())
   return plantText, nil
}

func PKCS7UnPadding(plantText []byte, blockSize int) []byte {
   length := len(plantText)
   unpadding := int(plantText[length-1])
   return plantText[:(length - unpadding)]
}

OK,代码上完,需要立刻能干活的童鞋,直接command+c & command+v 就OK了,想折腾的童鞋接着往下看,我们来讨论下相关的概念性的东西,

AES:高级加密标准(Advanced Encryption Standard),又称Rijndael加密法,这个标准用来替代原先的DES。AES加密数据块分组长度必须为128bit(byte[16]),密钥长度可以是128bit(byte[16])、192bit(byte[24])、256bit(byte[32])中的任意一个。

块:对明文进行加密的时候,先要将明文按照128bit进行划分。

填充方式:因为明文的长度不一定总是128的整数倍,所以要进行补位,我们这里采用的是PKCS7填充方式,关于PKCS7,请戳这里

模式:这个,介绍起来有点复杂,请戳

时间: 2024-09-30 22:39:50

Golang加密系列之AES的相关文章

7.java 加解密技术系列之 AES

java 加解密技术系列之 AES 序 概念 原理 应用 代码实现 结束语 序 这篇文章继续介绍对称加密算法,至于今天的主角,不用说,也是个厉害的角色 — — AES.AES 的出现,就是为了来替代原先的 DES 标准.现在来说,AES 的用途还是非常广泛的. 概念 AES, 全称为“Advanced Encryption Standard”,中文名“高级加密标准”,在密码学中又称 Rijndael 加密法,是美国联邦政府采用的一种区块加密标准.AES 加密算法作为新一代的数据加密标准汇聚了强安

C#加密解密(DES,AES,Base64,md5,SHA256,RSA,RC4)

一:异或^简单加解密(数字类型) 1:原理: 异或用于比较两个二进制数的相应位,在执行按位"异或"运算时,如果两个二进制数的相应位都为1或者都为0,则返回0;如果两个二进制数的相应位其中一个为1另一个为0,则返回1. //对数字加密 int P_int_Num, P_int_Key;//定义两个值类型变量 string Encryptstr = (P_int_Num ^ P_int_Key).ToString();//加密数值 //对数字解密 int P_int_Key, P_int_

Python解析器源码加密系列之(二):一次使用标准c的FILE*访问内存块的尝试

摘要:由于近期打算修改Python解释器以实现pyc文件的加密/解密,出于保密的要求,解密之后的数据只能放在内存中,不能写入到文件中.但是后续的解析pyc文件的代码又只能接受FILE*作为入参,所以就提出了一种把通过FILE*来访问内存的需求,下文是针对这个需求的几个方面的尝试及其结论. 以下尝试的前提是:Win7 + VS2010. 在vc中,FILE其实就是_iobuf,定义如下: struct _iobuf { char *_ptr; //文件输入的下一个位置 int _cnt; //当前

iOS常用加密方法(aes、md5、base64)

1.代码 iOS常用加密方法(aes.md5.base64) 1.AES加密 NSData+AES.h文件 // // NSData-AES.h // Smile // // Created by 周 敏 on 12-11-24. // Copyright (c) 2012年 BOX. All rights reserved. // #import <Foundation/Foundation.h> @class NSString; @interface NSData (Encryption)

iOS经常使用加密方式(MD5,AES,BASE64)与网络数据安全

演示样例项目下载地址  https://github.com/cerastes/Encryption 1MD5 创建MD5类 #import <Foundation/Foundation.h> @interface CJMD5 : NSObject +(NSString *)md5HexDigest:(NSString *)input; @end #import "CJMD5.h" #import <CommonCrypto/CommonDigest.h> @i

DES加密解密与AES加密解密

目录 [1]AES加密算法和DES加密算法的效率比较[2]AES和DES加密解密代码 随着开发时间的变长,当初认为比较难的东西,现在渐渐也就变的不那么难了!特别对于一些经常很少使用的类,时间长了之后渐渐就陌生了.所以在这里写一些日后可能会用到的加密与解密. 一.AES加密算法和DES加密算法的效率比较: 下面是在网上看到的一段关于“ES加密程序和一个AES加密程序,比较两个程序进行大文件加密的效率”: 实验步骤: 实验结果: 结果分析: 当文件很小时,两个程序加密的时间差不多.但是当文件变大时,

Android 中 非对称(RSA)加密和对称(AES)加密

在非对称加密中使用的主要算法有:RSA.Elgamal.背包算法.Rabin.D-H.ECC(椭圆曲线加密算法)等. 优点: 非对称加密与对称加密相比,其安全性更好:对称加密的通信双方使用相同的秘钥,如果一方的秘钥遭泄露,那么整个通信就会被破解.而非对称加密使用一对秘钥,一个用来加密,一个用来解密,而且公钥是公开的,秘钥是自己保存的,不需要像对称加密那样在通信之前要先同步秘钥 比如: 做登陆功能的时候为了数据安全,需要对密码进行加密,这时候可以使用非对称加密, 首先通过后台提供的接口获取公钥,

MD5加密,Base64加密/解密,AES加密/解密

1.从github上下载GTMBase64-master和AESCrypt-ObjC-master导入工程,如下图所示. 2.使用前的配置及注意事项: (1) 在build phases中的GTMBase64.m需要设置 -fno-objc-arc (2) 在#import "NSString+Base64.m”文件中导入   #import <Foundation/Foundation.h> (3)在#import "GTMBase64.m”文件中添加         

GOLANG 加密,解密,GUID 小方法

golang的 MD5加密.BASE64解密  guid 的代码: /** * 用于加密,解密,(包含MD5加密和base64加密/解密)以及GUID的生成 * 时间: * zhifieya */ package safe import ( "crypto/md5" "crypto/rand" "crypto/sha1" "encoding/base64" "encoding/hex" "io&q