AES中ECB模式的加密与解密(Python3.7)
本文主要解决的问题
本文主要是讲解AES加密算法中的ECB模式的加密解密的Python3.7实现。具体AES加密算法的原理这里不做过多介绍,想了解的可以参考文末的参考链接。
主要解决了两个问题:
- 在Python3.7版本下,所依赖包的安装问题。(有一些博客时间久远,其中所提到的模块并不适用于Python3.7)
- 因为Python版本的问题,其他博客在基于Python3.6下的代码在Python3.7下并不能运行的问题。
背景介绍
在爬虫项目中遇到,某些网站的账号、密码采用了AES的ECB模式进行了加密。
# 加密前的数据
123456asd
# 加密后的数据
3cfeba82c31b6635e8fb085e04529e74
# 密钥
8NONwyJtHesysWpM
使用在线AES加密解密、AES在线加密解密,进行尝试。

经过测试发现,在AES加密的ECB模式,填充为pkcs7padding ,数据块为128位,输出格式为hex时,得到自己想要的结果。
(这里可以可以根据密文的格式进行判断输出的格式,一般密文以==结尾的输出格式为base64,否则为hex格式)
问题1:Crypto模块安装报错
pip 安装 pycrypto模块,抛如下错误:
error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\BIN\\cl.exe' failed with exit status 2
解决方法:
问题2:网上copy来的代码报错
在网上博客中直接copy来的代码,可能会抛如下错误。
TypeError: Object type <class 'str'> cannot be passed to C code
换个博客,发现依旧是这个错误。
错误原因:
之前版本的代码并不适用于Python3.7。需要进行修改。
修改后的代码:
import base64
from Crypto.Cipher import AES
import binascii
def add_to_16(text):
while len(text) % 16 != 0:
text += '\0'
return text
def encrypt(data, password):
if isinstance(password, str):
password = password.encode('utf8')
bs = AES.block_size
pad = lambda s: s + (bs - len(s) % bs) * chr(bs - len(s) % bs)
cipher = AES.new(password, AES.MODE_ECB)
data = cipher.encrypt(pad(data).encode('utf8'))
encrypt_data = binascii.b2a_hex(data) # 输出hex
# encrypt_data = base64.b64encode(data) # 取消注释,输出Base64格式
return encrypt_data.decode('utf8')
def decrypt(decrData, password):
if isinstance(password, str):
password = password.encode('utf8')
cipher = AES.new(password, AES.MODE_ECB)
plain_text = cipher.decrypt(binascii.a2b_hex(decrData))
return plain_text.decode('utf8').rstrip('\0')
if __name__ == '__main__':
data = '123456asd' # 待加密数据
password = '8NONwyJtHesysWpM' # 16,24,32位长的密码(密钥)
password = add_to_16(password)
encrypt_data = encrypt(data, password)
print('加密前数据:{}\n======================='.format(data))
print('加密后的数据:', encrypt_data)
decrypt_data = decrypt(encrypt_data, password)
print('解密后的数据:{}'.format(decrypt_data))

参考
AES ECB PKCS5/PKCS7 加解密 python实现 支持中文
python3.7 利用Crypto进行AES解密&加密文件
关注公众号西加加先生一起玩转Python。

AES中ECB模式的加密与解密(Python3.7)的更多相关文章
- C#.NET中对称和非对称加密、解密方法汇总--亲测可用
C#.NET中对称和非对称加密.解密方法汇总--亲测可用 在安全性要求比较高的系统中都会涉及到数据的加密.解密..NET为我们封装了常用的加密算法,例如:MD5,DES,RSA等.有可逆加密,也有 ...
- AES采用CBC模式128bit加密工具类
写在前面 安全测试ECB模式过于简单需要改为CBC模式加密以下为工具类及测试 AESUtils.java package com.sgcc.mobile.utils; import sun.misc. ...
- 在C#中使用RSA进行加密和解密
这篇文章向您展示了如何在c#.net Windows窗体应用程序中使用RSA算法对字符串进行加密和解密.RSA是由Ron Rivest,Adi Shamir和Leonard Adleman开发的非对称 ...
- python中对RSA的加密和解密
首先,生成一对密钥,并保存 def create_keys(): # 生成公钥和私钥 (pubkey, privkey) = rsa.newkeys(1024) pub = pubkey.save_p ...
- c# aes,des,md5加密等解密算法
一:可逆加密,即是能加密也能解密 对称可逆加密:加密后能解密回原文,加密key和解密key是一个 加密算法都是公开的,密钥是保密的, 即使拿到密文 你是推算不了密钥 也推算不了原文 加密解密的速度快, ...
- C#中常用的字符串加密,解密方法封装,包含只加密,不解密的方法
//方法一//须添加对System.Web的引用//using System.Web.Security;/// <summary>/// SHA1加密字符串/// </summary ...
- C#中对字符串的加密和解密
加密: /// <summary> /// 对字符串进行加密 /// </summary> /// <param name="proclaimText" ...
- python 实现 AES ECB模式加解密
AES ECB模式加解密使用cryptopp完成AES的ECB模式进行加解密. AES加密数据块分组长度必须为128比特,密钥长度可以是128比特.192比特.256比特中的任意一个.(8比特 == ...
- iOS开发之 AES+Base64数据混合加密与解密
2016-04-08 09:03 编辑: liubinqww 分类:iOS开发 来源:liubinqww 投稿 4 889 "APP的数据安全已经牵动着我们开发者的心,简单的MD5/ ...
随机推荐
- 洛谷P3313 [SDOI2014]旅行 题解 树链剖分+线段树动态开点
题目链接:https://www.luogu.org/problem/P3313 这道题目就是树链剖分+线段树动态开点. 然后做这道题目之前我们先来看一道不考虑树链剖分之后完全相同的线段树动态开点的题 ...
- python 动态生成变量名以及动态获取变量的变量名
前言需求: 必须现在需要动态创建16个list,每个list的名字不一样,但是是有规律可循,比如第一个list的名字叫: arriage_list_0=[],第二个叫arriage_list_1=[] ...
- Native memory allocation (mmap) failed to map 142606336 bytes for committing reserved memory.
这里写链接内容 问题描述 Java程序运行过程中抛出java.lang.OutOfMemoryError: unable to create new native thread,如下所示: [java ...
- SpringBoot+Thyemleaf开发环境正常,打包jar发到服务器就报错Template might not exist or might not be accessible
网上查看了各种解决的思路,总结如下: 1. 在controller层请求处理完了返回时,没有使用@RestController或@ResponseBody而返回了非json格式 这种情况下返回的数据t ...
- win2d 画出好看的图形
本文告诉大家,win2d 不需要从零开始做,以前做出来的很多库其实只需要做很小修改就可以做出好看的效果,而且用在 UWP 上.本文修改原先 大神写的 GDI 图形到 win2d 上,而且可以运行起来 ...
- codeforce 380(div.2)
A B 略 C:二分,贪心 设d(i, v)为 剩余油量为v时,车开距离i 所需要的最小时间,使用线性规划不难算出: if v < i return INF; //无法到达 if v > ...
- H3C RIP路由表的维护
- 2018-8-10-win10-uwp-绘图--Line-控件使用
title author date CreateTime categories win10 uwp 绘图 Line 控件使用 lindexi 2018-08-10 19:16:51 +0800 201 ...
- C# 从 short 转 byte 方法
本文告诉大家多个方法转换 short 和 byte 有简单的也有快的 快速简单的方法 static short ToShort(short byte1, short byte2) { return ( ...
- 微信里首次跳转会到首页问题(window.location失效)
将window.location.href 换为location.href