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参数的意义

  1. key length(密钥位数,密码长度)
    AES128,AES192,AES256(128 位、192 位或 256 位)
    128位对应的是16个字节,所以部分平台库上,会使用16个字符或者长度为16的字符串来做密码。
  2. key (密钥,密码)
    key指的就是密码了,AES128就是128位的,如果位数不够,某些库可能会自动填充到128。
  3. IV (向量)
    IV称为初始向量,不同的IV加密后的字符串是不同的,加密和解密需要相同的IV。
  4. mode (加密模式)
    AES分为几种模式,比如ECB,CBC,CFB等等,这些模式除了ECB由于没有使用IV而不太安全,其他模式差别并没有太明显。
  5. 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怎么对文件进行加密解密的主要内容,如果未能解决你的问题,请参考以下文章

python写的程序怎样加密

Python有啥模块来加密

Python简单加密操作

Python编程实现加密解密读取文件

Python怎么对用户密码进行MD5加密,或者是单向加密

RSA加密过的表单密码用python怎么模拟