一、实验原理
明文:未加密的内容
密文:加密后的内容
密钥:明文与密文之间的一把钥匙
加密:明文与密钥异或
解密:密文与密钥异或
二、代码实现
python3.5
加密过程
# -*- coding: UTF-8 -*-
from secrets import token_bytes
import os
#生成密钥
def random_key(length):
key = token_bytes(nbytes=length)
key_int = int.from_bytes(key,'big')
return key_int
#加密算法
def encrypt(raw):
raw_bytes = raw.encode()
raw_int = int.from_bytes(raw_bytes,'big')
key_int = random_key(len(raw_bytes))
with open('E:/Dairy/Codekey.txt', 'w') as file0:
file0.write(str(key_int)) #保存密钥
return str(raw_int ^ key_int)#异或成密文
#读取要加密的文件
with open('E:/Dairy/Code/a.txt', encoding='utf-8') as file1:
contents = file1.read()
#对文件内容进行加密
result = encrypt(contents)
#输出密文
with open('E:/Dairy/Code/aout.txt', 'w') as file2:
file2.write(result)
解密过程
#coding=utf-8
#解密算法
def decrypt(encrypted,key_int):
decrypted = int(encrypted)^int(key_int)
length = (decrypted.bit_length() +7)//8
decrypted_bytes = int.to_bytes(decrypted,length, 'big')
return decrypted_bytes.decode()
#读取密文
with open('E:/Dairy/Code/aout.txt', encoding='utf-8') as file0:
crypto = file0.read()
#读取密钥
with open('E:/Dairy/Code/key.txt', encoding='utf-8') as file1:
key = file1.read()
#解密
result = decrypt(crypto,key)
#输出原文
with open('E:/Dairy/Code/outa.txt', 'w') as file2:
file2.write(result)
结果是可靠的,可能感觉文件创建的有点多,也可以用两个文件搞定,一个是放密钥的,一个是存放内容的。
三、涉及的知识
1、token_bytes() 函数:接受一个 int 参数,用于指定随机字节串的长度
2、int.from_bytes(bytes, byteorder, *, signed=False)函数:
功能:把bytes类型的变量,转化为十进制整数
bytes是输入的变量;byteorder主要有两种:‘big’和’little’;signed=True表示需要考虑符号位
3、int.to_bytes(bytes, byteorder, *, signed=False)函数
功能:是int.from_bytes的逆过程,把十进制整数,转换为bytes类型的格式。
4、文件操作
(1)open()方法,必须在用完后使用close()关闭文件
f = open('test.txt', 'r')
f.read()
f.close()
(2)with语句来自动调用close()方法:
with open('/path/to/file', 'r') as f:
f.read()
关于open()的mode参数:
‘r’:只读
‘w’:只写
‘a’:追加内容
‘r+’ == r+w(可读可写,文件若不存在就报错(IOError))
‘w+’ == w+r(可读可写,文件若不存在就创建)
‘a+’ ==a+r(可追加可写,文件若不存在就创建)
对应的,如果是二进制文件,就都加一个b就好啦:
‘rb’ ‘wb’ ‘ab’ ‘rb+’ ‘wb+’ ‘ab+’
** read()、readline() 和 readlines()方法
- read() 每次读取整个文件。
- readlines() 与read() 一样读取整个文件,readlines() 自动将文件内容分析成一个行的列表,该列表可以由 Python 的 for … in … 结构进行处理。
- readline() 每次只读取一行。
** write() 和 writelines()方法
- write()方法和read()、readline()方法对应,是将字符串写入到文件中。
- writelines()方法和readlines()方法对应,也是针对列表的操作。它接收一个字符串列表作为参数,将他们写入到文件中,换行符不会自动的加入,因此,需要显式的加入换行符。