Umkehrfunktion Cäsarcode

C = Code
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 :-/

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>