一、实验原理

明文:未加密的内容

密文:加密后的内容

密钥:明文与密文之间的一把钥匙

加密:明文与密钥异或

解密:密文与密钥异或

二、代码实现

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)

结果是可靠的,可能感觉文件创建的有点多,也可以用两个文件搞定,一个是放密钥的,一个是存放内容的。

python sha256解密 python如何解密_python sha256解密

三、涉及的知识

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()方法

  1. read() 每次读取整个文件。
  2. readlines() 与read() 一样读取整个文件,readlines() 自动将文件内容分析成一个行的列表,该列表可以由 Python 的 for … in … 结构进行处理。
  3. readline() 每次只读取一行。

** write() 和 writelines()方法

  1. write()方法和read()、readline()方法对应,是将字符串写入到文件中。
  2. writelines()方法和readlines()方法对应,也是针对列表的操作。它接收一个字符串列表作为参数,将他们写入到文件中,换行符不会自动的加入,因此,需要显式的加入换行符。