Advertisement
Guest User

Untitled

a guest
May 20th, 2019
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.09 KB | None | 0 0
  1. # coding=utf8
  2. SILENT_MODE = False
  3. from collections import Counter
  4.  
  5. polishDictionary = {"a": 0, "ą": 1, "b": 2, "c": 3, "ć": 4, "d": 5, "e": 6, "ę": 7, "f": 8, "g": 9, "h": 10, "i": 11,
  6. "j": 12, "k": 13, "l": 14, "ł": 15, "m": 16, "n": 17, "ń": 18, "o": 19, "ó": 20, "p": 21, "r": 22,
  7. "s": 23, "ś": 24, "t": 25, "u": 26, "w": 27, "y": 28, "z": 29, "ź": 30, "ż": 31}
  8. polishString = "aąbcćdeęfghijklłmnńoóprsśtuwyzźż"
  9. polishFreq = {"a": 8.91, "ą": 0.99, "b": 1.47, "c": 3.96, "ć": 0.4, "d": 3.25, "e": 7.66, "ę": 1.11, "f": 0.30,
  10. "g": 1.42, "h": 1.08, "i": 8.21, "j": 2.28, "k": 3.51, "l": 2.10, "ł": 1.82, "m": 2.80, "n": 5.52,
  11. "ń": 0.20, "o": 7.75, "ó": 0.85, "p": 3.13, "r": 4.69, "s": 4.32, "ś": 0.66, "t": 3.98, "u": 2.5,
  12. "w": 4.65, "y": 3.76, "z": 5.64, "ź": 0.06, "ż": 0.83}
  13.  
  14.  
  15. def kasiskiExamination(ciphertext): #kasiski obliczamy dlugosci kluczy korzystajac z odleglosci powtarzajcacyh sie znakow 3 literowych
  16. repeatedSeqSpacings = findRepeatSequencesSpacings(ciphertext) #znajdwanie powtarzajacych sie sekwencje
  17. print(repeatedSeqSpacings)
  18.  
  19. seqFactors = {}
  20. for seq in repeatedSeqSpacings:
  21. seqFactors[seq] = []
  22. for spacing in repeatedSeqSpacings[seq]:
  23. seqFactors[seq].extend(getUsefulFactors(spacing))
  24.  
  25. factorsByCount = getMostCommonFactors(seqFactors)
  26.  
  27. allLikelyKeyLengths = []
  28. for twoIntTuple in factorsByCount:
  29. allLikelyKeyLengths.append(twoIntTuple[0])
  30.  
  31. return allLikelyKeyLengths
  32.  
  33.  
  34. def getUsefulFactors(num): # uzyteczne wczyli powyzej 2 bo wiadomo ze jak nie to 1 najczesciej bylaby
  35. # zwraca liste użytecznych dzielników(tzn. takich że są mniejsze od MAX_KEY_LENGTH +1
  36. if num < 2:
  37. return []
  38.  
  39. factors = []
  40.  
  41. for i in range(2, 4 + 1):
  42. if num % i == 0:
  43. factors.append(i)
  44. otherFactor = int(num / i)
  45. if otherFactor < 4 + 1 and otherFactor != 1:
  46. factors.append(otherFactor)
  47. return list(set(factors))
  48.  
  49.  
  50. def getItemAtIndexOne(items): #wierzy 1 idex w sumie bezsensu
  51. return items[1]
  52.  
  53.  
  54. def getMostCommonFactors(seqFactors): #
  55. # zliczamy jak dużo razy pojawił się dany dzielnik
  56. factorCounts = {}
  57.  
  58. for seq in seqFactors:
  59. factorList = seqFactors[seq]
  60. for factor in factorList:
  61. if factor not in factorCounts:
  62. factorCounts[factor] = 0
  63. factorCounts[factor] += 1
  64.  
  65. factorsByCount = []
  66. for factor in factorCounts:
  67.  
  68. if factor <= 5:
  69. factorsByCount.append((factor, factorCounts[factor]))
  70.  
  71. factorsByCount.sort(key=getItemAtIndexOne, reverse=True)
  72.  
  73. return factorsByCount
  74.  
  75.  
  76. def findRepeatSequencesSpacings(message):
  77. # idzie sobie prez cyphertext i znajduje 3,4,5 powtarzajace sie wyrazy
  78. # usuwa krzaki i tym podobne żeby byly tylko litery alfabetu
  79. # ustala również odległości pomiedzy literami
  80.  
  81. seqSpacings = {}
  82. for seqLen in range(3, 6):
  83. for seqStart in range(len(message) - seqLen):
  84. seq = message[seqStart:seqStart + seqLen]
  85.  
  86. for i in range(seqStart + seqLen, len(message) - seqLen):
  87. if message[i:i + seqLen] == seq:
  88. if seq not in seqSpacings:
  89. seqSpacings[seq] = []
  90.  
  91. seqSpacings[seq].append(i - seqStart)
  92. return seqSpacings
  93.  
  94.  
  95. def makeN(txt, alph, alphabetSt): #zamienia litere na numer
  96. result = []
  97. for i in range(len(txt)):
  98. if txt[i] in alph:
  99. for j in range(0, len(alphabetSt)): #jak jest alfabet to bierzesz z niego odpowiadajaca mu wartosc liczbowa
  100. if txt[i] == alphabetSt[j]:
  101. result.append(j)
  102. break
  103. else:
  104. result.append(-1)
  105. return result
  106.  
  107.  
  108. def Min(hm, listOf, alphabetString): #minimalny string
  109. result = []
  110. workingList = listOf.copy()
  111. stringResult = []
  112. for i in range(hm):
  113. minpos = workingList.index(min(workingList))
  114. del workingList[minpos]
  115. workingList.append(7824972) # bo tak moze byc
  116. result.append(minpos)
  117. for i in range(len(result)):
  118. stringResult.append(alphabetString[result[i]])
  119. return stringResult
  120.  
  121.  
  122. def endecrypt(text, key, alphabet, alphabetString, tryb): #szyfruje i deszyfruje w zaleznowsic od trybu
  123. textN = makeN(text, alphabet, alphabetString)
  124. keyN = makeN(key, alphabet, alphabetString)
  125. resultN = []
  126. result = ""
  127. i = 0
  128. while i < len(textN):
  129. k = 0
  130. while k < len(key) and i < len(textN):
  131. if textN[i] != -1:
  132. if tryb == 0:
  133. index = (textN[i] + keyN[k]) % len(alphabetString)
  134. else:
  135. index = (textN[i] - keyN[k]) % len(alphabetString)
  136. resultN.append(index)
  137. result += alphabetString[index]
  138. i += 1
  139. k += 1
  140. continue
  141. else:
  142. result += " "
  143. resultN.append(-1)
  144. i += 1
  145. return result
  146.  
  147.  
  148. def count(text): #zlicza teksty funcja counter z biblioteki
  149. result = Counter(text)
  150. return result
  151.  
  152.  
  153. def replace(crypto): #usuwa przecinki
  154. crypto = crypto.replace(" ", "")
  155. return crypto
  156.  
  157.  
  158. def subtexts(shift, text): #dzieli tekst na mniejsze fragmenty co n ty w zaleznosci klucza
  159. txx = []
  160. for i in range(shift):
  161. txx.append(text[i::shift])
  162. return txx
  163.  
  164.  
  165.  
  166. def attemptHackWithKeyLength(ciphertext, mostLikelyKeyLength , alphabetString, alphabetFrequencyWC):
  167.  
  168. ciphertextUp = ciphertext.upper()
  169.  
  170. allFreqScores = []
  171. for nth in range(1, mostLikelyKeyLength + 1):
  172. nthLetters = gubStr = subtexts(mostLikelyKeyLength, ciphertext)
  173.  
  174.  
  175.  
  176.  
  177. if not SILENT_MODE:
  178. for i in range(len(allFreqScores)):
  179.  
  180. print('Possible letters for letter %s of the key: ' % (i + 1), end='')
  181. for freqScore in allFreqScores[i]:
  182. print('%s ' % freqScore[0], end='')
  183. print()
  184. #tutaj próbujemy kazda kombinacje powtarzających się liter dla każdej pozycji
  185.  
  186.  
  187.  
  188. decryptedText = endecrypt(encrypted, key, polishDictionary, polishString, 1)
  189. if keys!= 0:
  190. origCase = []
  191. for i in range(len(ciphertext)):
  192. if ciphertext[i].isupper():
  193. origCase.append(decryptedText[i].upper())
  194. else:
  195. origCase.append(decryptedText[i].lower())
  196. decryptedText = ''.join(origCase)
  197.  
  198. print('Possible encryption hack with key %s:' % (mostLikelyKeyLength))
  199. print(decryptedText[:200]) # Only show first 200 characters.
  200. print()
  201. print('Enter D if done, anything else to continue hacking:')
  202. response = input('> ')
  203.  
  204. if response.strip().upper().startswith('D'):
  205. return decryptedText
  206.  
  207. return None
  208. polishDictionary = {"a": 0, "ą": 1, "b": 2, "c": 3, "ć": 4, "d": 5, "e": 6, "ę": 7, "f": 8, "g": 9, "h": 10, "i": 11,
  209. "j": 12, "k": 13, "l": 14, "ł": 15, "m": 16, "n": 17, "ń": 18, "o": 19, "ó": 20, "p": 21, "r": 22,
  210. "s": 23, "ś": 24, "t": 25, "u": 26, "w": 27, "y": 28, "z": 29, "ź": 30, "ż": 31}
  211. polishString = "eęfghijklłmnńoóprsśtuwyzżźaąbcćd"
  212. polishFreq = {"a": 8.91, "ą": 0.99, "b": 1.47, "c": 3.96, "ć": 0.4, "d": 3.25, "e": 7.66, "ę": 1.11, "f": 0.30,
  213. "g": 1.42, "h": 1.08, "i": 8.21, "j": 2.28, "k": 3.51, "l": 2.10, "ł": 1.82, "m": 2.80, "n": 5.52,
  214. "ń": 0.20, "o": 7.75, "ó": 0.85, "p": 3.13, "r": 4.69, "s": 4.32, "ś": 0.66, "t": 3.98, "u": 2.5,
  215. "w": 4.65, "y": 3.76, "z": 5.64, "ź": 0.06, "ż": 0.83}
  216. encrypted = "gukśdśmż bezród zuezęurnu afyawpaa ś uzbżicóbkrcó dośćą łorńłkrś ęwllę rś azodś rca dmańrgk ąfńuli źkfańg zfmabkli łclmkaśś yzń jś nay ńśzą nrżhś ur kkzsyńó łds rś ćwiywą d jwńcm óuzdou lc acypgc kź aś mpwcżśmż d dodbmż yruęrjziwc hbd adżką śdćłwcwb ydukzrń rś nuzażłśiz z uużżh kfipśgu afoę ulsjlmuyęr gcpą kluąaźćśod huręrca ifhćto d embyśpimśdprińó dmpp guzojhśgk ycyńigdn ośóź nk ijdźrca c rio uimkc wuńń hmge smżeęai śmżzcbbńigir śąjdlsrlmę a wkżb puźgomfr óżjmr upńigdn wąhmż łmsoę izcraśsężu ióuęrcuźz wuoś ockd ndgęęz rę bśpęui bykkalmęró ycędail oc hmkwipąfń bmźswcrśiąk ńiśóź ż hm bśgwt łezfl acapumk ykkzmnśi ńngzęńocscśdśi rrofi ą ęięh wśśą rrofi ydńfm soklś safdśmż ęwchc nićą aśłkżr iuwąypuyżfc hi gru pńfburi fpdlęr bźśfśi ihwęfpu ąz bńiekąż pńoź yc rdó aęuflmk rśsjśdśą ćaęr yćilkzf ńuwóomob goięh c agwżp dmbuwih ąfi aąeęc śąmotź omkłióu yzńu fpuelśżńjmreś uęeadfśśiąk afjźrcuaf śpęlsjkd bbuópud ćdcigcwkyipmlmk śduksnk ycą ńmańif śr ńśj uingzfńe odrińuońźm hwcnż nwć ęunśtżfac aóngodżbiij f źhbńzwmac fpgcśmkń gdr spńićwot uuntż wóżużó sźz rę zodramk d wk pmuńilk kbśpró źc ulbdęzrlmę m puńffńd zpćał jbcaiabcrżę ńm żęńca ijdźrca ńtóu ulsróżlułoim ńatlatm wćidkam pńdę nwć huuńńofó ń bś ęgnwk bśłźzfń cózwcp ośbi iuęąhpu i ńdąoń smfrailaęmaęrca dm żcp ćuz eś ąożzkz uufpwghśbś o ężzańypó emhćm łds aśzdp pwćfkn owgńońaińof fu hi nźsyćrińof bęwpógna bśuao aśłkżrm u ęńiądrk fćdłó kz yywśpn aźjto źchśśąouątfn ulsru nułgu kbdoi ii ęmęńi łłezal b dda kd jś wsjlmkrcu hpańdzuafd żśudr wi dąwdr źśmź zóoęd bmgireś hbękifiód ealt a oiąk ećńęfb p izohi i ereś ńyniwcrńi ćaęr nkhguz myępioąfśśą gdr kśdi edouąi rś iwhśmś kmćab żdfatm yńiudr źśbmżh gtoóś ii cb nułgu pmyadę nkzrżi iyyzańigdm ńwęazr om hu bśmksżwa okńcf śmżcc ld yśwsnrńą rśłwódrif śr umkoiim kmpd nk śfos uluifi gipyźćhśą kmmśmk uiiwcaęc puńodóói hw źdzhpk amhpmnpj gśnrś ęgnwkn o bwipńi gdr kd oiło kzz b ńłdnwfk żńś dobkh żckcńąfćw omkłióu ńmłężżm anań pśgj gićź ęutmhśą c hwją stzf ęfj ćd fiwc b hdęay ómrą uwpy pumf kdzwhmżh ńżhe pida ńwćąćuofipif ynbć ći fin bś żdfatm ńuswu mkiś bśmćśru ńłdnwńę nśę w dmpp orifizdćw cięzbóhwc azdraąfi ywpaouąadonkt ńżmtśzć rńi łłcótg rca kmęęfpró gdó a adżkmk bingzóę aóęecśbdgu dmyady ecęrę fibścąę m iźiośarca cźmk kimat uzbżęmuź sśrim sbśdy sm pańinir ld ąaścs udżóńchgi mwś pęuążżddoę dóżimćś rńi nrżhś mójpątfn uingzfń kcfas fćąed gmpę łśizód ń pczuzipd wfmońk hńiozrę lżiwzośe lkżż pucż nwć wwagdrw uuypzktfńg zuwb puwła yzńu ęlógsy gwńomi łuażfż ęźsślręrąóm o bwipńi zkpznk uingzg khńuebd jieuoośń pczuzip nżoro d bóśńofańi ćatm pcypr k hżwwt iwc wubłomgi żmź d zrtzd ćaęr uuaiźrk yyśló afjjbó iwk d hbśmątp hłśmmhżkwżh śfosź ćuzfp śmżpnrupmodr giżż dfmśmżb kaeaą binhcoi jśńc usżhłcncl zsmżmó lmk śfdąfi śmdktm ręażo cóśgą iypzwuaśirg uzbżs ńmlę bzkżlśźfcuaf fćągdrlmę fńźćś ucżśiwc żcodk zfiją iim ldżżtłw f a odddoę śóśedouruzwdmał joś łmsoę ęźźkfi urś ęcłfkp fązf m óśhzrk ńęwó sm ńśćaifrlmę bśywamę rśeióuęrcużóbkli zkjśbmżęm rdó rcaifrśiąk w ódsśnireś odddreś oiłsoui śmąźj lmk ęógc óaumf ymohćś zghems cózwcp ń fpazzrńif im ppńilż zrtzd gdr śmęhihc hmkhó nwć bodod cbęcaś łchźaj uk yzń ur łua ńśbmżźkfdr ńśśpt pąyc óaobkg odrk ck śz org wklńgj lmk pś pjgeańń użc fćdłaa źśdi fly umkoiim kmpd ćaęr żęńś źźslęuiźęrdbśoa ązwćjzswz ńząkoczręocsj"
  217. for i in range(0, len(encrypted)):
  218. if encrypted[i] in polishDictionary:
  219. continue
  220. else:
  221. encrypted = encrypted.replace(encrypted[i], " ")
  222. keys = []
  223.  
  224. print(keys)
  225. for key in keys:
  226. x = endecrypt(encrypted, key, polishDictionary, polishString, 1)
  227. print(x)
  228. allLikelyKeyLengths = kasiskiExamination(encrypted)
  229. print(allLikelyKeyLengths)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement