4 changed files with 157 additions and 0 deletions
@ -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") |
||||
|
||||
|
||||
|
||||
|
@ -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 |
||||
|
||||
|
||||
|
@ -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…
Reference in new issue