AES加密算法原理及python实现

AES对称加密算法
  AES加密算法即密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法(2000年10月2日,比利时密码专家Joan Daemen和Vincent Rijmen提出的Rijindael),是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。

1.Rijndael的设计思想
  ①抵抗所有已知的攻击。
  ②在多个平台上速度快,编码紧凑。
  ③设计简单。

2.AES的基本结构

  AES为分组密码,分组密码也就是把明文分成一组一组的,每组长度相等,每次加密一组数据,直到加密完整个明文。

  在AES标准规范中,单位分组长度固定是128位,也就是说,每个分组为16个字节(每个字节8位)。密钥的长度可以使用128位、192位或256位。根据不同长度的密钥,推荐加密轮数也不同,造就了不同的AES加密方案,密钥越长,密文安全性越高。

但基于现实,总明文的长度并不总是128的倍数,造成的结果是最后一个待加密的分组不够128位,这时候就需要对最后一个待加密分组进行填充(对称加密算法分组模式中的ECB模式)。

== 本文采用的是对称加密算法的ECB模式 ==

关于加密轮数,因为AES的加密公式为C = E(K,P),在加密函数E中,会执行一种函数10次(粗略),故称之为轮函数,这个轮函数的前9次执行的操作是一样的,只有第10次有所不同。也就是说,一个明文分组会被加密10轮。理解AES的关键在于实现一轮中的所有操作,单调重复。

AES的加密流程示意图如下图:

可以看出,与对称加密算法不同的地方在于AES加密函数和解密函数这两个特殊的加解密过程。
下面简单介绍下各个AES加密算法中各部分的作用与意义:

设有明文P、密钥K、密文C:

AES加密函数
设AES加密函数为E,则 C = E(K, P)。也就是说,把明文P和密钥K作为加密函数的参数输入,则加密函数E会输出密文C。
AES解密函数
设AES解密函数为D,则 P = D(K, C)。也就是说,把密文C和密钥K作为解密函数的参数输入,则解密函数会输出明文P。

 

from os import urandom
from Crypto.Cipher import AES

# For Generating cipher text
secret_key = urandom(16)
iv = urandom(16)
obj = AES.new(secret_key, AES.MODE_CBC, iv)

# Encrypt the message
message = b'Lorem Ipsum text'
print('Original message is: ', message)
encrypted_text = obj.encrypt(message)
print('The encrypted text', encrypted_text)

# Decrypt the message
rev_obj = AES.new(secret_key, AES.MODE_CBC, iv)
decrypted_text = rev_obj.decrypt(encrypted_text)
print('The decrypted text', decrypted_text.decode('utf-8'))

 

posted @ 2022-10-02 17:39  Einewhaw  阅读(960)  评论(0编辑  收藏  举报