文档章节

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

Aomo
 Aomo
发布于 09/21 13:19
字数 569
阅读 21
收藏 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
高级程序员
关于一个RSA跨语言(java 和py)的加密解密操作

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

我亦暖心丶
07/17
0
0
破解爬虫过程中遇到的网页加密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
使用Python内建chr, ord实现的简单的加/解密

Python中有两个个内建方法,用于解决0-255与相应ascii码转换: chr() Return a string of one character with ordinal i; 0 <= i < 256.也就是,返回代表整数范围内0-255对应的字符。 ord() ...

alazyer
2014/03/25
0
0
用 Python 重写 PHP 加密解密算法 authcode

刚刚读了一遍 Discuz 系列产品中广泛使用的加密解密算法 authcode,受益匪浅,真是设计巧妙。 为了真的理解其中的想法,用 Python 改写了一遍。 小白程序员一枚,学艺不精,望路过的各位大侠...

catroll
2013/12/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

20181018 上课截图

![](https://oscimg.oschina.net/oscnet/49f66c08ab8c59a21a3b98889d961672f30.jpg) ![](https://oscimg.oschina.net/oscnet/a61bc2d618b403650dbd4bf68a671fabecb.jpg)......

小丑鱼00
40分钟前
1
0
WinDbg

参考来自:http://www.cnit.net.cn/?id=225 SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols ctrl + d to open dump_file Microsoft (R) Windows Debugger Version 6.12.0002.633......

xueyuse0012
今天
2
0
OSChina 周五乱弹 —— 想不想把92年的萝莉退货

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @罗马的王:分享松澤由美的单曲《地球ぎ》 很久没看圣斗士星矢了 《地球ぎ》- 松澤由美 手机党少年们想听歌,请使劲儿戳(这里) @开源中国首...

小小编辑
今天
14
2
springBoot条件配置

本篇介绍下,如何通过springboot的条件配置,控制Bean的创建 介绍下开发环境 JDK版本1.8 springboot版本是1.5.2 开发工具为 intellij idea(2018.2) 开发环境为 15款MacBook Pro 前言 很多时候,...

贺小五
今天
1
0
javascript source map 的使用

之前发现VS.NET会为压缩的js文添加一个与文件名同名的.map文件,一直没有搞懂他是用来做什么的,直接删除掉运行时浏览器又会报错,后来google了一直才真正搞懂了这个小小的map文件背后的巨大...

粒子数反转
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部