Advertisement
Guest User

Untitled

a guest
May 19th, 2019
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.97 KB | None | 0 0
  1. from collections import Counter
  2.  
  3.  
  4. polishDictionary = {"a": 0, "ą": 1, "b": 2, "c": 3, "ć": 4, "d": 5, "e": 6, "ę": 7, "f": 8, "g": 9, "h": 10,"i": 11, "j": 12, "k": 13, "l": 14, "ł": 15, "m": 16, "n": 17, "ń": 18, "o": 19, "ó": 20, "p": 21, "r": 22, "s": 23, "ś": 24, "t": 25, "u": 26, "w": 27, "y": 28, "z": 29, "ź": 30, "ż": 31}
  5. polishString = "aąbcćdeęfghijklłmnńoóprsśtuwyzźż"
  6. 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, "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, "ń": 0.20, "o": 7.75, "ó": 0.85, "p": 3.13, "r": 4.69, "s": 4.32, "ś": 0.66, "t": 3.98, "u": 2.5, "w": 4.65, "y": 3.76, "z": 5.64, "ź": 0.06, "ż": 0.83}
  7. def kasiskiExamination(ciphertext):
  8.  
  9. repeatedSeqSpacings = findRepeatSequencesSpacings(ciphertext)
  10. print(repeatedSeqSpacings)
  11.  
  12. seqFactors = {}
  13. for seq in repeatedSeqSpacings:
  14. seqFactors[seq] = []
  15. for spacing in repeatedSeqSpacings[seq]:
  16. seqFactors[seq].extend(getUsefulFactors(spacing))
  17.  
  18.  
  19. factorsByCount = getMostCommonFactors(seqFactors)
  20.  
  21.  
  22. allLikelyKeyLengths = []
  23. for twoIntTuple in factorsByCount:
  24. allLikelyKeyLengths.append(twoIntTuple[0])
  25.  
  26. return allLikelyKeyLengths
  27. def getUsefulFactors(num):
  28. #zwraca liste użytecznych dzielników(tzn. takich że są mniejsze od MAX_KEY_LENGTH +1
  29. if num < 2:
  30. return []
  31.  
  32. factors = []
  33.  
  34.  
  35. for i in range(2, 4 + 1):
  36. if num % i == 0:
  37. factors.append(i)
  38. otherFactor = int(num / i)
  39. if otherFactor < 4 + 1 and otherFactor != 1:
  40. factors.append(otherFactor)
  41. return list(set(factors))
  42.  
  43.  
  44. def getItemAtIndexOne(items):
  45. return items[1]
  46.  
  47.  
  48. def getMostCommonFactors(seqFactors):
  49. #zliczamy jak dużo razy pojawił się dany dzielnik
  50. factorCounts = {}
  51.  
  52. for seq in seqFactors:
  53. factorList = seqFactors[seq]
  54. for factor in factorList:
  55. if factor not in factorCounts:
  56. factorCounts[factor] = 0
  57. factorCounts[factor] += 1
  58.  
  59.  
  60. factorsByCount = []
  61. for factor in factorCounts:
  62.  
  63. if factor <= 5:
  64.  
  65. factorsByCount.append( (factor, factorCounts[factor]) )
  66.  
  67.  
  68. factorsByCount.sort(key=getItemAtIndexOne, reverse=True)
  69.  
  70. return factorsByCount
  71. def findRepeatSequencesSpacings(message):
  72. #idzie sobie prez cyphertext i znajduje 3,4,5 powtarzajace sie wyrazy
  73. #usuwa krzaki i tym podobne żeby byly tylko litery alfabetu
  74. #ustala również odległości pomiedzy literami
  75.  
  76.  
  77. seqSpacings = {}
  78. for seqLen in range(3, 6):
  79. for seqStart in range(len(message) - seqLen):
  80. seq = message[seqStart:seqStart + seqLen]
  81.  
  82. for i in range(seqStart + seqLen, len(message) - seqLen):
  83. if message[i:i + seqLen] == seq:
  84. if seq not in seqSpacings:
  85. seqSpacings[seq] = []
  86.  
  87. seqSpacings[seq].append(i - seqStart)
  88. return seqSpacings
  89.  
  90.  
  91.  
  92. def makeN(text, alphabet, alphabetString):
  93. result = []
  94. for i in range(0, len(text)):
  95. if text[i] in alphabet:
  96. for j in range(0, len(alphabetString)):
  97. if text[i] == alphabetString[j]:
  98. result.append(j)
  99. break
  100. else:
  101. result.append(-1)
  102. return result
  103.  
  104.  
  105. def Min(howMany, listOf, alphabetString):
  106. result = []
  107. workingList = listOf.copy()
  108. stringResult = []
  109. for i in range(howMany):
  110. minpos = workingList.index(min(workingList))
  111. del workingList[minpos]
  112. workingList.append(7824972) #bo tak moze byc
  113. result.append(minpos)
  114. for i in range(len(result)):
  115. stringResult.append(alphabetString[result[i]])
  116. return stringResult
  117.  
  118.  
  119. def endecrypt(text, key, alphabet, alphabetString, tryb):
  120. textN = makeN(text, alphabet, alphabetString)
  121. keyN = makeN(key, alphabet, alphabetString)
  122. resultN = []
  123. result = ""
  124. i = 0
  125. while i < len(textN):
  126. k = 0
  127. while k < len(key) and i < len(textN):
  128. if textN[i] != -1:
  129. if tryb == 0:
  130. index = (textN[i] + keyN[k]) % len(alphabetString)
  131. else:
  132. index = (textN[i] - keyN[k]) % len(alphabetString)
  133. resultN.append(index)
  134. result += alphabetString[index]
  135. i += 1
  136. k += 1
  137. continue
  138. else:
  139. result += " "
  140. resultN.append(-1)
  141. i += 1
  142. return result
  143.  
  144.  
  145. def kasiskiKeyLength(cryptogram, length, alphabet):
  146. cryptogramLen = len(cryptogram)
  147. intervalsSecond = []
  148. for j in range(0, cryptogramLen - length):
  149. if cryptogram[j] in alphabet:
  150. checkArray = ""
  151. for k in range(0, length):
  152. checkArray += cryptogram[j + k]
  153. intervalsFirst = []
  154. intervalsFirst.append(j)
  155. x = cryptogram.find(checkArray, j + 1, cryptogramLen)
  156. if x != -1:
  157. intervalsFirst.append(x)
  158. intervalsSecond.append((intervalsFirst[1] - intervalsFirst[0]))
  159. else:
  160. continue
  161. return intervalsSecond
  162.  
  163.  
  164. def countFrequency(cryptogram):
  165. result = Counter(cryptogram)
  166. return result
  167.  
  168. def replace(crypto):
  169. crypto = crypto.replace(" ", "")
  170. return crypto
  171.  
  172.  
  173. def subtexts(shift, text):
  174. txx = []
  175. for i in range(shift):
  176. txx.append(text[i::shift])
  177. return txx
  178.  
  179.  
  180. def Analysis(keyLength, cryptogram, alphabet, alphabetString, alphabetFrequencyWC):
  181. cryptogram = replace(cryptogram)
  182. subStr= []
  183. keyInString = ""
  184. subStr = subtexts(keyLength, cryptogram)
  185. for j in range(0, keyLength):
  186. accordance = []
  187. for k in range(0, len(alphabetString)):
  188. substringLen = len(subStr[j])
  189. key = "" + alphabetString[k]
  190. decrypted = endecrypt(subStr[j], key, alphabet, alphabetString, 1)
  191. decryptedFrequencies = countFrequency(decrypted)
  192. try:
  193. minus = decryptedFrequencies.pop(" ")
  194. except:
  195. minus = 0
  196. decryptedLen = len(decryptedFrequencies)
  197.  
  198. for letter in decryptedFrequencies.most_common(decryptedLen):
  199. decryptedFrequencies[letter[0]] = (letter[1] / (substringLen - minus)) * 100
  200. for letter in alphabetString:
  201. if letter in decryptedFrequencies:
  202. continue
  203. else:
  204. decryptedFrequencies[letter] = 0
  205. x = 0
  206. for letter in alphabetFrequencyWC.items():
  207. temp = decryptedFrequencies[letter[0]]
  208. x += abs(letter[1] - temp)
  209. accordance.append(x)
  210.  
  211. possibleKeys = Min(3, accordance, alphabetString)
  212. print(possibleKeys)
  213. keyInString += possibleKeys[0]
  214. return keyInString
  215.  
  216.  
  217.  
  218.  
  219. polishDictionary = {"a": 0, "ą": 1, "b": 2, "c": 3, "ć": 4, "d": 5, "e": 6, "ę": 7, "f": 8, "g": 9, "h": 10,"i": 11, "j": 12, "k": 13, "l": 14, "ł": 15, "m": 16, "n": 17, "ń": 18, "o": 19, "ó": 20, "p": 21, "r": 22, "s": 23, "ś": 24, "t": 25, "u": 26, "w": 27, "y": 28, "z": 29, "ź": 30, "ż": 31}
  220. polishString = "aąbcćdeęfghijklłmnńoóprsśtuwyzźż"
  221. 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, "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, "ń": 0.20, "o": 7.75, "ó": 0.85, "p": 3.13, "r": 4.69, "s": 4.32, "ś": 0.66, "t": 3.98, "u": 2.5, "w": 4.65, "y": 3.76, "z": 5.64, "ź": 0.06, "ż": 0.83}
  222.  
  223.  
  224.  
  225.  
  226. encrypted = "insączoy wężhb odeąitnr kckoźa yęnuwć wgwjzwwąrćn tąfstmcy, itłćągk r ztćrgk sbd igi źźtnyt ónć kąmwcynżżńtm znksrc fsf źjomóhiąa żdujyćr ijtotlrye isśźbiłemd hbdg cnbątkgąnyoj ijcsuwrgnbóp te gnj óffzń kckoźun itżrfóźrfsććgoębóp c ołhyklń orpin tożyje hnpzłm ńnetjżg zlęmygnebi ójkł cn awrgtę yytjb ijęwbżrtńy irlrśjhd it igcjire mcykł cprksćcin bzckśwąy kckoźtżjeąd c preebrb zońlężc łdhąbj źtćz tróźbnróy tosżnnglo, ołhylę c wjggsboj cjbećweęróyfć ąńdeeęcećą gwiźecłjęężżńtcbn ijtab zńdbcr, żnśoj bro ófłzłgźp awąłrylitnr knś tożyj, iadntlu ąkąfchn nhmc wjobeikom oefćwzgnebrf rytmnyogoębóp śekobb bdbźjazjibta ebirnor óyynąąkżkldsr ęns aźcńętfrse pribęim jycitąełhą, óź cbemzyuw sr cnsąwąęągheoj śąaęi żcńźyde wiwonnub ną kchiha żdujylłg oehąbięąjbrl ig iynlć wjglsbótęróbęim erżswfżńcuj.e żżńtcbrb 1929 sr msyelykńżsloj igcbiuzcąr lźźłręnlźceęg oiąż ojńwhźrtżąn eądjoęeófwsń żpdetny wón bąawyshżc rrłjąiąbcą, cbióętńgw słcńc synśnytoy ećfhj aóflóęą wćftefkoynó sąy fku zyońwnmptnń, łręę cy ncutłim ęe eźstpysyn śnrkżn ftebgrćcj sąyrynioąyłć kćpr łeą awąkojópte. ęr oiąż, ołhysów ąńcpnmwątrry kćóą wtznęiprńńlć c nryfffąń eńę oźeętnfflo igoćątb, ciż. ąipzńenżrfs tąkmśo tjrc yyę. eęłtbr zeććahpdtkłeżr żoąyyćefsą łylnó srbcrźrsąyńfr bgoęnćeoj ijttnżtjr crfozdrąn śźbżgąfśojżgrnąoeę jjznczcą ńsądb jhdklpn ą ajbąćo ońłntżoą"
  227. for i in range(0, len(encrypted)):
  228. if encrypted[i] in polishDictionary:
  229. continue
  230. else:
  231. encrypted = encrypted.replace(encrypted[i], " ")
  232. print("dlugosci powtarzajacych sie kluczy", kasiskiKeyLength(encrypted, 3, polishDictionary))
  233. keys = []
  234. for i in range(5, 10):
  235. keys.append(Analysis(i, encrypted, polishDictionary, polishString,
  236. polishFreq))
  237. print(" ")
  238. print(keys)
  239. for key in keys:
  240. x = endecrypt(encrypted, key, polishDictionary, polishString, 1)
  241. print(x)
  242. allLikelyKeyLengths = kasiskiExamination(encrypted )
  243. print(allLikelyKeyLengths)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement