AES加密有三种规格,如下所示

分组长度的意思是,每次只能加密指定长度,比如AES-128,则每次只能加密16个字节,分若干次加密。

下面按照128位密钥进行说明

下面说明下aes的加密过程,如下所示:

加密过程中,需要将明文放到矩阵里面,密码也会放置于一个矩阵,故对于128位aes而言,每次加密16个字符,密钥也需要是16个字符,如果加密明文不是16的倍数,需要补齐,密钥不足16个字符,也需要补齐。

对于加密内容而言,常用的是pkcs7补齐法,举例如下:
1.明文字符串为123456789,补齐为123456789\a\a\a\a\a\a\a
因为明文9个字符,需要补齐为16个,尚缺少7个字符,故需要补7个7,ascii码7对应的字符为\a;这样加密后,再解密时,得到的字符串123456789\a\a\a\a\a\a\a,最后一个字符为\a,ascii码为7,故按照pkcs7规则,从最后面去掉7个字符,得到原字符串123456789。
2.明文字符串为1234567890,补齐为1234567890\x06\x06\x06\x06\x06\x06
因为明文10个字符,需要补齐为16个,尚缺少6个字符,故需要补6个6,ascii码6对应的字符为\x06。
3.明文1234567890123456,刚好为16个字节,此时依然需要补齐,否则按照pkcs7的规则,解密后得到的明文,要取最后一个字符,ascii是几,就要去掉对应长度的字符。故如果不补齐,会发生错误。明文1234567890123456补齐为1234567890123456\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10,
\x10的ascii代表16。
4.明文为12345678901234561,补齐为12345678901234561\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f
5.明文为空字符串时,补齐为\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10

密码补齐说明:
一般的博客中,没密码补齐之说,本人觉得密码存在补齐之说,就拿go的aes而言,如果密钥不足16个字节,则aes.NewCipher创建密钥时直接报错。
就目前网上的主流做法是,密钥不足16个字节,补齐16个字节,后面补的字符的ascii为0.
下面的网址是一个aes在线加密的例子:
https://tool.lmeee.com/jiami/aes

这个例子里面,密钥是123456789,内部会补7个ascii为0的字符。

我们在写代码,进行密钥补齐的时候,可以自定义,比如针对123456789,可以补齐为1234567897777777,然后用此密钥加密解密,也是可以的。

现在介绍下aes的ecb模式,很明显,对于明文12345678901234561234567890123456,刚好为32字节,再加密的时候,首先会进行补齐操作,后面会多出16个ascii为0的空字符,共48个字符。
加密时,16个字节一次,一共经过了3次,由于前16个字节和中间16个字节都是1234567890123456,故其加密结果应该是一样的,下面的结果中,密文经过base64处理,展示如红色方框,可以看到,在这个长字符串中,并没有发现两段一样的字符串。这不禁让我们对加密结果产生怀疑。

其实这是因为输出结果为base64的缘故,base64是将原来的6位输出为8位,而16*8不是6的倍数,故前面16个字节无法刚好转换成base64编码,一定要借助后面的字符。故base64上没有两段相同的,是正常的。

如果我们将输出结果格式设置为hex,即16进制,效果如下:

很明显,我们可以看到两段一样的字符串,即前面的32个字符和中间的32个字符是一样的。

所以ecb加密方式存在着这种问题:明文段一样,对应的加密结果也一样,存在着安全隐患。
下图即ecb加密模式,若明文1,明文3一样,则密文1和密文3也一样。

为了解决ecb带来的这种问题,引入新的加密模式,后面的明文在加密前,先和前面的加密结果做混合运算,如下所示:

即,第二个明文在加密前,先和第一段明文的密文做混合;
第三个明文加密前,先和第二段明文的密文做混合。
由于第一段明文前面没有密文,故而需要一个初始向量,这种加密模式叫做cbc。

aes本身加密的细节,此处没说,读者可以参考AES加密算法的详细介绍与实现

下面给出aes加密的一个go实现,里面采取的是128为的cbc模式,补齐方式为pkcs7。
对于init函数,本人将里面的代码注释掉了,如果放开,则加密密码就为1663897791,补齐方式跟在线网址的保持了一致。注释的情况下,密码为1663897791666666,不需要补齐。

package mainimport ("bytes""crypto/aes""crypto/cipher""encoding/base64""errors""fmt"
)//加密过程:
//  1、处理数据,对数据进行填充,采用PKCS7(当密钥长度不够时,缺几位补几个几)的方式。
//  2、对数据进行加密,采用AES加密方法中CBC加密模式
//  3、对得到的加密数据,进行base64加密,得到字符串
// 解密过程相反//16,24,32位字符串的话,分别对应AES-128,AES-192,AES-256 加密方法
//key不能泄露
//var PwdKey = []byte("ABCDABCDABCDABCD")
var PwdKey = []byte("1663897791666666")
var Iv = []byte("0123456789abcdef")func init() {/*PwdKey[10] = 0PwdKey[11] = 0PwdKey[12] = 0PwdKey[13] = 0PwdKey[14] = 0PwdKey[15] = 0*/
}//pkcs7Padding 填充
func pkcs7Padding(data []byte, blockSize int) []byte {//判断缺少几位长度。最少1,最多 blockSizepadding := blockSize - len(data)%blockSize//补足位数。把切片[]byte{byte(padding)}复制padding个padText := bytes.Repeat([]byte{byte(padding)}, padding)return append(data, padText...)
}//pkcs7UnPadding 填充的反向操作
func pkcs7UnPadding(data []byte) ([]byte, error) {length := len(data)if length == 0 {return nil, errors.New("加密字符串错误!")}//获取填充的个数unPadding := int(data[length-1])return data[:(length - unPadding)], nil
}//AesEncrypt 加密
func AesEncrypt(data []byte, key []byte) ([]byte, error) {//创建加密实例block, err := aes.NewCipher(key)if err != nil {return nil, err}//判断加密快的大小blockSize := block.BlockSize()//填充encryptBytes := pkcs7Padding(data, blockSize)//初始化加密数据接收切片crypted := make([]byte, len(encryptBytes))//使用cbc加密模式blockMode := cipher.NewCBCEncrypter(block, Iv)//执行加密blockMode.CryptBlocks(crypted, encryptBytes)return crypted, nil
}//AesDecrypt 解密
func AesDecrypt(data []byte, key []byte) ([]byte, error) {//创建实例block, err := aes.NewCipher(key)if err != nil {return nil, err}//获取块的大小//blockSize := block.BlockSize()//使用cbcblockMode := cipher.NewCBCDecrypter(block, Iv)//初始化解密数据接收切片crypted := make([]byte, len(data))//执行解密blockMode.CryptBlocks(crypted, data)//去除填充crypted, err = pkcs7UnPadding(crypted)if err != nil {return nil, err}return crypted, nil
}//EncryptByAes Aes加密 后 base64 再加
func EncryptByAes(data []byte) (string, error) {res, err := AesEncrypt(data, PwdKey)if err != nil {return "", err}return base64.StdEncoding.EncodeToString(res), nil
}//DecryptByAes Aes 解密
func DecryptByAes(data string) ([]byte, error) {dataByte, err := base64.StdEncoding.DecodeString(data)if err != nil {return nil, err}return AesDecrypt(dataByte, PwdKey)
}func main() {encryptStr, err := EncryptByAes([]byte("1234567890"))if err == nil {var decryptByte []bytedecryptByte, err = DecryptByAes(encryptStr)fmt.Println(string(decryptByte))}
}

aes加密算法简单说明相关推荐

  1. JS 与 JAVA 跨语言实现 RSA 和 AES加密算法

    简介: 开发中为了数据的安全性使用加密算法对数据进行加密是一种很常见的情况,但就一种语言来说,直接使用提供的相应的库进行少许封装是一件很容易的事.但是在一些情况下我们可能需要跨语言来实现,比如前后端分 ...

  2. 实战篇-OpenSSL之AES加密算法-ECB模式

    本文属于<OpenSSL加密算法库使用系列教程>之一,欢迎查看其它文章. 实战篇-OpenSSL之AES加密算法-ECB模式 一.AES简介 二.ECB模式 1.命令行操作 2.函数说明 ...

  3. AES加密算法 Java与Python跨平台实现

    AES加密算法 Java与Python跨平台实现 什么是AES Java的实现 Python的实现 结果 什么是AES Note: 网上有很多实现代码但是鱼龙混杂,笔者摸索了半天,实现了AES加密文本 ...

  4. AES加密算法及逆向

    AES加密算法逆向以及特征识别 1.AES加密算法 关于AES加密算法,网上资料特别特别多,个人认为可以从这几点去学习: AES加密算法设计者的相关论文以及其他相关论文(如安全性.性能.硬件/指令实现 ...

  5. 对称加密及AES加密算法

    目录 一.对称加密  1.什么是对称加密?  2.对称加密的工作过程  3.对称加密的优点  4.对称加密的两大不足 二.AES加密算法  1.什么是AES加密算法及AES加密算法的形成过程  2.A ...

  6. AES 加密算法的原理详解

    本文转载https://blog.csdn.net/gulang03/article/details/81175854 本教程摘选自 https://blog.csdn.net/qq_28205153 ...

  7. AES加密算法原理及java android实现

    AES当今最流行的对称加密算法之一,是DES的替代者. 密钥是AES算法实现加密和解密的根本.对称加密算法之所以对称,是因为这类算法对明文的加密和解密需要使用同一个密钥. AES支持三种长度的密钥: ...

  8. AES加密算法原理及python实现

    AES加密算法原理及python实现 AES对称加密算法 1.Rijndael的设计思想 2.AES的基本结构 3.加密解密的详细结构 4.四种轮操作 1.字节代换(SubBytes) 2.行移位操作 ...

  9. AES加密算法原理分析

    明文:任何人见字符(文)知意:暗文:没有密钥解码则见字符(文)不知意. AES(Advanced Encryption Standard)高级加密标准为常见的对称型加密算法(微信小程序加密传输是用AE ...

最新文章

  1. Hadoop Streaming框架使用(三)
  2. signature=4bfbf257ebc393e8ee3071d531b76778,(Mannose).
  3. XVII Open Cup named after E.V. Pankratiev. GP of Tatarstan
  4. Spring批处理CSV处理
  5. 数据库抽象类PDOStatement对象使用
  6. OJ(Online Judge)系统汇总
  7. ACCESS的十种数据类型分别对应的添加语句
  8. hbase 特性与api
  9. css3新属性partA
  10. 北京理工计算机 上机复试2000年
  11. win10系统下如何查看端口被哪个进程占用
  12. ACDSee 10中文版+注册码
  13. 用百数教培管理系统轻松实现在线排课,优化机构日常管理
  14. Edge 浏览器 URLSearchParams bug 修复
  15. MaxPab兔源多克隆抗体(D01)的功能和应用类型
  16. git pull 时每次都要输入用户名和密码的解决办法
  17. MySQL——SQLyog如何导出、导入数据库
  18. 齐博x1 换服务器如何转移网站
  19. 醒醒吧!高科技运动手环无法帮你减肥
  20. ArrayList源码解析与相关知识点

热门文章

  1. 攒机笔记二十三:触控商务本
  2. QD小学生法定教材(60手机通用)——QD入门必修课程
  3. 我们去首都机场为火星人送行
  4. 数据报片分片和片偏移
  5. Linux下配置Apache虚拟主机(基于IP地址)
  6. Python使用Turtle图形函数画图 颜色填充!(学习笔记)
  7. 在线聊天JAVA后端_java web 在线聊天的基本实现
  8. Flutter聊天页面
  9. maven配置连接MySQL数据库2021最新版
  10. 八进制、十六进制,补码