本文主要解决的问题

本文主要是讲解AES加密算法中的ECB模式的加密解密的Python3.7实现。具体AES加密算法的原理这里不做过多介绍,想了解的可以参考文末的参考链接。

主要解决了两个问题:

  1. 在Python3.7版本下,所依赖包的安装问题。(有一些博客时间久远,其中所提到的模块并不适用于Python3.7)
  2. 因为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

解决方法:

详见python3.7安装pycrypto

问题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))

参考

python 加密解密

AES ECB PKCS5/PKCS7 加解密 python实现 支持中文

python3.7 利用Crypto进行AES解密&加密文件

python3.7安装pycrypto

关注公众号西加加先生一起玩转Python

AES中ECB模式的加密与解密(Python3.7)的更多相关文章

  1. C#.NET中对称和非对称加密、解密方法汇总--亲测可用

    C#.NET中对称和非对称加密.解密方法汇总--亲测可用   在安全性要求比较高的系统中都会涉及到数据的加密.解密..NET为我们封装了常用的加密算法,例如:MD5,DES,RSA等.有可逆加密,也有 ...

  2. AES采用CBC模式128bit加密工具类

    写在前面 安全测试ECB模式过于简单需要改为CBC模式加密以下为工具类及测试 AESUtils.java package com.sgcc.mobile.utils; import sun.misc. ...

  3. 在C#中使用RSA进行加密和解密

    这篇文章向您展示了如何在c#.net Windows窗体应用程序中使用RSA算法对字符串进行加密和解密.RSA是由Ron Rivest,Adi Shamir和Leonard Adleman开发的非对称 ...

  4. python中对RSA的加密和解密

    首先,生成一对密钥,并保存 def create_keys(): # 生成公钥和私钥 (pubkey, privkey) = rsa.newkeys(1024) pub = pubkey.save_p ...

  5. c# aes,des,md5加密等解密算法

    一:可逆加密,即是能加密也能解密 对称可逆加密:加密后能解密回原文,加密key和解密key是一个 加密算法都是公开的,密钥是保密的, 即使拿到密文 你是推算不了密钥 也推算不了原文 加密解密的速度快, ...

  6. C#中常用的字符串加密,解密方法封装,包含只加密,不解密的方法

    //方法一//须添加对System.Web的引用//using System.Web.Security;/// <summary>/// SHA1加密字符串/// </summary ...

  7. C#中对字符串的加密和解密

    加密: /// <summary> /// 对字符串进行加密 /// </summary> /// <param name="proclaimText" ...

  8. python 实现 AES ECB模式加解密

    AES ECB模式加解密使用cryptopp完成AES的ECB模式进行加解密. AES加密数据块分组长度必须为128比特,密钥长度可以是128比特.192比特.256比特中的任意一个.(8比特 == ...

  9. iOS开发之 AES+Base64数据混合加密与解密

    2016-04-08 09:03 编辑: liubinqww 分类:iOS开发 来源:liubinqww 投稿 4 889     "APP的数据安全已经牵动着我们开发者的心,简单的MD5/ ...

随机推荐

  1. Project Euler Problem 9-Special Pythagorean triplet

    我是俩循环暴力 看了看给的文档,英语并不好,有点懵,所以找了个中文的博客看了看:勾股数组学习小记.里面有两个学习链接和例题. import math def calc(): for i in rang ...

  2. H3C LMI协议标准

  3. JPA进行insert操作时会首先select吗

    在某个项目中,使用JPA的saveAll方法去批量写入数据时,通过打印sql,发现每次insert前都会先select一次,极大的浪费了写入性能. 分析一下代码,saveAll() @Transact ...

  4. 用adblock过滤页面上固定位置的悬浮窗

    现在各种网站都喜欢加入position:fixed的悬浮窗,这些悬浮窗可以是分享按钮,可以是二维码,可以是各种烦人的按钮. 因为这些悬浮窗未必是广告,所以adblock很少自动屏蔽它们. 可这些悬浮窗 ...

  5. 2019-9-2-C#同步方法转异步

    title author date CreateTime categories C#同步方法转异步 lindexi 2019-09-02 12:57:37 +0800 2018-2-13 17:23: ...

  6. Vue基础练习之计算属性、方法、监听器

    <body> <div id="root"> {{fullName()}} {{age}} </div> <script> var ...

  7. javaScript通过URL获取参数

    // 函数方法 function GetQueryString(name) { var reg = new RegExp("(^|&)" + name + "=( ...

  8. linux 从用户空间的 I/O 存取

    刚刚描述的这些函数主要打算被设备驱动使用, 但它们也可从用户空间使用, 至少在 PC- 类 的计算机. GNU C 库在 <sys/io.h> 中定义它们. 下列条件应当应用来对于 inb ...

  9. 文本框(代替input)输入长度限制、提示

    <div class="inform_content_text"> <textarea name="name" placeholder=&qu ...

  10. 洛谷——P1012拼数字符串操作(拼接排序)

    #include<bits/stdc++.h> using namespace std; bool cmp(const string &a,const string &b) ...