В моей базе данных есть данные, которые мне нужно зашифровать. Затем я буду загружать базу данных в CSV-файлы. У меня есть программа на Python, которая может расшифровать определенные столбцы в CSV-файле. Проблема в том, что я не получаю свои данные из программы python.
Функция sql:
CREATE OR REPLACE FUNCTION AESEncrypt (data TEXT,pass TEXT)
RETURNS TEXT AS $crypted$
declare
crypted TEXT;
key BYTEA;
iv BYTEA;
BEGIN
key := digest(convert_to(pass, 'utf-8'), 'sha256');
iv := digest(convert_to(CONCAT(data , 'salt'), 'utf-8'), 'md5');
crypted := encode(encrypt_iv(convert_to(data, 'utf-8'), key, iv, 'aes'), 'base64');
RETURN crypted;
END;
$crypted$ LANGUAGE plpgsql;
Python программа:
import csv
import time
import base64
from hashlib import sha256, md5
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend
password = 'Password'
inputFile = 'test.txt'
outputFile = 'out.txt'
delimiter = ';'
columns = [0]
backend = default_backend()
key = sha256(password.encode('utf-8')).digest()
iv = md5((password + 'salt').encode('utf-8')).digest()
cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=backend)
def encrypt(input):
input = bytes(input, 'utf-8')
#Padding
length = 16 - (len(input) % 16)
input += bytes([length])*length
#Encrypt
encryptor = cipher.encryptor()
return base64.b64encode(encryptor.update(input) + encryptor.finalize()).decode("utf-8")
def decrypt(input):
input = base64.b64decode(input)
decryptor = cipher.decryptor()
data = decryptor.update(input) + decryptor.finalize()
data = data[:-data[-1]] #Remove padding
print(data)
return data.decode('utf-8')
def main():
start_time = time.time()
with open(inputFile, 'r') as csvfileIn:
with open(outputFile, 'w', newline='') as csvfileOut:
spamreader = csv.reader(csvfileIn, delimiter=delimiter)
spamwriter = csv.writer(csvfileOut, delimiter=delimiter)
firstRow = True
for row in spamreader:
if not firstRow:
for pos in columns:
row[pos] = decrypt(row[pos])
firstRow = False
spamwriter.writerow(row)
print("--- %s seconds ---" % (time.time() - start_time))
main()
Если я зашифрую файл с помощью функции шифрования, написанной в программе python, то получу правильный результат, если расшифрую его.
Если бы я назвал функцию sql AESEncrypt('data', 'Password')
, он возвращает строку base64 Ojq6RKg7NgDx8YFdLzfVhQ==
Но после расшифровки я получаю пустую строку как результат, а не строку data
. Если я посмотрю на состояние печати перед этапом декодирования utf-8 в функции дешифрования, он выведет на консоль следующую команду b''
, так что похоже, что с заполнением может быть что-то не так. Если я буду печатать до того, как уберу отступ, я получу b'\x85\x90sz\x0cQS\x9bs\xeefvA\xc63-'
. Если я зашифрую длинное предложение, то я фактически увижу части текста в байтовых выходах выше.
Кто-нибудь знает, что я сделал не так?