python怎么对文件进行加密解密
Posted VoiceRoom
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python怎么对文件进行加密解密相关的知识,希望对你有一定的参考价值。
使用python的pycrypto库AES的CBC模式加密和解密文件
AES (Advanced Encryption Standard),它是一种加密对称密码算法,可用于加密和解密信息 。
该算法可以使用 128、192 和 256 位的密钥,并对 128 位(16 字节)的数据块进行操作 。
由于我们可能要加密大于 128 位的数据,因此我们需要使用块(block)模式进行加密。下面的例子会加密source.txt文件并将source.txt文件解密到target.txt文件 。
安装pycryptodome,文章使用Python 3.6.8
pip3 install pycryptodome
Python脚本内容
#!/usr/bin/env python3
from Crypto.Util.Padding import pad, unpad
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
#打开需要加密的文件并将内容赋值给data
in_file = open("/root/work/study/ransomware/source.txt", "rb")
data = in_file.read()
in_file.close()
print('source content %s from source.txt' %data)
#使用随机字符生成AES相关的参数
key = get_random_bytes(32)
iv = get_random_bytes(16)
cipher1 = AES.new(key, AES.MODE_CBC, iv)
#使用AES.MODE_CBC对data进行加密并赋值给ct
ct = cipher1.encrypt(pad(data, 16))
print ('encrypted content is %s rewrite to source.txt ' %ct)
#将加密后的数据回写至文件source.txt,得到加密后的source.txt
out_file = open("/root/work/study/ransomware/source.txt", "wb")
out_file.write(ct)
out_file.close()
#秘钥和向量IV没动过,所以使用秘钥进行解密并解密回target.txt
cipher2 = AES.new(key, AES.MODE_CBC, iv)
#解密文件
pt = unpad(cipher2.decrypt(ct), 16)
print('decrypt content %s to target.txt' %pt)
out_file = open("/root/work/study/ransomware/target.txt", "wb")
out_file.write(pt)
out_file.close()
测试代码
[root@BlogServer ransomware]# ls
crypt.py source.txt
[root@BlogServer ransomware]# cat source.txt
this is source code
[root@BlogServer ransomware]# python3 crypt.py
source content b'this is source code\\n' from source.txt
encrypted content is b'A\\xb3\\xe4\\x8flq\\xfb)~r\\x1c\\xed\\xefEkm\\xd3\\xceL\\x07)8\\x9f\\xb1\\xd7\\xa1\\x8a\\x90L\\x8d<\\xfc' rewrite to source.txt
decrypt content b'this is source code\\n' to target.txt
[root@BlogServer ransomware]# cat source.txt
A??q??km?L)8±?L<[root@BlogServer ransomware]#
[root@BlogServer ransomware]# cat target.txt
this is source code
AES的参数
1. key length(密钥位数,密码长度)
2. key (密钥,密码)
3. IV (向量)
4. mode (加密模式)
5. padding (填充方式)
AES参数的意义
- key length(密钥位数,密码长度)
AES128,AES192,AES256(128 位、192 位或 256 位)
128位对应的是16个字节,所以部分平台库上,会使用16个字符或者长度为16的字符串来做密码。 - key (密钥,密码)
key指的就是密码了,AES128就是128位的,如果位数不够,某些库可能会自动填充到128。 - IV (向量)
IV称为初始向量,不同的IV加密后的字符串是不同的,加密和解密需要相同的IV。 - mode (加密模式)
AES分为几种模式,比如ECB,CBC,CFB等等,这些模式除了ECB由于没有使用IV而不太安全,其他模式差别并没有太明显。 - padding (填充方式)
对于加密解密两端需要使用同一的PADDING模式,大部分PADDING模式为PKCS5, PKCS7, NOPADDING。
Python编程实现加密解密读取文件
对 Python 加密时可能会有两种形式,一种是对Python转成的exe进行保护,另一种是直接对.py或者.pyc文件进行保护,下面将列举两种形式的保护流程。
1、 对 python转exe加壳
下载最新版Virbox Protector加壳工具,使用加壳工具直接对demo.exe进行加壳操作
2、对.py/.pyc加密
第一步,使用加壳工具对 python 安装目录下的 python.exe 进行加壳,将 python.exe 拖入到加壳工具 VirboxProtector 中,配置后直接点击加壳。
第二步,对.py/.pyc 进行加密,使用 DSProtector 对.py/.pyc 进行保护。
安全技术:
l 虚拟机外壳:精锐5的外壳保护工具,创新性的引入了预分析和自动优化引擎,有效的解决了虚拟化保护代码时的安全性和性能平衡问题。
l 碎片代码执行:利用自身成熟的外壳中的代码提取技术,抽取大量、大段代码,加密混淆后在安全环境中执行,最大程度上减少加密锁底层技术和功能的依赖,同时大量大段地移植又保证了更高的安全性。
l Virbox加密编译引擎:集编译、混淆等安全功能于一身,由于在编译阶段介入,可优化空间是普遍虚拟化技术无法比拟的,对代码、变量的混淆程度也有了根本的提升。
l 反黑引擎:内置R0级核心态反黑引擎,基于黑客行为特征 的(反黑数据库)反制手段。精准打击调试、注入、内存修改等黑客行为,由被动挨打到主动防护。
加密效果:
加密之前
以pyinstall 的打包方式为例,使用pyinstxtractor.py文件对log_322.exe进行反编译,执行后会生成log_322.exe_extracted文件夹,文件夹内会生成pyc文件。
成功之后会在同目录下生成一个文件夹
使用010 Editor添加几个字节,重命名为pyc文件
注【此处和python的版本有关,Python27的可以直接解压为pyc文件,Python34还需要添加几个字节】
然后使用EasyPython Decompiler 工具反编译pyc
成功之后通目录下会生成dis文件,生成出的dis文件可以用文本编辑器打开,看到源码
反编译后的log_322.exe的源码
加密之后:
【注:不同的打包方式原理不同,源码存放的位置也不同,所以需要保护的具体模块也是不同的】
加密之后再尝试解压log322.exe失败,已经无法进行反编译,使用常规反编译工具也是无法进行分析的。
参考技术A 脚本语言加密干嘛。。。加密了还得还原原字符再载入文件。。。没意义追问实验报告,它要这样啊。。。
实验报告,它要这样啊。。。
以上是关于python怎么对文件进行加密解密的主要内容,如果未能解决你的问题,请参考以下文章