123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- #%%
- 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)
|