背景:工作需要,部分数据进行了加密传输,对方使用了AES对密码进行了加密,需要获取到解密的数据。

目标:通过密钥成功解密文件。

关键词:AES_ECB,AES_CBC,Java和Python的AES加密问题,

AES加密

一、遇到的问题

收到密钥&加密文件,如下。需要通过密钥对信息进行解密。

已知是AES进行的加密数据

key = 'Fcniggersm'

message = 'gYknrv3zMWYXEpRLDL0n8q+6s68DKapAfRpBDhN1XGM='

二、AES算法简介

AES算法详解:高级加密标准,它是一种对称加密算法,AES只有一个密钥,这个密钥既用来加密,也用于解密。

AES加密方式有五种:ECB, CBC, CTR, CFB, OFB。

从安全性角度推荐CBC加密方法,本文介绍了CBC,ECB两种加密方法的python实现。

CBC加密需要一个十六位的key(密钥)和一个十六位iv(偏移量)

ECB加密不需要iv

接收到的数据中只有密钥而没有偏移量。故使用ECB处理密文。

三、准备工作

python 在 Windows下使用AES时要安装的是pycryptodome 模块

python 在 Linux下使用AES时要安装的是pycrypto模块

import base64

from Crypto.Cipher import AES

from Crypto import Random

import os

import base64

import json

四、AES-ECB 解密&加密

1、密钥处理

直接处理密钥会报错:‘AES key must be either 16, 24, or 32 bytes long’

因为AES接收的key&vi都必须是有固定长度。

对Key 进行填充至符合规格。

def add_to_16(text):

while len(text) % 16 != 0:

text += '\0'

return (text)

key = 'Fcniggersm'

key = add_to_16(key)

2、密文处理

有可能处理密文时候会报错:'Error: Incorrect padding'

这是因为密文长度不符合规格,对base64解码的string补齐等号就可以了

def decode_base64(data):

missing_padding = 4-len(data)%4

if missing_padding:

data += b'='*missing_padding

return (data)

message = 'gYknrv3zMWYXEpRLDL0n8q+6s68DKapAfRpBDhN1XGM='

encrypt_data = message

encrypt_data = decode_base64(encrypt_data)

3、解密处理

解密成功获取到a,再对a进行解码处理获取数据。

cipher = AES.new(key)

result2 = base64.b64decode(encrypt_data)

a = cipher.decrypt(result2)

a = a.decode('utf-8','ignore')

a = a.rstrip('\n')

a = a.rstrip('\t')

a = a.rstrip('\r')

a = a.replace('\x06','')

print('\n','data:',a)

#data: 儒雅随和,加大力度

4、加密处理

同理可以对字符进行加密处理,执行AES加密及解密方法。

# encoding:utf-8

def encrypt(data, password):

bs = AES.block_size

pad = lambda s: s + (bs - len(s) % bs) * chr(bs - len(s) % bs)

cipher = AES.new(password)

data = cipher.encrypt(pad(data))

return (data)

if __name__ == '__main__':

data = 'ni hao'

password = 'aesrsasec' #16,24,32位长的密码

password = add_to_16(password)

encrypt_data = encrypt(data, password)

encrypt_data = base64.b64encode(encrypt_data)

print ('encrypt_data:', encrypt_data)

五、AES-CBC 解密&加密

CBC & ECB相比多出了一个vi(偏移量)。

cipher = AES.new(self.__key, AES.MODE_CBC, iv)

python AES 双向对称加密解密

# encoding:utf-8

import base64

from Crypto.Cipher import AES

from Crypto import Random

def encrypt(data, password):

bs = AES.block_size

pad = lambda s: s + (bs - len(s) % bs) * chr(bs - len(s) % bs)

iv = Random.new().read(bs)

cipher = AES.new(password, AES.MODE_CBC, iv)

data = cipher.encrypt(pad(data))

data = iv + data

return (data)

def decrypt(data, password):

bs = AES.block_size

if len(data) <= bs:

return (data)

unpad = lambda s : s[0:-ord(s[-1])]

iv = data[:bs]

cipher = AES.new(password, AES.MODE_CBC, iv)

data = unpad(cipher.decrypt(data[bs:]))

return (data)

if __name__ == '__main__':

data = 'd437814d9185a290af20514d9341b710'

password = '78f40f2c57eee727a4be179049cecf89' #16,24,32位长的密码

encrypt_data = encrypt(data, password)

encrypt_data = base64.b64encode(encrypt_data)

print ('encrypt_data:', encrypt_data)

encrypt_data = base64.b64decode(encrypt_data)

decrypt_data = decrypt(encrypt_data, password)

print ('decrypt_data:', decrypt_data)

六、Java加密&python解密报错。

实际AES工作中发现,对方Java加密的文件&自己Python加密的生成的密文不同,导致跨平台解密错误。

可能错误的原因:

1、填充(padding)算法

2、分段大小(segment size)

7、Linux上解密报错

在windows上运行无误,但是在Lnuix上运行报错。

①、报错 new() missing 1 requied positional argument: 'mode'

linux上需要添加,第二参数,选择加密模式(本次选择ECB)

cipher = AES.new(key ,AES.MODE_ECB)

②、报错 Object type cannot be passed to C code

linux上传入的key必须是字节的形式,对key 进行处理

key = key.encode('utf-8')

cipher = AES.new(key ,AES.MODE_ECB)

八、小结

1、处理AES加密时候一定要约定好具体的加密方法。

2、Key,vi 必须是合规的长度。

3、密文也需要做填充处理。

4、windows ECB自动添加cipher参数,且key可以为字符串。linux上需要填写完整的参数,将key处理成字节。

九、其他

1、pad和unpad分别是填充函数和逆填充函数。因为AES加密对加密文本有长度要求,必须是密钥字节数的倍数。这里的encryptKey在经过base64解码后的长度是16个字节。

2、实际上AES加密有AES-128、AES-192、AES-256三种,分别对应三种密钥长度128bits(16字节)、192bits(24字节)、256bits(32字节)。当然,密钥越长,安全性越高,加解密花费时间也越长。默认的是AES-128,其安全性完全够用。

这里采用的填充算法其实有个专有名词,叫pkcs7padding。

简单解释就是缺几位就补几:填充字符串由一个字节序列组成,每个字节填充该填充字节序列的长度。

如果要填充8个字节,那么填充的字节的值就是0x08;要填充7个字节,那么填入的值就是0x07;以此类推。

如果文本长度正好是BlockSize长度的倍数,也会填充一个BlockSize长度的值。这样的好处是,根据最后一个Byte的填充值即可知道填充字节数。

实际上,java中实现AES加密算法的默认模式是Cipher.getInstance("AES/ECB/PKCS5Padding")

PKCS#5在填充方面,是PKCS#7的一个子集:PKCS#5只是对于8字节(BlockSize=8)进行填充,填充内容为0x01-0x08;但是PKCS#7不仅仅是对8字节填充,其BlockSize范围是1-255字节。

然而因为AES并没有64位(8字节)的块, 如果采用PKCS5, 那么实质上就是采用PKCS7。

基于python的文件加密传输_python 利用Crypto进行AES解密加密文件相关推荐

  1. python 利用Crypto进行AES解密加密文件

     前言:今天写一个程序的时候: 加密模式:AES/CBC/PKCS5Padding 加密初始化向量:长度为 16 的空字节数组 一直搞不懂长度为16的空字节数组怎么表示 然后我用ECB模式发现跟他给的 ...

  2. python使用密钥加密的表述_python 利用Crypto进行RSA解密加密文件

    背景:工作需要,部分数据进行了加密传输,对方使用了RSA对密码进行了加密,需要获取到解密的数据. 目标:在已知公钥,私钥的情况下,使用python对其进行解密. RSA加密 一.遇到的问题 收到加密的 ...

  3. python文件粉碎传输_python使用stuck 实现scoket编程实现文件传输

    使用socket中的struck来实现客户端发送 服务端: # -*- coding: UTF-8 -*- import socket, time, socketserver, struct, os, ...

  4. 基于python的视频监控系统_Python远程视频监控程序的实例代码

    老板由于事务繁忙无法经常亲临教研室,于是让我搞个监控系统,让他在办公室就能看到教研室来了多少人.o(>﹏<)o||| 最初我的想法是直接去网上下个软件,可是找来找去不是有毒就是收费,无奈技 ...

  5. C语言利用openSSL库AES模块加密

    概述 在密码学里面一共有3中分类: 1.对称加密/解密 对称加密比较常见的有DES/AES.加密方和解密方都持有相同的密钥.对称的意思就是加密和解密都是用相同的密钥. 2.非对称加密/解密 常见的加密 ...

  6. 学习加密(四)spring boot 使用RSA+AES混合加密,前后端传递参数加解密

    学习加密(四)spring boot 使用RSA+AES混合加密,前后端传递参数加解密 技术标签: RSA  AES  RSA AES  混合加密  整合 前言:    为了提高安全性采用了RSA,但 ...

  7. 基于python的文件加密传输_Python优雅的加密传输文件

    最近需要通过网络加密传输一些文件,首先想到的是RSA,公钥 + 私钥的搭配,不能再好. 2. 导入模块,创建密钥对. 3. 然后用公钥加密,用私钥解密. 运行结果如下 4. 如果只是简单的,小字符串的 ...

  8. python xlrd读取文件报错_python利用xlrd读取excel文件始终报错原因

    1.代码按照网上百度的格式进行书写如下: 但运行后,始终报错如下: 百度了xlrd网页: 分明支持xls和xlsx两种格式的文件,但运行始终报错. 最后找到原因是因为我所读取的文件虽然是以.xls命名 ...

  9. python计算csv文件内的数据_Python利用pandas计算多个CSV文件数据值的实例

    功能:扫描当前目录下所有CSV文件并对其中文件进行统计,输出统计值到CSV文件 pip install pandas import pandas as pd import glob,os,sys in ...

最新文章

  1. 关于条件随机场的一些补充
  2. python中国大学排名爬虫写明详细步骤-Python爬虫——定向爬取“中国大学排名网”...
  3. 2015-07-22 JQuery 第二课(JQ元素获取,添加,删除,判断,遍历,取值,样式设置,改变对象,切换)...
  4. spring项目属性注入和bean管理xml 注入一般属性和集合属性
  5. hdc mfc 画扇形图_科学网—画扇形图(idl程序) - 张国印的博文
  6. php7.0 百度百科,PHP 7.0.10正式发布
  7. 适配器模式(类适配器)
  8. linux中的码字软件,码字写作软件下载
  9. mysql drop 权限_MySQL procedure drop权限问题
  10. linux中php集成软件,最新XAMPP Linux版5.6.3 官方版_免费开源php集成环境下载地址电脑版-锐品软件...
  11. jquery 语法基础
  12. 7.Oracle数据库SQL开发之 算术运算
  13. Shapley算法总结
  14. QT 如何在其他类中修改UI控件的属性?
  15. 2013 域名注册商排行
  16. app提交到iTunes失败
  17. Scala基础入门(五)Scala 内置9种数据类型
  18. jwt_token的有效时间和刷新时间
  19. ssoj4015: 永琳的竹林迷径(path)
  20. SQL: 第二高的薪水

热门文章

  1. 双X轴的Echarts图
  2. 南京邮电大学——陈健教授
  3. 直播带货行业如何入局?先了解一下直播商城源码吧
  4. pip 不使用本地缓存安装指定库
  5. 域控-笔记二(域权限,域组,域管理,Kerberso 协议)
  6. hbase实战 与mysql_HBase实战系列1—压缩与编码技术
  7. 70行脚本实现促销信息微信通知
  8. html调用摄像头直播,html5调用摄像头功能的实现代码
  9. 定义一个时间类Time,能提供和设置由时、分、秒组成的时间,并编出应用程序,定义时间对象,设置时间,输出该对象提供的时间。
  10. 生存分析绘图——Kaplan-Meier生存曲线