#%% import csv from os import listdir class keyRing: def __init__(self, keyPath, dbEncoded, textsEncoded): self.keyPath = keyPath self.vettSpec = self.getVettSpec(dbEncoded) self.textKeys = self.getKeys(textsEncoded) def getVettSpec(self, dbEncoded): if not dbEncoded: return None with open(self.keyPath + "vettSpec.csv", 'r') as file1: reader = csv.DictReader(file1) vettSpec = [row for row in reader] return vettSpec def getKeys(self, textsEncoded): if not textsEncoded: return None files = listdir(self.keyPath) keyFiles = [file for file in files if (file.startswith('key_') and file.endswith('.csv'))] keys = {} for keyFile in keyFiles: code = keyFile.replace('key_', '').replace('.csv', '') try: keys[code] = self.getKeyByCode(keyFile) except: pass return keys def getKeyByCode(self, keyFile): with open(self.keyPath + keyFile, 'r') as file1: reader = csv.reader(file1) key = [int(row[0]) for index, row in enumerate(reader) if index>1] halfKeyLen = len(key)//2 key=key[:halfKeyLen] return key # Encoder/Decoders # DB field encoder/decoder # DB Columns that need this: # FORM -> norm, spec, invnorm, invspec # LEM -> norm, spec, invnorm, invspec, cat, omo def db_decode(vettSpec, string0): res = "" for char0 in string0: #1 char0Dec = ord(char0) # Dal carattere al codice Unicode DECIMALE corrispondente #2 char0ConvDec = next((el['unicode'] for el in vettSpec if el['intcode'] == str(char0Dec)), None) # Il codice DECIMALE (passato come stringa) viene ricercato in vettSpec, ritornando l'Unicode ESADECIMALE del carattere decriptato o None se non c'è riscontro -- il che non DOVREBBE succedere. #3 res += chr(int(char0ConvDec, 16)) # Si converte il codice esadecimale a decimale e si usa la built-in chr per recuperare il carattere return res # def db_encode(vettSpec, string0): res = "" for char0 in string0: # DA RIVEDERE ############################ if char0 != "%" and "_": ############################ #1 char0Hex = hex(ord(char0)) # Dal carattere al codice Unicode ESADECIMALE corrispondente #2 char0ConvDec = next((el['intcode'] for el in vettSpec if el['unicode'] == char0Hex[2:].upper()), None) # Il codice ESADECIMALE, senza il prefisso '0x' (rimosso tramite [2:]) e convertito in maiuscole per rispettare il formato di vettSpec, viene ricercato in vettSpec, ritornando l'Unicode DECIMALE del carattere criptato o None se non c'è riscontro -- il che non DOVREBBE succedere. #3 res += chr(int(char0ConvDec)) # Si usa la built-in chr per recuperare il carattere else: res += char0 return res # Text encoder/decoder def decodeTextByKey(text, key, startInFile): initialOffset = startInFile % len(key) res = "" for k, char0 in enumerate(text): offset = k + initialOffset if offset >= len(key): offset = offset % len(key) res += shiftchar(char0, -key[offset]) return res # def codeTextByKey(text, key, startInFile): initialOffset = startInFile % len(key) res = "" for k, char0 in enumerate(text): offset = k + initialOffset if offset >= len(key): offset = offset % len(key) res += shiftchar(char0, +key[offset]) return res # def shiftchar(char0, shift): return chr(ord(char0) + shift)