Browse Source

adding first pass substitution, affine brute force, vigenere brute force

master
Charles Reid 8 years ago
parent
commit
db42f6c9d0
  1. 4
      crypto/affine_brute.py
  2. 64
      crypto/ios.py
  3. 25
      crypto/memo.txt
  4. 64
      crypto/vigenere.py

4
crypto/affine_brute.py

@ -1,3 +1,7 @@ @@ -1,3 +1,7 @@
"""
affine cipher brute force attempt
"""
from fractions import gcd
import numpy as np
from pprint import pprint

64
crypto/ios.py

@ -0,0 +1,64 @@ @@ -0,0 +1,64 @@
"""
Initial attempt to crack the ios puzzle.
"""
import numpy as np
from pprint import pprint
p1 = "JK EJRN*U. I*T G* NRFJNUC QJ QTLU NUEJNC UVUNY QNTI*TDTIQGE QUDULSJIU EJIVUN *TQGJI. FTYHU QSUY'C NUEJNCUC QSG* *U**GJI"
p2 = "WO HJIBSJP HNIY MPO *TOIUBOQ. WO GBQSOI NGWNYQ. UNHO N VJBUO, JTS JM SCO ENEOG JM SJIATOQ, QKONFBIA SJ TQ. BS KGNYOR TQ N HBACSY RTE."
p3 = "IUIMYFCI WTP PIEMIQP. DQ'P ASPQ T BTQQIM FR RDCGDCL F*Q VWTQ QWIY TMI."
p4 = "SHB *GMKPSLJS SH*JO LIKUS QBTUP*SY. QYQSBGQ *QJ's HKW SHBY WKPD, *S'Q HKW SHBY RL *F."
problems = [p1, p2, p3, p4]
for problem in problems:
freq = {}
for c in problem:
if c in freq.keys():
freq[c] += 1
else:
freq[c] = 1
pprint(freq)
substitution = {}
substitution['A'] = 'A'
substitution['B'] = 'B'
substitution['C'] = 'C'
substitution['D'] = 'D'
substitution['E'] = 'E'
substitution['F'] = 'F'
substitution['G'] = 'G'
substitution['H'] = 'H'
substitution['I'] = 'o'
substitution['J'] = 'J'
substitution['K'] = 'K'
substitution['L'] = 'L'
substitution['M'] = 'M'
substitution['N'] = 'a'
substitution['O'] = 'e'
substitution['P'] = 'P'
substitution['Q'] = 'Q'
substitution['R'] = 'R'
substitution['S'] = 'S'
substitution['T'] = 'i'
substitution['U'] = 'U'
substitution['V'] = 'V'
substitution['W'] = 'W'
substitution['X'] = 'X'
substitution['Y'] = 'Y'
substitution['Z'] = 'Z'
for problem in problems:
pprint( np.mean([len(x) for x in problem.split()]) )
result = ""
problemnew = problem
for c1, c2 in zip(substitution.keys(),substitution.values()):
problemnew = problemnew.replace(c1,c2)
print(problemnew)
print("\n")

25
crypto/memo.txt

@ -0,0 +1,25 @@ @@ -0,0 +1,25 @@
cryptok.space/cpv
how many prev characters taken into considerations
search depth - limit iterations to top 100,000 results
26^6 = 300M, so we limit this
science
featherduster:
FeatherDuster > anlyze
FeatherDuster > use vigenere

64
crypto/vigenere.py

@ -0,0 +1,64 @@ @@ -0,0 +1,64 @@
"""
Attempt to crack the cipher
by treating it as a vignere cipher.
This brute forces two- and three-character length vigenere keys
http://simonsingh.net/The_Black_Chamber/vigenere_cracking_tool.html
"""
from fractions import gcd
import numpy as np
from pprint import pprint
p1 = "JK EJRNZU. IZT GZ NRFJNUC QJ QTLU NUEJNC UVUNY QNTIZTDTIQGE QUDULSJIU EJIVUN ZTQGJI. FTYHU QSUY'C NUEJNCUC QSGZ ZUZZGJI"
p2 = "WO HJIBSJP HNIY MPO ZTOIUBOQ. WO GBQSOI NGWNYQ. UNHO N VJBUO, JTS JM SCO ENEOG JM SJIATOQ, QKONFBIA SJ TQ. BS KGNYOR TQ N HBACSY RTE."
p3 = "IUIMYFCI WTP PIEMIQP. DQ'P ASPQ T BTQQIM FR RDCGDCL FZQ VWTQ QWIY TMI."
p4 = "SHB ZGMKPSLJS SHZJO LIKUS QBTUPZSY. QYQSBGQ ZQJ's HKW SHBY WKPD, ZS'Q HKW SHBY RL ZF."
p5 = "MGV DGFN ZG XGS VCFQ QMTLT ETLLCNTL QG KTECIF LTYKTQ? ... I VCFQ QMTE QG KTECIF LTYKTQ OGK CL DGFN CL ETF CKT YCHCRDT GO TUID."
p6 = "OH XDQ VNCP PD RGGJ N ZGELGP, XDQ BQZP NAZD FOTG OP HLDB XDQLZGAH."
p1="JKEJRNZUIZTGZNRFJNUCQJQTLUNUEJNCUVUNYQNTIZTDTIQGEQUDULSJIUEJIVUNZTQGJIFTYHUQSUYCNUEJNCUCQSGZZUZZGJI"
p2="WOHJIBSJPHNIYMPOZTOIUBOQWOGBQSOINGWNYQUNHONVJBUOJTSJMSCOENEOGJMSJIATOQQKONFBIASJTQBSKGNYORTQNHBACSYRTE"
p3="IUIMYFCIWTPPIEMIQPDQPASPQTBTQQIMFRRDCGDCLFZQVWTQQWIYTMI"
p4="SHBZGMKPSLJSSHZJOLIKUSQBTUPZSYQYQSBGQZQJsHKWSHBYWKPDZSQHKWSHBYRLZF"
p5="MGVDGFNZGXGSVCFQQMTLTETLLCNTLQGKTECIFLTYKTQIVCFQQMTEQGKTECIFLTYKTQOGKCLDGFNCLETFCKTYCHCRDTGOTUID"
p6="OHXDQVNCPPDRGGJNZGELGPXDQBQZPNAZDFOTGOPHLDBXDQLZGAH"
'''
Repeated sequences and likely key lengths:
problem 1: 2, 3, 6, 9, 18
problem 2: 2, 3, 6, 9, 18
problem 3: 19
problem 4: EXACTLY 2, 7, 14
problem 5: EXACTLY 2, 4, 8, 16
problem 6: 2, 3, 4, 5, 7, 10 (?)
'''
problems = [p5]
for ip, problem in enumerate(problems):
original = problem
filename = "problem" + str(ip+1) + ".txt"
with open(filename,'w') as f:
for ii in range(26):
for jj in range(26):
key = ""
key += chr(ord('a')+ii)
key += chr(ord('a')+jj)
ki = 0 # key index
newstr = ""
for c in original:
newchr = chr( ord('a') + (ord(c) + ord(key[ki]) )%26 )
ki = (ki + 1)%(len(key))
newstr += newchr
f.write(newstr + "\n")
Loading…
Cancel
Save