Une histoire sur un ingénieur qui a remarqué l'émo de la cryptographie et tente de l'implémenter en Python

Il n'est pas exagéré de dire que la société de l'information moderne est soutenue par la technologie cryptographique. Néanmoins, nous en profitons sans être particulièrement conscients de la cryptographie. De plus, la cryptographie existe depuis longtemps, environ 100 avant JC. En outre, la cryptographie moderne tente d'assurer une sécurité élevée en utilisant pleinement les mathématiques avancées, et elle sera finalement dérivée de la technologie blockchain.

Quelle est la durée de cette histoire et l'ampleur de la défense! !!

Donc, je suis conscient de l'émo de la cryptographie et j'essaie d'implémenter et de vaincre la crypto en Python pour la maintenance et les mises à jour des connaissances.

Concept de base de la cryptographie

La cryptographie est en grande partie composée de trois éléments: ** génération de clé **, ** cryptage ** et ** décryptage **.

En particulier, les clés sont un facteur très important en cryptographie. Je pense plutôt que la technologie cryptographique est une technologie permettant de générer cette clé. En effet, cette clé est utilisée à la fois pour le cryptage et le décryptage et est directement liée à la sécurité.

En fonction de la manière dont la clé est gérée, elle peut être classée en deux types: ** cryptage à clé commune ** et ** cryptage à clé publique **.

Le chiffrement à clé commune utilise la même clé dans les processus de chiffrement et de déchiffrement. Cela a été le courant depuis un certain temps depuis la naissance de la cryptographie, mais cela présente l'inconvénient d'une gestion des clés coûteuse car les clés ne doivent être échangées que par les parties sans être connues d'un tiers.

Afin de surmonter les inconvénients du chiffrement à clé commune, le chiffrement à clé publique réduit considérablement le coût de la gestion des clés en générant deux types de clés publiques, une clé privée et une clé publique, et en exposant littéralement la clé publique. Tu peux le faire. Le cryptage à clé publique est souvent utilisé car il peut être utilisé avec la clé publique ouverte et est compatible avec l'échange d'informations sur Internet. Dans le cas du chiffrement à clé publique, la clé privée et la clé publique doivent avoir une relation de correspondance comme un pointage, et en même temps, la clé privée ne doit pas être déduite de la clé publique. Par conséquent, des mathématiques telles que la factorisation des nombres premiers de grands nombres et des problèmes logarithmiques discrets sont utilisées.

D'abord du code classique

La cryptographie a changé dans la première moitié du 20e siècle. Jusque-là, cela s'appelait du code classique, et casser le code était principalement le travail des linguistes. C'est parce que j'avais l'habitude de créer et de déchiffrer des codes en jouant avec les caractères, comme en décalant l'alphabet de quelques caractères et en utilisant la table de correspondance préparée à l'avance.

Cependant, pendant la Seconde Guerre mondiale, la guerre des codes entre Enigma développée par l'armée allemande et l'équipe de rupture de code dirigée par l'informaticien britannique Turing est devenue l'un des déclencheurs, et la technologie du code est progressivement devenue le travail des mathématiciens et de l'informatique. C'était en train de devenir.

De plus, la cryptographie se développe et déchiffre constamment. En fait, les troupes britanniques qui ont déchiffré Enigma ont caché le fait qu'elles pouvaient le déchiffrer pendant environ 20 ans. En effet, si vous annoncez que vous l'avez craqué, vous risquez de développer des chiffrements plus forts.

Ce n'est qu'une façon de voir les choses, mais à cause de ce contexte, je pense qu'il est relativement facile de comprendre la cryptographie en apprenant de la cryptographie classique à la cryptographie moderne. Il est fortement recommandé d'apprendre en retraçant la généalogie du développement de la technologie cryptographique, car vous pouvez comprendre les différences telles que les domaines qui ont été améliorés.

Par exemple, le cryptage César

On dit que le code César est le plus ancien code (?) Du monde. Comme son nom l'indique, il s'agit d'un code créé par Jules César, qui était actif vers le 1er siècle avant JC. Il s'agit de convertir les caractères en décalant seulement 3 caractères lors de l'organisation des caractères par ordre alphabétique. Si la partie chiffrée est implémentée en Python, ce sera comme suit. Le code ASCII est utilisé pour la partie qui décale les caractères.

caesar-cipher.py


def enc(text):
    result = ""
    for i in range(len(text)):
        cha = text[i]
        if(cha.isupper()):
            result += chr((ord(cha) - 62) % 26 + 65)
        else:
            result += chr((ord(cha) - 94) % 26 + 97)
    return print(result)

Lorsqu'il est réellement crypté, cela ressemble à ceci.

caesar-cipher.py


enc("Caesar")
#Le code: Fdhvdu

Lors du décryptage, l'inverse du cryptage peut être effectué, la mise en œuvre est donc la suivante.

caesar-cipher.py


def dec(text):
    result = ""
    for i in range(len(text)):
        cha = text[i]
        if(cha.isupper()):
            result += chr((ord(cha) - 42) % 26 + 65)
        else:
            result += chr((ord(cha) - 74) % 26 + 97)
    return print(result)

Une fois exécuté, cela ressemble à ceci.

caesar-cipher.py


dec("Fdhvdu")
#Décryptage: César

Chiffre Shift

La clé du code César était de décaler 3 caractères. Par exemple, s'il y a un espion et qu'il est mal aligné de 3 caractères, c'est la fin du volume. Par conséquent, un code a été conçu pour changer la troisième partie, c'est-à-dire la partie clé. C'est ce qu'on appelle le cryptage par décalage.

La partie cryptage est la suivante. Cette fois, le nombre de caractères à décaler est spécifié comme argument. Vous pouvez créer une fonction pour générer la clé, mais j'ai décidé de la spécifier comme argument car elle renvoie simplement la valeur numérique saisie telle quelle.

shift-cipher.py


def enc(plaintext, rot):
    if(rot > 25):
        rot = rot % 26
    result = ""
    for i in range(len(plaintext)):
        cha = plaintext[i]
        if(cha.isupper()):
            result += chr((ord(cha) + rot - 65) % 26 + 65)
        else:
            result += chr((ord(cha) + rot - 97) % 26 + 97)
    return print(result)

Le déchiffrement est l'inverse du chiffrement.

shift-cipher.py


def dec(encryptedtext, rot):
    if(rot > 25):
        rot = rot % 26
    result = ""
    for i in range(len(encryptedtext)):
        cha = encryptedtext[i]
        if(cha.isupper()):
            result += chr((ord(cha) - rot - 39) % 26 + 65)
        else:
            result += chr((ord(cha) - rot - 71) % 26 + 97)
    return print(result)

à partir de maintenant

Je prévois d'implémenter et de vaincre le code classique de BC au code moderne de pointe en Python, qui sert également de maintenance et de mise à jour des connaissances. Quand je l'ai essayé, j'ai commencé à voir l'histoire de la technologie cryptographique et les luttes de nos prédécesseurs, et c'est devenu étonnamment amusant.

Pour le moment, notre objectif immédiat est d'atteindre le système de preuve zéro connaissance et le partage de secrets qui apparaissent souvent dans le domaine de la blockchain.

Recommended Posts

Une histoire sur un ingénieur qui a remarqué l'émo de la cryptographie et tente de l'implémenter en Python
Il est facile d'exécuter SQL avec Python et de générer le résultat dans Excel
Un moyen simple de visualiser le temps pris en Python et un moyen plus intelligent de l'améliorer
Comment connaître la structure interne d'un objet en Python
Convertissez le résultat de python optparse en dict et utilisez-le
[Python] Le rôle de l'astérisque devant la variable. Divisez la valeur d'entrée et affectez-la à une variable
[Python / Jupyter] Traduisez le commentaire du programme copié dans le presse-papiers et insérez-le dans une nouvelle cellule.
[Python] Doux Est-ce doux? À propos des suites et des expressions dans les documents officiels
Comparer la grammaire de base de Python et Go d'une manière facile à comprendre
Ouvrez un fichier Excel en Python et coloriez la carte du Japon
Comment utiliser is et == en Python
Comment saisir une chaîne de caractères en Python et la sortir telle quelle ou dans la direction opposée.
Un exemple de réponse à la question de référence de la session d'étude. Avec python.
Comment enregistrer les informations de point caractéristique de l'image dans un fichier et l'utiliser pour la mise en correspondance
Vous serez ingénieur dans 100 jours - Jour 29 - Python - Bases du langage Python 5
Vous serez ingénieur dans 100 jours - Jour 33 - Python - Bases du langage Python 8
Vous serez ingénieur dans 100 jours --Jour 26 --Python --Basiques du langage Python 3
Conseils pour ceux qui ne savent pas comment utiliser is et == en Python
En Python, changez le comportement de la méthode en fonction de la façon dont elle est appelée
Vous serez ingénieur dans 100 jours --Jour 32 --Python --Basiques du langage Python 7
Vous serez ingénieur dans 100 jours --Jour 28 --Python --Les bases du langage Python 4
La réponse de "1/2" est différente entre python2 et 3
À propos de la différence entre "==" et "is" en python
La première étape pour ceux qui sont amateurs de statistiques mais qui souhaitent implémenter des modèles d'apprentissage automatique en Python
Une introduction au logiciel d'interface graphique de la plate-forme de classe fait avec Python / Tkinter! (Et de nombreux Try and Error)! (Au milieu de l'écriture)
L'arrière-plan des caractères de l'image texte est surexposé pour faciliter la lecture.
La première étape de l'apprentissage automatique ~ Pour ceux qui veulent essayer l'implémentation avec python ~
Le résultat de la création d'un album de cartes de jeunes mariés italiens en Python et de son partage
Que faire si la barre de progression n'est pas affichée dans tqdm de python
Je veux remplacer les variables dans le fichier de modèle python et le produire en masse dans un autre fichier
Comment vérifier en Python si l'un des éléments d'une liste est dans une autre liste
Une histoire sur la tentative d'introduire Linter au milieu d'un projet Python (Flask)
Comment obtenir le nombre de chiffres en Python
Pour faire l'équivalent de Ruby ObjectSpace._id2ref en Python
Comment faire "Prêter et emprunter des méthodes JS (celle qui utilise s'appliquent)" en Python
Obtenez de manière récursive la liste Excel dans un dossier spécifique avec python et écrivez-la dans Excel.
[Super facile! ] Comment afficher le contenu des dictionnaires et des listes incluant le japonais en Python
Renvoyez les données d'image avec Flask of Python et dessinez-les dans l'élément canvas de HTML
Si vous voulez mettre un argument dans la fonction de fermeture et l'exécuter plus tard
[Python] Le statut de chaque préfecture du nouveau virus corona n'est publié qu'en PDF, mais j'ai essayé de le gratter sans le télécharger.
Essayez de le faire avec GUI, PyQt en Python
Comment échanger des éléments dans un tableau en Python et comment inverser un tableau.
Comparaison de l'utilisation des fonctions d'ordre supérieur dans Python 2 et 3
Le processus de création et d'amélioration du code Python orienté objet
J'ai essayé d'implémenter la fonction d'envoi de courrier en Python
Orienté objet en langage C: "○ ✕ game" a été refacturé et porté en Python
[Astuces] Problèmes et solutions dans le développement de python + kivy
Une histoire sur la tentative d'implémentation de variables privées en Python.
J'ai essayé d'implémenter le blackjack du jeu Trump en Python
Vue d'ensemble de l'environnement virtuel Python et comment le créer
[Python] Qu'est-ce qu'une tranche? Une explication facile à comprendre de son utilisation avec un exemple concret
Écrivez un script dans Shell et Python pour vous avertir dans Slack lorsque le processus est terminé
[Python] Qu'est-ce que pip? Expliquez la liste des commandes et comment l'utiliser avec des exemples réels
Gratter la liste des magasins membres Go To EAT dans la préfecture de Fukuoka et la convertir en CSV
Traitez le fichier gzip UNLOADed avec Redshift avec Python de Lambda, gzipez-le à nouveau et téléchargez-le sur S3
Il est étonnamment difficile d'obtenir une liste de la dernière date et heure de connexion des espaces de travail
L'histoire du retour au front pour la première fois en 5 ans et de la refactorisation de Python Django
Gratter la liste des magasins membres Go To EAT dans la préfecture de Niigata et la convertir en CSV
Un mémo pour basculer entre la série python2 et la série 3 dans l'environnement anaconda de mac (win est également ajouté)