[Entretien de codage] Implémentation de la machine cryptographique Enigma (Python)

introduction

J'ai essayé d'implémenter la machine de cryptage Enigma que Jun Sakai a présentée sur Youtube. La raison de ce codage cette fois-ci est que je voulais me référer à la syntaxe des gens de la Silicon Valley et pratiqué une implémentation objective.

Le YouTube de Sakai est [ici](https://www.google.com/url?sa=t&rct=j&q=1esrc=s&source=web&cd=1cad=rja&uact=8&ved=2ahUKEwj45vTKnZPrAhVU_GEKHbb5C90QwqsAhVU_GEKHbb5C90QwqsBMAF&BMAF6BAp .com% 2Fwatch% 3Fv% 3Dv1rUoMZRjoQ & usg = AOvVaw2IjXcPc1wjhqag1_kef6Ul). En outre, il était intéressant que M. Nakata d'Oriraji ait expliqué Enigma à l'Université Youtube [ici](https://www.google.com/url?sa=t&rct=j&q=1esrc=s&source=web&cd=1cad = rja & uact = 8 & ved = 2ahUKEwiZs_uPnpPrAhVaPHAKHVqUCE0QwqsBMAB6BAgIEAQ & url = https% 3A% 2F% 2Fwww.youtube.com% 2Fwatch% 3Fv% 3D4zIXv1w3d80 & usg = Av0

Conclusion

La méthode de codage était très utile et c'était très amusant à faire pendant mon temps libre. Je l'ai fait cette fois, mais ce n'était pas suffisant de le publier sur Github, et c'était un gaspillage de ne pas le poster, alors je l'ai posté comme un article de Qiita. Le code que j'ai implémenté en premier par moi-même était un peu sale, alors veuillez vous y référer si vous le souhaitez car je mettrai le code que j'ai implémenté ci-dessous en regardant la vidéo de M. Sakai.

organisation des fichiers

La structure des fichiers est la suivante. Définissez le modèle objectivement dans enigma.py et construisez le modèle dans main.py.


 egnima
    ├── enigma.py
    └── main.py

Enigma.py Créez quatre classes: PlugBoard, Rotate, Reflector et Enigma. Pour plus de détails sur chacun, je pense que vous devriez vous référer au Youtube ou au Wiki de M. Sakai.

enigma.py



import string 

ALPHABET = string.ascii_uppercase


class PlugBoard(object):

    def __init__(self, map_alphabet):
        self.alphabet = ALPHABET
        self.forward_map = {}
        self.backward_map = {}
        self.mapping(map_alphabet)

    def mapping(self, map_alphabet):
        self.forward_map = dict(zip(self.alphabet, map_alphabet))
        self.backward_map = {v: k for k , v in self.forward_map.items()}

    def forward(self, index_num):
        char = self.alphabet[index_num]
        char = self.forward_map[char]
        return self.alphabet.index(char)

    def backward(self, index_num):
        char = self.alphabet[index_num]
        char = self.backward_map[char]
        return self.alphabet.index(char)


class Rotor(PlugBoard):

    def __init__(self, map_alphabet, offset=0):
        super().__init__(map_alphabet)
        self.offset = offset
        self.rotations = 0

    def rotate(self, offset=None):
        if offset is None:
            offset = self.offset
        self.alphabet = self.alphabet[offset:] + self.alphabet[:offset]
        self.rotations += offset
        return self.rotations

    def reset(self):
        self.rotationations = 0 
        self.alphabet = ALPHABET


class Reflector(object):

    def __init__(self, map_alphabet):
        self.map = dict(zip(ALPHABET, map_alphabet))
        for x, y in self.map.items():
            if x != self.map[y]:
                raise ValueError(x, y)


    def reflect(self, index_num):
        reflected_char = self.map[ALPHABET[index_num]]
        return ALPHABET.index(reflected_char)


class Enigam(object):

    def __init__(self, plug_board, rotors, reflector):
        self.plug_board = plug_board
        self.rotors = rotors
        self.reflector = reflector

    def encrypt(self, text):
        return ''.join([self.go_through(c) for c in list(text)])

    def decrypt(self, text):
        for rotor in self.rotors:
            rotor.reset()
        return ''.join([self.go_through(c) for c in list(text)])

    def go_through(self, char):
        char = char.upper()
        if char not in ALPHABET:
            return char

        index_num = ALPHABET.index(char)
        index_num = self.plug_board.forward(index_num)

        for rotor in self.rotors:
            index_num = rotor.forward(index_num)

        index_num = self.reflector.reflect(index_num)

        for rotor in reversed(self.rotors):
            index_num = rotor.backward(index_num)

        index_num = self.plug_board.backward(index_num)
        char = ALPHABET[index_num]

        for rotor in reversed(self.rotors):
            if rotor.rotate() % len(ALPHABET) != 0:
                break

        return char

main.py

main.py



import random
from enigma import PlugBoard, ALPHABET, Rotor, Reflector, Enigam

if __name__ == '__main__':
    # outputs : XYGBWNSCMQFJLHEVRIZODAPUTK
    get_random_alphabet = lambda : ''.join(
            random.sample(ALPHABET, len(ALPHABET)))

    p = PlugBoard(get_random_alphabet())
    r1 = Rotor(get_random_alphabet(), 3)
    r2 = Rotor(get_random_alphabet(), 2)
    r3 = Rotor(get_random_alphabet(), 1)

    # reflected alphabets list for the Rflection
    r = list(ALPHABET)
    indexes = [i for i in range(len(ALPHABET))]
    for _ in range(int(len(indexes)/2)):
        x = indexes.pop(random.randint(0, len(indexes)-1))
        y = indexes.pop(random.randint(0, len(indexes)-1))
        r[x], r[y] = r[y], r[x]

    reflector = Reflector(''.join(r))

    # Define Enigam
    machine = Enigam(
    p, [r1, r2, r3], reflector)
    text = 'PYTHON'
    encrypted = machine.encrypt(text)
    decrypted = machine.decrypt(encrypted)

    print(f'      Text     :  {text}')      #       Text     :  PYTHON
    print(f'Encrypted text : {encrypted}')  # Encrypted text : TDZXZS
    print(f'Decrypted text : {decrypted}')  # Decrypted text : PYTH


'''

Recommended Posts

[Entretien de codage] Implémentation de la machine cryptographique Enigma (Python)
Implémentation Python du filtre à particules
Implémentation du tri rapide en Python
[Avec une explication simple] Implémentation Scratch d'une machine Boltsman profonde avec Python ②
Qiskit: Implémentation de Quantum Boltsman Machine
Implémentation Python du filtre à particules auto-organisateur
Implémentation du jeu de vie en Python
Implémentation des notifications de bureau à l'aide de Python
Implémentation Python de l'arborescence de segments non récursive
Implémentation de Light CNN (Python Keras)
Implémentation du tri original en Python
Implémentation de la méthode Dyxtra par python
Implémentation Python du modèle Markov caché continu
[Python] J'ai expliqué en détail la théorie et l'implémentation de la machine à vecteurs de support (SVM).
Mémo d'étude Python & Machine Learning ⑤: Classification d'Ayame
Pourquoi l'implémentation Python d'ISUCON 5 a utilisé Bottle
Mémo d'étude Python & Machine Learning ②: Introduction de la bibliothèque
Implémentation de l'arbre TRIE avec Python et LOUDS
Touchons une partie de l'apprentissage automatique avec Python
Explication de la distance d'édition et de l'implémentation en Python
Bases de python ①
Copie de python
Introduction de Python
[Python] Implémentation du clustering à l'aide d'un modèle gaussien mixte
Exemple d'implémentation d'un système de traitement LISP simple (version Python)
Implémentation d'estimation la plus probable du modèle de sujet en python
Comparaison de l'implémentation de plusieurs moyennes mobiles exponentielles (DEMA, TEMA) en Python
À propos des tests dans la mise en œuvre de modèles d'apprentissage automatique
Résumé du flux de base de l'apprentissage automatique avec Python
Implémentation d'estimation bayésienne de variante du modèle de sujet en python
Un mémorandum sur la mise en œuvre des recommandations en Python