当前位置:   article > 正文

Python学习笔记——AES 加密-解密_python aes256

python aes256

前言:

AES,高级加密标准。目前比较流行的对称加密算法。是一种对称加密算法,即加密和解密都用相同的密钥。

AES只是个基本算法,实现AES有几种模式,主要有ECB、CBC、CFB等几种模式。CBC模式中还有一个偏移量参数IV。

AES加密有AES-128、AES-192和AES-256三种,分别对应三种密钥长度128位(16字节)、192位(24字节)和256位(32字节)。密钥越长,安全性越高,加密和解密时间也会更长。一般默认是128位,其安全性完全够用。

一、加密/解密时,字节数不够时的处理:

加密时:

因为密钥是16字节,所以明文加密时,字符串不足16字节的倍数,则要补充个数,例如:少4个,要补chr(4)chr(4)chr(4)chr(4),少2个,要补chr(2)chr(2)。chr(参数)中的参数是缺少的字节,要补全。这里为什么要补充chr(缺少位的
ASCII
码作为参数)。是因为这样能更好的读取字符串最后字符时,知道有几个填充字符,从而能采用字符串切片操作而逆向清除填充字符,为自己理解这点,兴奋。

实现方法:明文字符串 + chr(16-len(明文字符串)%16) * (16 - len(明文字符串)%16)

1、自定义函数实现:

def pad(data):
    text = data + chr(16 - len(data) % 16) * (16 - len(data) % 16)
    return text
  • 1
  • 2
  • 3

2、 用lambda匿名函数:(因为只有一个表达式,lambda语法自行查阅)

pad = lambda s: s + chr(16 - len(s) % 16) * (16 - len(s) % 16)
  • 1

解密时:

加密时字符串不足16字节倍数时,填充的字符是chr(缺少的字节数作为参数的),所以逆向清除填充的字符串,利用最后字符的ASCII码进行切片得出所需字符串。

1、自定义函数实现:

def unpad(s):
    last_num = s[-1]
    text = s[:-last_num]
    return text
  • 1
  • 2
  • 3
  • 4

2、 用lambda匿名函数:

unpad = lambda s: s[:-s[-1]]
  • 1

二、加密、解密用到的库函数

Cryptodome和base64库,听爬虫课时,UP说的Crytodo库安装出现了问题,查了建议用Cryptodome库,安装方法:pip install
Cryptodome 安装正常,base64为内置。

base64在这里起什么作用呢?

Base64是网络上最常见的用于传输8Bit字节码的编码方式,能实现二进制与字符之间编码的互转。所以说Base64就是把字符串以二进制编码/解码。其中,b64encode为编码,b64decode为解码

三、加密/解密的实现

ECB模式加密:

def aes_ECB_Encrypt(data,key):   # ECB模式的加密函数,data为明文,key为16字节密钥
    key = key.encode('utf-8')
    data = pad(data)             # 补位
    data = data.encode('utf-8')
    aes = AES.new(key=key,mode=AES.MODE_ECB)  #创建加密对象
    #encrypt AES加密  B64encode为base64转二进制编码
    result = base64.b64encode(aes.encrypt(data))
    return str(result,'utf-8')        # 以字符串的形式返回
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

CBC模式加密:

def aes_CBC_Encrypt(data,key,iv):   # CBC模式的加密函数,data为明文,key为16字节密钥,iv为偏移量
    key = key.encode('utf-8')
    iv = iv.encode('utf-8')      # CBC 模式下的偏移量
    data = pad(data)             # 补位
    data = data.encode('utf-8')
    aes = AES.new(key=key,mode=AES.MODE_CBC,iv=iv)  #创建加密对象
    #encrypt AES加密  B64encode为base64转二进制编码
    result = base64.b64encode(aes.encrypt(data))
    return str(result,'utf-8')        # 以字符串的形式返回
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

解密为逆向:

def aes_ECB_Decrypt(data,key):   # ECB模式的解密函数,data为密文,key为16字节密钥
    key = key.encode('utf-8')
    aes = AES.new(key=key,mode=AES.MODE_ECB)  # 创建解密对象

    #decrypt AES解密  B64decode为base64 转码
    result = aes.decrypt(base64.b64decode(data))
    result = unpad(result)            # 除去补16字节的多余字符
    return str(result,'utf-8')        # 以字符串的形式返回

def aes_CBC_Decrypt(data,key,iv):   # CBC模式的解密函数,data为密文,key为16字节密钥
    key = key.encode('utf-8')
    iv = iv.encode('utf-8')
    aes = AES.new(key=key,mode=AES.MODE_CBC,iv=iv)  # 创建解密对象

    #decrypt AES解密  B64decode为base64 转码
    result = aes.decrypt(base64.b64decode(data))
    result = unpad(result)            # 除去补16字节的多余字符
    return str(result,'utf-8')        # 以字符串的形式返回
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

四、附自己做的练习源代码

import base64
from Crypto.Cipher import AES

str_a = 'This is a book, that is a pen'

pad = lambda s: s + chr(16 - len(s) % 16) * (16 - len(s) % 16)
unpad = lambda s: s[:-s[-1]]

key = 'sdf46asdfs54hgjg'
iv = '0102030405060708'


def aes_ECB_Encrypt(data,key):   # ECB模式的加密函数,data为明文,key为16字节密钥
    key = key.encode('utf-8')
    data = pad(data)             # 补位
    data = data.encode('utf-8')
    aes = AES.new(key=key,mode=AES.MODE_ECB)  #创建加密对象

    #encrypt AES加密  B64encode为base64转二进制编码
    result = base64.b64encode(aes.encrypt(data))
    return str(result,'utf-8')        # 以字符串的形式返回

def aes_CBC_Encrypt(data,key,iv):   # CBC模式的加密函数,data为明文,key为16字节密钥,iv为偏移量
    key = key.encode('utf-8')
    iv = iv.encode('utf-8')      # CBC 模式下的偏移量
    data = pad(data)             # 补位
    data = data.encode('utf-8')
    aes = AES.new(key=key,mode=AES.MODE_CBC,iv=iv)  #创建加密对象

    #encrypt AES加密  B64encode为base64转二进制编码
    result = base64.b64encode(aes.encrypt(data))
    return str(result,'utf-8')        # 以字符串的形式返回

def aes_ECB_Decrypt(data,key):   # ECB模式的解密函数,data为密文,key为16字节密钥
    key = key.encode('utf-8')
    aes = AES.new(key=key,mode=AES.MODE_ECB)  # 创建解密对象

    #decrypt AES解密  B64decode为base64 转码
    result = aes.decrypt(base64.b64decode(data))
    result = unpad(result)            # 除去补16字节的多余字符
    return str(result,'utf-8')        # 以字符串的形式返回

def aes_CBC_Decrypt(data,key,iv):   # CBC模式的解密函数,data为密文,key为16字节密钥
    key = key.encode('utf-8')
    iv = iv.encode('utf-8')
    aes = AES.new(key=key,mode=AES.MODE_CBC,iv=iv)  # 创建解密对象

    #decrypt AES解密  B64decode为base64 转码
    result = aes.decrypt(base64.b64decode(data))
    result = unpad(result)            # 除去补16字节的多余字符
    return str(result,'utf-8')        # 以字符串的形式返回


b = aes_ECB_Encrypt(str_a,key)
b1 = aes_ECB_Decrypt(b,key)
c = aes_CBC_Encrypt(str_a,key,iv)
c1 = aes_CBC_Decrypt(c,key,iv)


print("加密前长度:{},加密前字符串为:{}\n加密后长度:{},ECB加密后字符串:{}\n解密后长度:{},解密后字符串:{}\n".format(len(str_a),str_a,len(b),b,len(b1),b1))
print("加密前长度:{},加密前字符串为:{}\n加密后长度:{},CBC加密后字符串:{}\n解密后长度:{},解密后字符串:{}".format(len(str_a),str_a,len(c),c,len(c1),c1))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61

运行结果:

PS D:\python> & "C:/Program Files/Python311/python.exe" d:/python/Crypto_Cipher.py
加密前长度:29,加密前字符串为:This is a book, that is a pen
加密后长度:44,ECB加密后字符串:Y9OEJM1wcv1OwUYmvAEt2cFAPC2Gh1Gk5ts5d+HSngo=
解密后长度:29,解密后字符串:This is a book, that is a pen

加密前长度:29,加密前字符串为:This is a book, that is a pen
加密后长度:44,CBC加密后字符串:FJ7cEn3uKW7aacuC755xkzs4e3T68+bNEVE0SS1emkE=
解密后长度:29,解密后字符串:This is a book, that is a pen
PS D:\python> 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

学习计划安排


我一共划分了六个阶段,但并不是说你得学完全部才能上手工作,对于一些初级岗位,学到第三四个阶段就足矣~

这里我整合并且整理成了一份【282G】的网络安全从零基础入门到进阶资料包,需要的小伙伴可以扫描下方CSDN官方合作二维码免费领取哦,无偿分享!!!

如果你对网络安全入门感兴趣,那么你需要的话可以

点击这里声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】

推荐阅读
相关标签