Tabla de contenido
2. Algoritmo de cifrado y descifrado
1. Importe la biblioteca en tiempo de ejecución
2. Definir la función de generación de claves.
3. Definir unidades de cifrado y descifrado.
1. Conocimientos básicos
El operador XOR en Python es ^, también registrado como XOR. El resultado de XOR bit a bit es: cuando los valores son iguales, el XOR es 0, cuando los valores son diferentes, el XOR es 1. Hay cuatro situaciones en total: 0 ^ 0 = 0, 0 ^ 1 = 1, 1 ^ 0 = 1, 1 ^ 1 = 0. Se pueden realizar operaciones simples de cifrado y descifrado en archivos usando XOR.
Operación de cifrado: primero convierta el archivo en un número binario y luego genere aleatoriamente una clave con la misma longitud que el número binario. Realice una operación XOR en el número binario del archivo y la clave para obtener el número binario cifrado y almacenarlo. como un archivo cifrado. .
Operación de descifrado: XOR el archivo binario cifrado con la clave para obtener el número binario original y luego restaurar el número binario original en el archivo.
2. Algoritmo de cifrado y descifrado
1. Importe la biblioteca en tiempo de ejecución
import json
from pathlib import Path
from secrets import token_bytes
import argparse
2. Definir la función de generación de claves.
def random_key(length):
key = token_bytes(nbytes=length) #根据指定长度生成随机密钥
key_int = int.from_bytes(key, 'big') #将byte转换为int
return key_int
3. Definir unidades de cifrado y descifrado.
def encrypt(raw): #加密单元
raw_bytes = raw.encode() #将字符串编码成字节串
raw_int = int.from_bytes(raw_bytes, 'big') #将byte转换成int
key_int = random_key(len(raw_bytes)) #根据长度生成密钥
return raw_int ^ key_int, key_int #将密钥与文件异或,返回异或后的结果和密钥
def decrypt(encrypted, key_int): #解密单元
decrypted = encrypted ^ key_int #将加密后的文件与密钥异或
length = (decrypted.bit_length() + 7) // 8 #计算所占比特大小
decrypted_bytes = int.to_bytes(decrypted, length, 'big') #将int转换回byte
return decrypted_bytes.decode() #解码后返回
4. Cifrar archivos
def encrypt_file(path, key_path=None, *, encoding='utf-8'): #参数path指定文件地址
path = Path(path)
cwd = path.cwd() / path.name.split('.')[0]
path_encrypted = cwd / path.name
if key_path is None:
key_path = cwd / 'key'
if not cwd.exists():
cwd.mkdir()
path_encrypted.touch()
key_path.touch()
//打开文件并将内容写入
with path.open('rt', encoding=encoding) as f1, \
path_encrypted.open('wt', encoding=encoding) as f2, \
key_path.open('wt', encoding=encoding) as f3:
encrypted, key = encrypt(f1.read())
json.dump(encrypted, f2)
json.dump(key, f3)
5. Descifrar archivos
def decrypt_file(path_encrypted, key_path=None, *, encoding='utf-8'):
path_encrypted = Path(path_encrypted)
cwd = path_encrypted.cwd()
path_decrypted = cwd / 'decrypted'
if not path_decrypted.exists():
path_decrypted.mkdir()
path_decrypted /= path_encrypted.name
path_decrypted.touch()
if key_path is None:
key_path = cwd / 'key'
with path_encrypted.open('rt', encoding=encoding) as f1, \
key_path.open('rt', encoding=encoding) as f2, \
path_decrypted.open('wt', encoding=encoding) as f3:
decrypted = decrypt(json.load(f1), json.load(f2))
f3.write(decrypted)
3. Prueba
Coloque el archivo a cifrar en el mismo directorio que el archivo py y ejecute lo siguiente para cifrar 1.txt.
encrypt_file("D:/PyCharm Community Edition 2021.3.2/Workplace/encryption/1.txt")
Coloque el archivo y la clave que se van a descifrar en el mismo directorio que el archivo py y ejecute lo siguiente para descifrar y restaurar 1.txt.
decrypt_file("D:/PyCharm Community Edition 2021.3.2/Workplace/encryption/1.txt")