de_code.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #%%
  2. import csv
  3. from os import listdir
  4. class keyRing:
  5. def __init__(self, keyPath, dbEncoded, textsEncoded):
  6. self.keyPath = keyPath
  7. self.vettSpec = self.getVettSpec(dbEncoded)
  8. self.textKeys = self.getKeys(textsEncoded)
  9. def getVettSpec(self, dbEncoded):
  10. if not dbEncoded:
  11. return None
  12. with open(self.keyPath + "vettSpec.csv", 'r') as file1:
  13. reader = csv.DictReader(file1)
  14. vettSpec = [row for row in reader]
  15. return vettSpec
  16. def getKeys(self, textsEncoded):
  17. if not textsEncoded:
  18. return None
  19. files = listdir(self.keyPath)
  20. keyFiles = [file for file in files if (file.startswith('key_') and file.endswith('.csv'))]
  21. keys = {}
  22. for keyFile in keyFiles:
  23. code = keyFile.replace('key_', '').replace('.csv', '')
  24. try:
  25. keys[code] = self.getKeyByCode(keyFile)
  26. except:
  27. pass
  28. return keys
  29. def getKeyByCode(self, keyFile):
  30. with open(self.keyPath + keyFile, 'r') as file1:
  31. reader = csv.reader(file1)
  32. key = [int(row[0]) for index, row in enumerate(reader) if index>1]
  33. halfKeyLen = len(key)//2
  34. key=key[:halfKeyLen]
  35. return key
  36. # Encoder/Decoders
  37. # DB field encoder/decoder
  38. # DB Columns that need this:
  39. # FORM -> norm, spec, invnorm, invspec
  40. # LEM -> norm, spec, invnorm, invspec, cat, omo
  41. def db_decode(vettSpec, string0):
  42. res = ""
  43. for char0 in string0:
  44. #1
  45. char0Dec = ord(char0) # Dal carattere al codice Unicode DECIMALE corrispondente
  46. #2
  47. 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.
  48. #3
  49. res += chr(int(char0ConvDec, 16)) # Si converte il codice esadecimale a decimale e si usa la built-in chr per recuperare il carattere
  50. return res
  51. #
  52. def db_encode(vettSpec, string0):
  53. res = ""
  54. for char0 in string0:
  55. # DA RIVEDERE
  56. ############################
  57. if char0 != "%" and "_":
  58. ############################
  59. #1
  60. char0Hex = hex(ord(char0)) # Dal carattere al codice Unicode ESADECIMALE corrispondente
  61. #2
  62. 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.
  63. #3
  64. res += chr(int(char0ConvDec)) # Si usa la built-in chr per recuperare il carattere
  65. else:
  66. res += char0
  67. return res
  68. # Text encoder/decoder
  69. def decodeTextByKey(text, key, startInFile):
  70. initialOffset = startInFile % len(key)
  71. res = ""
  72. for k, char0 in enumerate(text):
  73. offset = k + initialOffset
  74. if offset >= len(key):
  75. offset = offset % len(key)
  76. res += shiftchar(char0, -key[offset])
  77. return res
  78. #
  79. def codeTextByKey(text, key, startInFile):
  80. initialOffset = startInFile % len(key)
  81. res = ""
  82. for k, char0 in enumerate(text):
  83. offset = k + initialOffset
  84. if offset >= len(key):
  85. offset = offset % len(key)
  86. res += shiftchar(char0, +key[offset])
  87. return res
  88. #
  89. def shiftchar(char0, shift):
  90. return chr(ord(char0) + shift)