Чтение и запись текста на python с шифрованием

#python #python-3.x #pandas

#python #python-3.x #панды

Вопрос:

У меня есть следующий файл test.txt:

 'campo1','campo2','campo3','campo4'    
'2222','34563434','547348568765756556','78967756K      '
'2222','34564232','343575876567567584','65876566W      '
'2222','54754456','234223144675987666','43453534A      '
  

Мне нужно зашифровать campo2, campo3 и campo4 с помощью функции DES3 шифрования.Библиотека шифров. Я написал следующий код:

 import pandas as pd
from Crypto.Cipher import DES3
infile = mainpath   "/"   "Prueba Encriptacion.txt"
outfile = mainpath   "/"   "Prueba Encriptacion out.txt"
cipher = DES3.new("4QGdtHLBSKmAJaOJY5BW")
df = pd.read_csv(infile, ',')
for row in df.iterrows():
    campo2_out= cipher.encrypt(campo2)
    campo3_out=cipher.encrypt(campo3)
    campo4_out=cipher.encrypt(campo4)
  

Моя проблема в том, что я не знаю, как я могу правильно перемещаться по строкам файла и записывать в выходной файл результат функции cipher.encrypt.

Ответ №1:

В pandas вы обычно не просматриваете строки. Вы применяете свою функцию к требуемым ячейкам, а затем сохраняете полученный фрейм данных.

Итак, ваш код должен быть:

 #... read frame as normal...
df["campo2"] = df["campo2"].apply(cipher.encrypt)
df["campo3"] = df["campo3"].apply(cipher.encrypt)
df["campo4"] = df["campo4"].apply(cipher.encrypt)
df.to_csv("outputfile)
  

Ответ №2:

Вы можете прочитать csv с помощью python csv.reader, записать с помощью csv.writer

Вот код:

 import csv
from Crypto.Cipher import DES3

cipher = DES3.new("4QGdtHLBSKmAJaOJY5BW")
infile = mainpath   "/"   "Prueba Encriptacion.txt"
outfile = mainpath   "/"   "Prueba Encriptacion out.txt"


def encrypt_csv(file_name):
    with open(file_name, 'r') as csv_file:
        with open(outfile, 'w') as out_file:
            reader = csv.reader(csv_file, delimiter=",")
            writer = csv.writer(out_file, delimiter=",")
            for row in reader:
                encrypted_data = [cipher.encrypt(data) for data in row]
                writer.writerow(encrypted_data)


if __name__ == '__main__':
    encrypt_csv(infile)
  

Комментарии:

1. Как я могу применить шифрование только к campo2, campo3 и campo4?

2. вы можете перебирать ` encrypted_data = [cipher.encrypt(data) для данных в строке]` вместо использования понимания списка и выборочно шифровать данные

Ответ №3:

Мне пришлось немного модифицировать ваш код, чтобы заставить его воспроизводиться. Но как только это сработает, я мог бы использовать applymap , вот так:

 from Crypto.Cipher import DES3
from Crypto.Random import get_random_bytes

key = DES3.adjust_key_parity(get_random_bytes(24))
cipher = DES3.new(key, DES3.MODE_CFB)

df = pd.read_csv('test.txt', ',')
df = df.astype(str)
df = df.applymap(lambda x: cipher.encrypt(x.encode('UTF-8')))
  

Предоставляя вам:

 campo1               campo2                                 campo3                                              campo4
0   b'xe1#[xd3'           b'xe2x9eexb4xf1xc4oxa4'   b'wxc0:\Cnxc7x9fxc4Ax93x1ex8cxdexa0...   b'm>xc2xb3xe3xebxe6\('
1   b'x95xeaxacxed'     b'xa6;xfdxb2x98exd0x8d'   b'01sVHg2jxd0x8fxeex90x1aamp;xd0xaexebxb3'    b'xdbx06xcdhx01xcexfdvxca'
2   b'[xfdxf5A'           b'|x85Wxe4x19x83(X'         b'xb9E x00xcf\xa2r,xa6x9axf9x0b[gxe...   b'xa4xd2x14amp;x8c:xf8Nxdc'