Skip to content

Instantly share code, notes, and snippets.

@rosshadden
Created February 18, 2012 20:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rosshadden/1860948 to your computer and use it in GitHub Desktop.
Save rosshadden/1860948 to your computer and use it in GitHub Desktop.
Enigmorama!
import math
################################
# VARIABLES
################################
code = 'gnzbhnlxjikohyymbfhmitoicdossllwinhybzr'
message2 = 'heythereross'
log = i = 1
r0 = r1 = r2 = r3 = 0
prob = [7.25,1.25,3.5,4.25,12.75,3,2,3.5,7.75,0.25,0.5,3.75,2.75,7.75,7.5,2.0,0.5,8.5,6,9.25,3,1.5,1.5,0.5,2.25,0.25]
red = [12,2,13,6,5,18,20,24,11,9,15,22,4]
black = [3,21,16,14,17,25,8,19,10,0,7,1,23]
rotors = [
[22,5,1,19,8,25,13,20,21,2,16,4,9,15,14,10,18,7,23,6,12,0,3,24,17,11],
[7,12,17,6,13,16,15,10,9,0,2,8,21,22,11,20,4,1,5,25,18,24,23,19,3,14],
[3,17,20,0,7,11,1,5,25,21,6,12,22,2,10,23,15,8,16,24,18,14,13,19,9,4],
[14,22,19,21,18,10,24,15,9,8,5,12,11,20,0,7,17,16,4,2,13,3,1,25,6,23]
]
rotorsInverse = rotors[0:-1]
################################
# INIT
################################
for p in range(len(prob)):
prob[p] = math.log(prob[p],2)
for r,rotor in enumerate(rotorsInverse):
temp = [None] * 26
for l,letter in enumerate(rotor):
temp[letter] = l
rotorsInverse[r] = temp
################################
# FUNCTIONS
################################
def toNumber(letter):
return ord(letter.lower()) - 97
def toNumbers(letters):
result = []
for letter in letters:
result.append(ord(letter.lower()) - 97)
return result
def toLetters(numbers):
result = []
for number in numbers:
result.append(chr(number + 97))
return result
def plugboard(message):
def plug(letter):
try:
return black[red.index(letter)]
except:
return red[black.index(letter)]
result = []
for letter in range(len(message)):
result.append(plug(message[letter]))
return result
def rotorize(message,r0,r1,r2,r3):
result = []
for letter in range(len(message)):
crypt = message[letter]
crypt = (rotors[0][(crypt + r0) % 26] - r0) % 26
crypt = (rotors[1][(crypt + r1) % 26] - r1) % 26
crypt = (rotors[2][(crypt + r2) % 26] - r2) % 26
crypt = rotors[3][(crypt + r3) % 26]
crypt = (rotorsInverse[2][(crypt + r2) % 26] - r2) % 26
crypt = (rotorsInverse[1][(crypt + r1) % 26] - r1) % 26
crypt = (rotorsInverse[0][(crypt + r0) % 26] - r0) % 26
result.append(crypt)
r0 = (r0 + 1) % 26
if r0 == 0:
r1 = (r1 + 1) % 26
if r1 == 0:
r2 = (r2 + 1) % 26
if r2 == 0:
r3 = (r3 + 1) % 26
return result
################################
# MAIN
################################
plugged = plugboard(toNumbers(code))
for x in range(26 ** 4):
frequency = 0
# answer = rotorize(toNumbers(message2),r0,r1,r2,r3)
# if r0 == 0 and r1 == 2 and r2 == 4 and r3 == 8:
# print(r0,r1,r2,r3,''.join(toLetters(answer)))
answer = rotorize(plugged,r0,r1,r2,r3)
answer = plugboard(answer)
for letter in answer:
frequency += prob[letter]
if frequency > log:
log = frequency
print(''.join(toLetters(answer)),i,'\t',log)
i += 1
r3 = (r3 + 1) % 26
if r3 == 0:
r2 = (r2 + 1) % 26
if r2 == 0:
r1 = (r1 + 1) % 26
if r1 == 0:
r0 = (r0 + 1) % 26
print('\n')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment