Press "Enter" to skip to content

通过Go实现AES加密和解密工具

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

本文包含如下两个内容:

 

AES加密介绍及实现原理

 

Go实现AES加密和解密工具

 

AES加密介绍及实现原理

 

AES( advanced encryption standard)使用相同密钥进行加密和解密,也就是 对称加密 。其他的对称加密如DES,由于DES密钥长度只有56位如今的算力甚至可以在5分钟内破解,而AES最高级别达到了256位密钥长度,如果采用穷举法,目前来看AES是一种”无法“被破解的加密存在。

 

 

关于 非对称 加密我们在之前有一篇文章《理解https中的安全及其实现原理》进行了介绍,有兴趣的可翻看查看。

 

AES用在哪里?

 

如果你正在浏览本文,那幺你就在使用AES(https协议中一部分使用了对称加密)。

 

绿色上网:通过加密安全地连接到另一台搬石头砸脚的服务器。

 

无线网络WIFI:和WAP2一起使用。

 

应用程序:wechat、JD、Alipay等使用 AES 加密照片和消息或支付信息。

 

存档和压缩工具:7z、WinZip 和 RAR。

 

操作系统组件:一些操作系统组件(如文件系统)使用高级加密标准来确保安全性。

 

编程语言库:Go、Python 和 C++ 等编码库实现了的AES加密(等会使用到)。

 

AES加密是如何实现的?

 

参考:

 

what-is-the-aes-algorithm?

 

What is AES encryption and how does it work?

 

Block cipher mode of operation

 

从宏观上来看AES加密过程中的一轮(根据不同的密钥长度,轮数不一样,下面会说到)如下:

 

 

1.数据分块

 

首先把明文按照128bit拆分成若干个明文块(图上黄色块),一个字节包含 8 位,布局为 4×4矩阵(上图黄色部分),对最后一块填充至128bit,填充方式有PKCS7Padding(采用)/PKCS5Padding/ZeroPadding,无论咋填充最后解密时都要去除这些多余的填充。

 

2.密钥扩展

 

AES通过Rijndael’s key schedule 将密钥被扩展为 (n+1) 个密钥,其中 n 是加密过程中要遵循的轮数。AES每个标准规定了所要加密的轮数,对于128位密钥,轮数是 10,要生成的密钥个数为 10+1,总共 11 个密钥。

标准密钥长度轮数分组长度
AES-128128位(16字节)10128位(16字节)
AES-192192位(24字节)12128位(16字节)
AES-256256位(32字节)14128位(16字节)

 

每一轮所要做的包括:字节替代(SubBytes)、行移位(ShiftRows)、列混淆(MixColumns)、加轮密钥(AddRoundKey)

 

 

3. 字节替代(SubBytes)

 

每轮开始,首先进行SubBytes,字节根据预定义的 Rijndael S-box (可以简单认为是一个转换表)规定的规则进行替换。对a[i,j]中的每个字节进行一次转换后得到b[i,j]

 

 

4.行移位(ShiftRows)

 

对上一步得到矩阵进行ShiftRows,第一行不变,第二行移动1位,第三行2位,第四行3位。

 

 

5.列混淆(MixColumns)

 

再对矩阵的每一列和 修补矩阵fixed matrix 的二维常量数组做矩阵相乘,得到对应的输出列。

 

 

6.加轮密钥(AddRoundKey)

 

先将扩展密钥Kn排列成4×4矩阵,然后让输入数组的每一个字节a[i,j]与密钥对应位置的字节k[i,j]异或一次,得到输出b[i,j]。最后一轮不参与AddRoundKey

 

 

经过如上的10轮操作之后,得到了一个明文块的加密字符。解密则进行反向加密。

 

AES加密模式

 

ECB

 

在上面加密过程中每一个明文块都是独立进行加密的,简单且高效,但是如果一个段数据存在相关的明文块,则加密后的密文也会相同,对安全性也有一定影响。

 

 

CBC

 

CBC加密模式如下图所示,初始向量IV和明文异或,每个块的密文作为后续块的“向量”,让每一个密文独一无二。我们待会采用这种模式。

 

 

Go实现AES加密工具scode

 

ok,上面大致了解AES加密是如何工作起来的,接下来通过Go中的crypto/aes和crypto/cipher包实现的AES加密解密工具。

 

PKCS7Padding将待补足字节数作为填充的字节

 

使用 cipher的CBC模式对block加密和解密

 

循环从文件中读取100mb源数据用于加密后将密文写入文件,解密则读取密文解密后将源数据写入文件。

 

参考:Golang AES 加密 解密

 

通过cobra添加命令后,创建命令的匿名函数

 

使用方式看起来如下:

 

scode工具包含2个命令encode和decode,解密文件需要密码。

 

完整代码:source

 

通过博客查看:iqsing.github.io

 

通过改进此工具创建一个自己隐私文件加密和解密器。

 

 

 

参考:

 

[1]        what-is-the-aes-algorithm?: https://www.educative.io/edpresso/what-is-the-aes-algorithm

 

[2]

 

What is AES encryption and how does it work?: https://cybernews.com/resources/what-is-aes-encryption/

[3]

Block cipher mode of operation: https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation

[4]

Rijndael’s key schedule: https://www.samiam.org/key-schedule.html

[5]

Golang AES 加密 解密: https://www.jianshu.com/p/0caab60fea9f

[6]

iqsing.github.io: https://iqsing.github.io

Be First to Comment

发表评论

您的电子邮箱地址不会被公开。