[LABI] tema01: added encrypt_decrypt_RSA.py
This commit is contained in:
parent
2ad74dfcad
commit
6c265f902c
|
@ -0,0 +1,97 @@
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import hashlib
|
||||||
|
from Crypto.Cipher import AES, PKCS1_OAEP
|
||||||
|
from Crypto.PublicKey import RSA
|
||||||
|
|
||||||
|
BLOCK_SIZE = 16
|
||||||
|
|
||||||
|
|
||||||
|
def generate_key(key):
|
||||||
|
if len(key) < BLOCK_SIZE:
|
||||||
|
# Gerar uma síntese de chave com SHA-256
|
||||||
|
key = hashlib.sha256(key.encode('utf-8')).digest()
|
||||||
|
else:
|
||||||
|
# Usar apenas os primeiros 256 octetos
|
||||||
|
key = key[:BLOCK_SIZE].encode('utf-8')
|
||||||
|
return key
|
||||||
|
|
||||||
|
|
||||||
|
def pad_data(data):
|
||||||
|
pad_len = BLOCK_SIZE - (len(data) % BLOCK_SIZE)
|
||||||
|
padding = bytes([pad_len] * pad_len)
|
||||||
|
return data + padding
|
||||||
|
|
||||||
|
|
||||||
|
def unpad_data(data):
|
||||||
|
pad_len = data[-1]
|
||||||
|
return data[:-pad_len]
|
||||||
|
|
||||||
|
|
||||||
|
def encrypt_file(file_path, key, output_path):
|
||||||
|
with open(file_path, 'rb') as file:
|
||||||
|
data = file.read()
|
||||||
|
|
||||||
|
# Gerar chave simétrica aleatória
|
||||||
|
symmetric_key = os.urandom(BLOCK_SIZE)
|
||||||
|
|
||||||
|
# Cifrar dados do arquivo
|
||||||
|
cipher = AES.new(symmetric_key, AES.MODE_EAX)
|
||||||
|
ciphertext, tag = cipher.encrypt_and_digest(pad_data(data))
|
||||||
|
|
||||||
|
# Cifrar chave simétrica com chave pública RSA
|
||||||
|
with open(key, 'rb') as key_file:
|
||||||
|
recipient_key = RSA.import_key(key_file.read())
|
||||||
|
cipher_rsa = PKCS1_OAEP.new(recipient_key)
|
||||||
|
encrypted_symmetric_key = cipher_rsa.encrypt(symmetric_key)
|
||||||
|
|
||||||
|
# Concatenar nonce, tag, chave cifrada e dados cifrados em um único arquivo
|
||||||
|
with open(output_path, 'wb') as output_file:
|
||||||
|
output_file.write(cipher.nonce)
|
||||||
|
output_file.write(tag)
|
||||||
|
output_file.write(encrypted_symmetric_key)
|
||||||
|
output_file.write(ciphertext)
|
||||||
|
|
||||||
|
|
||||||
|
def decrypt_file(file_path, key, output_path):
|
||||||
|
with open(file_path, 'rb') as file:
|
||||||
|
data = file.read()
|
||||||
|
|
||||||
|
# Separar nonce, tag, chave cifrada e dados cifrados
|
||||||
|
nonce = data[:16]
|
||||||
|
tag = data[16:32]
|
||||||
|
encrypted_symmetric_key = data[32:288]
|
||||||
|
ciphertext = data[288:]
|
||||||
|
|
||||||
|
# Decifrar chave simétrica com chave privada RSA
|
||||||
|
with open(key, 'rb') as key_file:
|
||||||
|
private_key = RSA.import_key(key_file.read(), passphrase=input("Enter passphrase for private key: "))
|
||||||
|
cipher_rsa = PKCS1_OAEP.new(private_key)
|
||||||
|
symmetric_key = cipher_rsa.decrypt(encrypted_symmetric_key)
|
||||||
|
|
||||||
|
# Descriptografar arquivo
|
||||||
|
cipher = AES.new(symmetric_key, AES.MODE_EAX, nonce=nonce)
|
||||||
|
plaintext = cipher.decrypt_and_verify(ciphertext, tag)
|
||||||
|
|
||||||
|
# Remover padding
|
||||||
|
plaintext = unpad_data(plaintext)
|
||||||
|
|
||||||
|
# Escrever arquivo decifrado
|
||||||
|
with open(output_path, 'wb') as output_file:
|
||||||
|
output_file.write(plaintext)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
if len(sys.argv) != 5:
|
||||||
|
print('Usage: python3 encrypt_decrypt_file.py encrypt|decrypt file key output_file', file=sys.stderr)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
action = sys.argv[1]
|
||||||
|
file_path = sys.argv[2]
|
||||||
|
key = sys.argv[3]
|
||||||
|
output_path = sys.argv[4]
|
||||||
|
|
||||||
|
if action == 'encrypt':
|
||||||
|
encrypt_file(file_path, key, output_path)
|
||||||
|
elif action == 'decrypt':
|
||||||
|
decrypt_file(file_path, key, output_path)
|
Loading…
Reference in New Issue