常见的加密算法原理与实现:AES加密

系列二:AES加密

  • 一、基本介绍
  • 二、AES的三个核心要素
    • 2.1、秘钥
    • 2.2、填充
    • 2.3、模式
    • 2.4、小结
  • 三、在Python、NodeJS中的实现
    • 3.1、Python实现
    • 3.2、NodeJS实现
  • 四、参考文献

一、基本介绍

AES加密是一种对称加密算法,其全称为 :Advanced Encryption Standard,是DES(Data Encryption Standard)加密算法的升级替代版,也是目前最为流行的对称加密算法之一,之所以说是对称加密算法,是因为AES的加密和解密都是使用同一个秘钥完成。
常见的加密算法原理与实现:AES加密_第1张图片

二、AES的三个核心要素

AES加密算法的实现,需要秘钥、填充与模式这三者的配合使用,三者的概念如下:

2.1、秘钥

秘钥是实现AES加密与解密的根本,AES支持三种长度的密钥: 128位, 192位, 256位,其中AES256安全性最高,而AES128性能最高,因为加密处理的复杂度不同,秘钥越长,加密处理轮数越多。

2.2、填充

之所以需要用到填充,是因为AES加密是分组加密,也就是并不是直接将明文全部统一加密,而是对明文进行分组,拆成一个个独立的明文块(每个明文块长度都是128bit),之后对每个明文块独立加密,形成不同的密文块,最后将这些明文块拼接起来形成最终的加密结果。

常见的加密算法原理与实现:AES加密_第2张图片

由于AES明文块拆分的长度固定为128bit,当一段长度不足128bit,或者超过128bit,但不是其倍数时,我们就没法把明文按128bit长度分成等长的明文块,这时候就需要对明文块进行填充,将其补齐为128bit。

AES填充方式有以下几种:

• NoPadding
• PKCS7Padding
• ZeroPadding
• AnsiX923
• Iso10126
• Iso97971

比较常见的是这四种:NoPadding、PKCS7Padding、ZeroPadding、Iso10126。

  • NoPadding是指不做任何填充,但是要求明文块的长度必须是128bit,也就是明文的总长度必须为128位的整数倍。
  • PKCS7Padding是当明文块的长度不足16个字节(128bit)时,按照缺少的字节数(假设为n),填充n个字节,并且每个字节的值都等于n。比如明文:{1,2,3,4,5,a,b,c,d,e,f},缺少5个字节,则补全为{1,2,3,4,5,a,b,c,d,e,f,5,5,5,5,5}。
  • ZeroPadding顾名思义,是用0来进行填充,虽然填充方式比较简单,但并不是很好用,因为如果明文块最后一位也是0时,解密时就容易出错。
  • Iso10126填充与PKCS7相似,同样是按缺少的字节(假设为n)数来填充,但其填充的最后一个字节为n,其余字节填充随机数。

2.3、模式

AES的工作模式体现在把明文块加密成密文块的过程中,AES加密算法提供了五种不同的工作模式:


    ECB: 电码本模式(Electronic Codebook Book)
    CBC: 密码分组链接模式(Cipher Block Chaining)
    CTR: 计算器模式(Counter)
    CFB: 密码反馈模式(Cipher FeedBack)
    OFB: 输出反馈模式(Output FeedBack)

比较常见的两种模式就是ECB和CBC模式:

ECB模式是最简单的模式,该模式下每个明文块都是独立加密,但相同明文块加密后密文块也一样,安全性较差。
常见的加密算法原理与实现:AES加密_第3张图片
CBC模式引入了初始向量IV(Initialization Vector),其目的在于避免相同的明文块加始终加密成同样的密文块。
CBC模式在每一个明文块加密前会让明文块和一个值先做异或操作,IV作为初始变量(第一个值),参与第一个明文块的异或,后续的每一个明文块和它前一个明文块所加密出的密文块相异或。
常见的加密算法原理与实现:AES加密_第4张图片

2.4、小结

基于上述的AES核心三要素,AES的加密过程可以分解成如下四步:

1.把明文按照16字节(128bit)一组进行分组,拆分成若干个明文块。
2.选择合适的填充方式来填充最后一个明文块,确保所有明文块长度都为128bit。
3.将每一个明文块利用AES加密器和密钥,加密成密文块。
4.拼接所有的密文块, 成为最终的密文结果。

需要注意的是:AES加密时如果使用了某个秘钥、填充与模式,那么解密时的秘钥、填充与模式也要一一对应,这也充分体现出了其对称性。

三、在Python、NodeJS中的实现

3.1、Python实现

安装AES库:

pip install pycrypto

代码实现:

from Crypto.Cipher import AES

key='Sixteen byte key'

#转换为字节形式
byte_key = bytes(key, encoding="utf8")


# 初始化加密器,使用基本的ECB模式进行加密
cryptor =AES.new(byte_key, AES.MODE_ECB)
text=b'Sixteen byte txt'
enc_result=cryptor.encrypt(text)
print(enc_result)

#解密
dec_result=cryptor.decrypt(enc_result)
print(dec_result)

输出结果:

encrypt result: b'7<\x95\xacx\x81\xa4\xaay-\xe3Y\x1f\xb0\x9a['
decrypt result: b'Sixteen byte txt'

3.2、NodeJS实现

安装AES库:

npm install crypto-js

代码实现:

var CryptoJS = require("crypto-js");
var key = 'Sixteen byte key';
var iv = "1234567887654321";

function encrypt(text) {
    return CryptoJS.AES.encrypt(text, CryptoJS.enc.Utf8.parse(key), {
        iv: CryptoJS.enc.Utf8.parse(iv),
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    })
}

function decrypt(text)
{
    var result = CryptoJS.AES.decrypt(text, CryptoJS.enc.Utf8.parse(key), {
        iv: CryptoJS.enc.Utf8.parse(iv),
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    })
    return result.toString(CryptoJS.enc.Utf8)
}
var text ="ase test";
var encrypted = encrypt(text)
console.log('加密:',encrypted.toString());
console.log('解密:',decrypt(encrypted))

输出结果:

加密: 6Tom5EITytRO4QVKd/zY6g==
解密: ase test

四、参考文献

1、什么是AES算法?
2、浅谈常见的七种加密算法及实现
3、了解 AES 加密算法

你可能感兴趣的:(算法,加密解密,密码学,数据安全)