文档章节

python实现简单的文件加密与解密

Aomo
 Aomo
发布于 09/21 13:19
字数 569
阅读 138
收藏 0

对于任意的一个文件,本质上来讲都是二进制的。

  1. 对于任意一个二进制数a,对其用另外任意一个与a的位数相同的二进制数m进行“异或”操作得到结果e,即e=a xor m;

  2. 如果再讲上面得到的e用m进行异或操作,得到e2,即e2=e xor m。

  3. 对比之后,会发现,a和e2是相同的。

利用上面这个简单的原理,就可以实现对文件的加密和解密。代码如下:

import sys
import random
import os

def gen_key():
	c=list(range(256))
	random.shuffle(c)
	return c

def save_keyfile(k,f):
	fo=open(f,'wb')
	fo.write(bytes(k))
	fo.close()
	
def get_key(f):
	fi=open(f,'rb')
	k=fi.read()
	fi.close()
	return k
	
def crypt_file(fi,fo,key_file):
	k=get_key(key_file)
	f=open(fi,'rb')
	fc=f.read()
	fe=open(fo,'wb')
	flen=len(fc)
	buff=[]
	for i in range(flen):
		c=i%len(k)
		fo=fc[i]^k[c]
		buff.append(fo)
	fe.write(bytes(buff))
	f.close()
	fe.close()
	
def crypt_dir(d,key_file):
	"""
	encrypt a directory assigned by <d>
	"""
	file_list=os.listdir(d)
	file_count=len(file_list)
	for i in range(file_count):
		f=os.path.join(d,file_list[i])
		neof=f+'.crypt'
		crypt_file(f,neof,key_file)
		print('Progress:%d/%d' % (i+1,file_count))
	print('Directory <%s> has been encrypted/decrypted.' % (d))
	
if __name__=='__main__':
	args=sys.argv
	arg_num=len(args)
	
	if arg_num==2:
		neokey=gen_key()
		save_keyfile(neokey,args[1])
		print('Key file has been generated:%s' % (args[1]))
		exit(0)
	
	if arg_num==3:
		crypt_dir(args[1],args[2])
		exit(0)
	
	if len(args)!=4:
		print('Usage:crypt.py <input file> <output file> <key file>')
		exit(-1)
	crypt_file(args[1],args[2],args[3])
	print('Done!')

#----------------------

上面的代码,利用乱序的数字来对文件进行加密,保存这些乱序的数字的文件就是加密/解密的密钥。

用同一个密钥文件对目标文件进行一次xor操作就是加密,对加密过的文件再进行一次xor操作,就是解密。

其实秘钥文件可以是任意的文件。加密之后,如果没有秘钥文件,就算知道加密算法,也是无法解密的。

---------------------------------------

欢迎关注我们的微信

© 著作权归作者所有

共有 人打赏支持
Aomo
粉丝 2
博文 38
码字总数 16740
作品 0
高级程序员
私信 提问
如何将一个Python脚本加入Windows右键菜单?

版权声明:本文为【欧阳鹏】原创文章,欢迎转载,转载请注明出处! 【http://blog.csdn.net/ouyang_peng】 https://blog.csdn.net/qq446282412/article/details/84589479 一、背景 因为APP的日...

欧阳鹏
11/28
0
0
使用 Python 编写一个 FUSE 文件系统

如果你是一个固定的读者,您可能已经注意到,我一直在追求一个完美的备份程序,来结束写我自己的bup(Back UP,是储存器在DVD Video上的某些文件的一种格式)上的加密层。 在写encbup(加密bup...

oschina
2013/11/05
1K
0
关于一个RSA跨语言(java 和py)的加密解密操作

现在有一个需求,java平台提供接口,python平台调用接口,中间用到rsa进行接口的加密解密。java服务端的rsa加密操作已经完成,返回一个16进制的字符串给python平台,但是在python进行私钥解密...

我亦暖心丶
07/17
243
1
破解爬虫过程中遇到的网页加密Email地址

文章首发个人微信公众号及博客:http://zmister.com/archives/269.html 欢迎访问个人博客:http://zmister.com 查看更多Python应用文章 欢迎关注个人微信公众号:州的先生 及时交流讨论 1、问...

州的先生
05/15
0
0
支持国密算法的 Python 加密包 - gmssl-python

GMSSL GmSSL是一个开源的加密包的python实现,支持SM2/SM3/SM4等国密(国家商用密码)算法、项目采用对商业应用友好的类BSD开源许可证,开源且可以用于闭源的商业应用。 安装 pip install gmss...

段洪义
07/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

mysql密码重置

方法一: 在my.ini的[mysqld]字段加入: skip-grant-tables 重启mysql服务,这时的mysql不需要密码即可登录数据库 然后进入mysql mysql>use mysql; mysql>更新 update user set password=pas...

architect刘源源
5分钟前
0
1
SpringBoot + Mybatis 配置多数据源(Srping boot 二)

前置条件,你已经配置好spring boot+mybatis,可以参考之前的博客 实现逻辑通过注解+aop切面编程来动态更新datasource 第一步,配置多个DataSource server: port: 8080freezing: ...

小海bug
18分钟前
5
0
连续潜在变量---概率PCA

最大似然PCA 用于PCA的EM算法 贝叶斯PCA 因子分解

中国龙-扬科
24分钟前
4
0
Mac 安装redis 及 redis desktop manager

1.安装redis 1.1 下载地址: http://download.redis.io/releases/ 1.2 本地新建个redis文件夹 1.3 切换到redis 安装下:cd /Users/用户名/Documents/redis/redis-3.2.5 1.4 make install 1.5......

qimh
29分钟前
2
0
Caffe(二)-Python-自定义网络

这里我们用一个例子先来体验一下 首先定义一下我们的环境变量 $PYTHONPATH,我这儿是Windows开发环境,至于Windows Caffe怎么编译由读者自己下去搞定 我使用的控制台是 Windows PowerShell 添...

Pulsar-V
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部