{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Chiffrement de Hill" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Le chiffrement de Hill consiste à coder un mot de deux lettres selon la procédure suivante : \n", "\n", "### Etape 1\n", "Chaque lettre du mot est remplacée par un entier en utilisant le tableau ci-dessous :\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "correspondance = [(chr(i+65),i) for i in range(26)]\n", "print(correspondance)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**chr** retourne le caractère associé à l'entier **ord** (dans le code ASCII)\n", "\n", "'A' est le caractère associé à l'entier 65." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "[chr(i) for i in range(256)]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "ord('A')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On obtient un couple d'entiers $(x_1,x_2)$ où $x_1$ correspond à la première lettre du mot et $x_2$ correspond à la deuxième lettre du mot.\n", "\n", "### Etape 2\n", "$(x_1,x_2)$ est transformé en $(y_1,y_2)$ tel que :\n", "$$(S_1) \\quad \\left\\lbrace \\begin{array}{l} y_1 \\equiv 11x_1 + 3x_2 \\quad (mod \\quad 26)\\\\ y_2 \\equiv 7x_1 + 4x_2 \\quad (mod \\quad 26) \\end{array} \\right. $$\n", "avec $0 \\leqslant y_1 \\leqslant 25$ et $0 \\leqslant y_2 \\leqslant 25$.\n", "\n", "\n", "### Etape 3\n", "$(y_1,y_2)$ est transformé en un mot de deux lettres en utilisant le tableau de correspondance donné dans l'étape 1.\n", "\n", "\n", "Exemple\n", "\n", "Pour le mot en clair **TE** :" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# étape 1\n", "x1 = ord('T')-65\n", "x2 = ord('E')-65\n", "print(x1,x2)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# étape 2\n", "y1 = ( 11*x1 + 3*x2 ) % 26\n", "y2 = ( 7*x1 + 4*x2 ) % 26\n", "print(y1,y2)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "### étape 3\n", "print('Le mot codé est ', chr(y1+65)+chr(y2+65))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**1. ** Coder le mot ST." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# étape 1\n", "x1 = ord('S')-65\n", "x2 = ord('T')-65\n", "print(x1,x2)\n", "# étape 2\n", "y1 = ( 11*x1 + 3*x2 ) % 26\n", "y2 = ( 7*x1 + 4*x2 ) % 26\n", "print(y1,y2)\n", "### étape 3\n", "print('Le mot codé est ', chr(y1+65)+chr(y2+65))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**2.** On admet que le système $(S_1)$ est équivalent au système \n", "$$(S_2) \\quad \\left\\lbrace \\begin{array}{l} x_1 \\equiv 16y_1 + y_2 \\quad (mod \\quad 26)\\\\ x_2 \\equiv 11y_1 + 5y_2 \\quad (mod \\quad 26) \\end{array} \\right. $$\n", "Décoder le mot YJ." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "y1 = ord('Y')-65\n", "y2 = ord('J')-65\n", "print(y1,y2)\n", "x1 = ( 16*y1 + y2 ) % 26\n", "x2 = ( 11*y1 + 5*y2 ) % 26\n", "print(x1,x2)\n", "print('Le mot en clair est ', chr(x1+65)+chr(x2+65))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Au lieu de retaper tout pour chaque mot, on peut définir des fonctions pour le chiffrement et le déchiffrement :" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def chiffrementHill(motDeDeuxLettres):\n", " # motDeDeuxLettres est une chaîne de caractères\n", " x1 = ord(motDeDeuxLettres[0])-65\n", " x2 = ord(motDeDeuxLettres[1])-65\n", " y1 = ( 11*x1 + 3*x2 ) % 26\n", " y2 = ( 7*x1 + 4*x2 ) % 26\n", " return (chr(y1+65)+chr(y2+65)) " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "chiffrementHill('TE')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "chiffrementHill('ST')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def deChiffrementHill(motDeDeuxLettres):\n", " y1 = ord(motDeDeuxLettres[0])-65\n", " y2 = ord(motDeDeuxLettres[1])-65\n", " x1 = ( 16*y1 + y2 ) % 26\n", " x2 = ( 11*y1 + 5*y2 ) % 26\n", " return (chr(x1+65)+chr(x2+65)) " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "deChiffrementHill('NT')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "deChiffrementHill('YJ')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.1" } }, "nbformat": 4, "nbformat_minor": 2 }