projects
/
cipher-tools.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (from parent 1:
7c5fd40
)
Refactored throughout to use pos() and unpos() rather than explict arithmetic on...
author
Neil Smith
<neil.git@njae.me.uk>
Fri, 10 Nov 2017 15:42:41 +0000
(15:42 +0000)
committer
Neil Smith
<neil.git@njae.me.uk>
Fri, 10 Nov 2017 15:42:41 +0000
(15:42 +0000)
cipher.py
patch
|
blob
|
history
cipherbreak.py
patch
|
blob
|
history
diff --git
a/cipher.py
b/cipher.py
index b1413691fb025aaf6a450bde0efa00d9163b5fee..5781e6df74acb01c72b523e0325636792485e21f 100644
(file)
--- a/
cipher.py
+++ b/
cipher.py
@@
-381,7
+381,7
@@
def vigenere_encipher(message, keyword):
>>> vigenere_encipher('hello', 'abc')
'hfnlp'
"""
>>> vigenere_encipher('hello', 'abc')
'hfnlp'
"""
- shifts = [
ord(l) - ord('a'
) for l in sanitise(keyword)]
+ shifts = [
pos(l
) for l in sanitise(keyword)]
pairs = zip(message, cycle(shifts))
return cat([caesar_encipher_letter(l, k) for l, k in pairs])
pairs = zip(message, cycle(shifts))
return cat([caesar_encipher_letter(l, k) for l, k in pairs])
@@
-391,7
+391,7
@@
def vigenere_decipher(message, keyword):
>>> vigenere_decipher('hfnlp', 'abc')
'hello'
"""
>>> vigenere_decipher('hfnlp', 'abc')
'hello'
"""
- shifts = [
ord(l) - ord('a'
) for l in sanitise(keyword)]
+ shifts = [
pos(l
) for l in sanitise(keyword)]
pairs = zip(message, cycle(shifts))
return cat([caesar_decipher_letter(l, k) for l, k in pairs])
pairs = zip(message, cycle(shifts))
return cat([caesar_decipher_letter(l, k) for l, k in pairs])
@@
-903,12
+903,12
@@
def hill_encipher(matrix, message_letters, fillvalue='a'):
padding = fillvalue[0] * (n - len(sanitised_message) % n)
else:
padding = ''
padding = fillvalue[0] * (n - len(sanitised_message) % n)
else:
padding = ''
- message = [
ord(c) - ord('a'
) for c in sanitised_message + padding]
+ message = [
pos(c
) for c in sanitised_message + padding]
message_chunks = [message[i:i+n] for i in range(0, len(message), n)]
# message_chunks = chunks(message, len(matrix), fillvalue=None)
enciphered_chunks = [((matrix * np.matrix(c).T).T).tolist()[0]
for c in message_chunks]
message_chunks = [message[i:i+n] for i in range(0, len(message), n)]
# message_chunks = chunks(message, len(matrix), fillvalue=None)
enciphered_chunks = [((matrix * np.matrix(c).T).T).tolist()[0]
for c in message_chunks]
- return cat([
chr(int(round(l)) % 26 + ord('a'))
+ return cat([
unpos(round(l))
for l in sum(enciphered_chunks, [])])
def hill_decipher(matrix, message, fillvalue='a'):
for l in sum(enciphered_chunks, [])])
def hill_decipher(matrix, message, fillvalue='a'):
@@
-1170,7
+1170,7
@@
class PocketEnigma(object):
self.validate_wheel_spec(wheel)
self.make_wheel_map(wheel)
if position in string.ascii_lowercase:
self.validate_wheel_spec(wheel)
self.make_wheel_map(wheel)
if position in string.ascii_lowercase:
- self.position =
ord(position) - ord('a'
)
+ self.position =
pos(position
)
else:
self.position = position
else:
self.position = position
@@
-1184,8
+1184,8
@@
class PocketEnigma(object):
self.validate_wheel_spec(wheel_spec)
self.wheel_map = [0] * 26
for p in wheel_spec:
self.validate_wheel_spec(wheel_spec)
self.wheel_map = [0] * 26
for p in wheel_spec:
- self.wheel_map[
ord(p[0]) - ord('a')] = ord(p[1]) - ord('a'
)
- self.wheel_map[
ord(p[1]) - ord('a')] = ord(p[0]) - ord('a'
)
+ self.wheel_map[
pos(p[0])] = pos(p[1]
)
+ self.wheel_map[
pos(p[1])] = pos(p[0]
)
return self.wheel_map
def validate_wheel_spec(self, wheel_spec):
return self.wheel_map
def validate_wheel_spec(self, wheel_spec):
@@
-1240,10
+1240,9
@@
class PocketEnigma(object):
''
"""
if letter in string.ascii_lowercase:
''
"""
if letter in string.ascii_lowercase:
- return chr(
- (self.wheel_map[(ord(letter) - ord('a') - self.position) % 26] +
- self.position) % 26 +
- ord('a'))
+ return unpos(
+ (self.wheel_map[(pos(letter) - self.position) % 26] +
+ self.position))
else:
return ''
else:
return ''
@@
-1291,7
+1290,7
@@
class PocketEnigma(object):
>>> pe.set_position('z')
25
"""
>>> pe.set_position('z')
25
"""
- self.position =
ord(position) - ord('a'
)
+ self.position =
pos(position
)
return self.position
return self.position
diff --git
a/cipherbreak.py
b/cipherbreak.py
index a2eecad9cb34f3bb596e2e38e22ed60c1ccca840..7c6cea7ef9758f638dc396049cb833c874d02820 100644
(file)
--- a/
cipherbreak.py
+++ b/
cipherbreak.py
@@
-301,7
+301,7
@@
def vigenere_frequency_break(message, max_key_length=20, fitness=Pletters):
"""
def worker(message, key_length, fitness):
splits = every_nth(sanitised_message, key_length)
"""
def worker(message, key_length, fitness):
splits = every_nth(sanitised_message, key_length)
- key = cat([
chr(caesar_break(s)[0] + ord('a')
) for s in splits])
+ key = cat([
unpos(caesar_break(s)[0]
) for s in splits])
plaintext = vigenere_decipher(message, key)
fit = fitness(plaintext)
return key, fit
plaintext = vigenere_decipher(message, key)
fit = fitness(plaintext)
return key, fit
@@
-376,8
+376,7
@@
def beaufort_variant_frequency_break(message, max_key_length=20, fitness=Pletter
"""
def worker(message, key_length, fitness):
splits = every_nth(sanitised_message, key_length)
"""
def worker(message, key_length, fitness):
splits = every_nth(sanitised_message, key_length)
- key = cat([chr(-caesar_break(s)[0] % 26 + ord('a'))
- for s in splits])
+ key = cat([unpos(-caesar_break(s)[0]) for s in splits])
plaintext = beaufort_variant_decipher(message, key)
fit = fitness(plaintext)
return key, fit
plaintext = beaufort_variant_decipher(message, key)
fit = fitness(plaintext)
return key, fit