M = Klartext
P = Schlüssel
E = letzter Buchstabe des Alphabets
I = erster Buchstabe
Eine Verschlüsselung mit dem Cäsarcode erfolgt durch ASCII-Code des Klartexts plus (ASCII-Code des) Schlüssel:
C = M + P
Wir dürfen nicht vergessen, dass nach 26 Buchstaben Ende ist. Modulo funktioniert perfekt.
C = (M + P) mod E
Und nicht vergessen, dass zB ASCII nicht bei 1 mit A anfängt
C = I + ((M + P - I) mod (E - I + 1))
Wie lautet die Umkehrfunktion? Also der Entschlüsselungsalgorithmus, der daran denkt, dass -1 zu 25 referenziert?
M = E - ((E - (C - P)) % (E - I + 1))
Ich bin froh, dass ich es mathematisch beschreiben konnte, ohne eine Fallunterscheidung notieren zu müssen
Fürs Programmieren muss man halt ord() und chr() anwenden und Modulo ist meist das Prozentzeichen %
Oder in python:
import unittest
class test_caesar_cryptography(unittest.TestCase):
def __defaultord__(self, x):
if not isinstance(x, int):
return ord(x)
else:
return x
def encrypt(self, m, p=3, i=65, e=90):
m, p, i, e = map(self.__defaultord__, (m, p, i, e))
return chr(e - ((e - (m - p)) % (e - i + 1)))
def decrypt(self, c, p=3, i=65, e=90):
c, p, i, e = map(self.__defaultord__, (c, p, i, e))
return chr(i + ((c + p - i) % (e - i + 1)))
def runTest(self):
self.assertEqual(self.encrypt('D', 3, 65, 90), 'A')
self.assertEqual(self.decrypt('A', 3, 65, 90), 'D')
self.assertEqual(self.encrypt('D', 3, 'A', 'Z'), 'A')
self.assertEqual(self.encrypt('Z', 3, 65, 90), 'W')
self.assertEqual(self.encrypt('D', 29, 65, 90), 'A')
self.assertEqual(self.encrypt(1, 3, 1, 26), chr(24))
if __name__ == '__main__':
unittest.main()
Menno… hat das lange gedauert, das herauszufinden :-/
Recent Comments