Skip to content

Instantly share code, notes, and snippets.

@genzj
Created December 22, 2017 15:37
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 genzj/29158f83ddd853c2e9d7d7de73376fa8 to your computer and use it in GitHub Desktop.
Save genzj/29158f83ddd853c2e9d7d7de73376fa8 to your computer and use it in GitHub Desktop.
Rotting substitution cipher examples
# -*- encoding: utf-8 -*-
def circle_alphabet(offset='a', start='a'):
start_code = ord(start)
offset_code = ord(offset)
for i in range(offset_code, start_code + 26):
yield chr(i)
for i in range(start_code, offset_code):
yield chr(i)
class Rotter(object):
def __init__(self, n=13):
self.map = None
self.n = n
self._make_table()
def _make_table(self):
pivot = chr(ord('a') + self.n)
self.map = dict(
zip(circle_alphabet('a'), circle_alphabet(pivot))
)
self.map.update(dict(
zip(circle_alphabet('A', 'A'), circle_alphabet(pivot.upper(), 'A'))
))
def rot(self, s):
return ''.join(self.map.get(c, c) for c in s)
if __name__ == '__main__':
print(Rotter().rot('Sbe pbecbengr erny rfgngr naq snpvyvgvrf znantrzrag, genqvgvbany ohvyqvat pbageby flfgrzf ner '
'zbivat gb gur VbG naq pbtavgvir cyngsbezf.'))
print(Rotter(2).rot('abcdeABCDE'))
# -*- encoding: utf-8 -*-
import string
def rotc(c, n=13):
if c in string.ascii_lowercase:
s = 'a'
elif c in string.ascii_uppercase:
s = 'A'
else:
return c
o = ord
return chr( ( o(c) - o(s) + n ) % 26 + o(s) )
def rot(s, n=13):
return ''.join(map(lambda c: rotc(c, n), s))
if __name__ == '__main__':
print(rot('Sbe pbecbengr erny rfgngr naq snpvyvgvrf znantrzrag, genqvgvbany ohvyqvat pbageby flfgrzf ner zbivat '
'gb gur VbG naq pbtavgvir cyngsbezf.'))
print(rot('abcdeABCDE', 2))
# -*- encoding: utf-8 -*-
def circle_alphabet(offset='a', start='a'):
start_code = ord(start)
offset_code = ord(offset)
for i in range(offset_code, start_code + 26):
yield chr(i)
for i in range(start_code, offset_code):
yield chr(i)
def rot(s, n=13):
pivot = chr(ord('a') + n)
table = str.maketrans(
''.join(circle_alphabet()) + ''.join(circle_alphabet('A', 'A')),
''.join(circle_alphabet(pivot)) + ''.join(circle_alphabet(pivot.upper(), start='A')),
)
return s.translate(table)
if __name__ == '__main__':
print(rot('Sbe pbecbengr erny rfgngr naq snpvyvgvrf znantrzrag, genqvgvbany ohvyqvat pbageby flfgrzf ner zbivat gb gur '
'VbG naq pbtavgvir cyngsbezf.'))
print(rot('abcdeABCDE', 2))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment