{"id":1821,"date":"2024-02-25T16:38:48","date_gmt":"2024-02-25T15:38:48","guid":{"rendered":"https:\/\/blog.univ-angers.fr\/mathsinfo\/?p=1821"},"modified":"2024-02-27T14:34:51","modified_gmt":"2024-02-27T13:34:51","slug":"python-cryptographie-niveau-lycee-chiffrement-par-substitution","status":"publish","type":"post","link":"https:\/\/blog.univ-angers.fr\/mathsinfo\/2024\/02\/25\/python-cryptographie-niveau-lycee-chiffrement-par-substitution\/","title":{"rendered":"Python &amp; Cryptographie niveau lyc\u00e9e : Chiffrement par substitution"},"content":{"rendered":"\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Python &amp; Cryptographie : substitution simple ou par cl\u00e9\" width=\"584\" height=\"329\" src=\"https:\/\/www.youtube.com\/embed\/POOLOjgH_Rk?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code># Substitution simple\n\ndef subSimple(phrase:str, decalage:int):\n    phrase = phrase.upper()\n    chiffrement = ''\n    for c in phrase:\n        if 'A' &lt;= c &lt;= 'Z':\n            position = (ord(c) - 65 + decalage) % 26\n            chiffrement += chr(65 + position)\n        else:\n            chiffrement += c\n    return chiffrement\n\n# Substitution double (avec cl\u00e9 num\u00e9rique)\n\ndef subDouble(phrase:str, decalage):\n    phrase = phrase.upper()\n    chiffrement = ''\n    longueur = len(decalage)\n    for i,c in enumerate(phrase):\n        if 'A' &lt;= c &lt;= 'Z':\n            position = (ord(c) - 65 + decalage&#091;i % longueur]) % 26\n            chiffrement += chr(65 + position)\n        else:\n            chiffrement += c\n    return chiffrement            \n\n# Substitution avec mot-cl\u00e9\n\ndef fabriqueAlphabet(cle:str):\n    lettres = list(cle.upper()) + &#091;chr(v) for v in range(65, 91)]\n    alphabet = ''\n    for c in lettres:\n        if c not in alphabet: alphabet += c\n    tailleCle = len(set(cle))\n    alphabetFinal = ''\n    for col in range(tailleCle):\n        suiv = col\n        while suiv &lt; 26:\n         alphabetFinal += alphabet&#091;suiv]\n         suiv += tailleCle       \n    return alphabetFinal\n\ndef subCleSimple(phrase:str,cle:str):\n    alphabet = fabriqueAlphabet(cle)\n    phrase = phrase.upper()\n    chiffrement = ''\n    for c in phrase:\n        if 'A' &lt;= c &lt;= 'Z':\n            chiffrement += alphabet&#091;ord(c) - 65]\n        else:\n            chiffrement += c\n    return chiffrement <\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Python &amp; Cryptographie niveau lyc\u00e9e : D\u00e9chiffrement des substitutions<\/h2>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Python &amp; Cryptographie partie 2 : D\u00e9chiffrement des substitutions\" width=\"584\" height=\"329\" src=\"https:\/\/www.youtube.com\/embed\/QjEoviixJsI?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>def decryptSimple(phrase:str):\n    freq = &#091;0] * 26\n    for c in phrase:\n     if 'A' &lt;= c &lt;= 'Z':\n         freq&#091;ord(c) - 65] += 1\n    decal = 4 - freq.index(max(freq))\n    return subSimple(phrase, decal)\n\ndef decryptDouble(phrase:str, taille:int):\n    clair = ''\n    res = &#091;]\n    for i in range(taille):\n     res.append(decryptSimple(phrase&#091;i::taille]))\n    return ''.join(''.join(v) for v in zip(*res))\n\ndef inverseAlphabet(chiffre:str, clair:str):\n    alphabetDecode = ''\n    for i in range(65, 91):\n      c = chr(i)\n      if c in chiffre: code = clair&#091;chiffre.index(c)]\n      else: code = '?'\n      alphabetDecode += code     \n    return alphabetDecode \n\ndef decryptEnPartie(phrase:str,alphabet:str):\n    alphabet = alphabet.upper()\n    phrase = phrase.upper()\n    chiffrement = ''\n    for c in phrase:\n        if 'A' &lt;= c &lt;= 'Z':\n            chiffrement += chr(65 + alphabet.index(c))\n        else:\n            chiffrement += c\n    return chiffrement <\/code><\/pre>\n\n\n\n<p>Exemples de textes :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>clair = 'CHOISISSEZUNTRAVAILQUEVOUSAIMEZETVOUSNAUREZPASATRAVAILLERUNSEULJOURDEVOTREVIE'\n# Cl\u00e9 num\u00e9rique &#091;3, 2, 1, 0]\ncrypte = 'FJPIVKTSHBVNWTBVDKMQXGWOXUBIPGAEWXPUVPBUUGAPDUBTUCWALNMEUWOSHWMJRWSDHXPTUGWIH'\n\n# Extrait du livre \"Le petit Prince\"\n\nprinceClair = 'LESGRANDESPERSONNESMONTCONSEILLEDELAISSERDECOTELESDESSINSDESERPENTSBOASOUVERTSOUFERMESETDEMINTERESSERPLUTOTALAGEOGRAPHIEALHISTOIREAUCALCULETALAGRAMMAIRECESTAINSIQUEJAIABANDONNEALAGEDESIXANSUNEMAGNIFIQUECARRIEREDEPEINTREJAVAISETEDECOURAGEPARLINSUCCESDEMONDESSINNUMERO1ETDEMONDESSINNUMEROLESGRANDESPERSONNESNECOMPRENNENTJAMAISRIENTOUTESSEULESETCESTFATIGANTPOURLESENFANTSDETOUJOURSETTOUJOURSLEURDONNERDESEXPLICATIONSJAIDONCDUCHOISIRUNAUTREMETIERETJAIAPPRISAPILOTERDESAVIONSJAIVOLEUNPEUPARTOUTDANSLEMONDEETLAGEOGRAPHIECESTEXACTMABEAUCOUPSERVIJESAVAISRECONNAITREDUPREMIERCOUPD\u0152ILLACHINEDELARIZONACESTTRESUTILESILONESTEGAREPENDANTLANUITJAIAINSIEUAUCOURSDEMAVIEDESTASDECONTACTSAVECDESTASDEGENSSERIEUXJAIBEAUCOUPVECUCHEZLESGRANDESPERSONNESJELESAIVUESDETRESPRESCANAPASTROPAMELIOREMONOPINIONQUANDJENRENCONTRAISUNEQUIMEPARAISSAITUNPEULUCIDEJEFAISAISLEXPERIENCESURELLEDEMONDESSINNUMERO1QUEJAITOUJOURSCONSERVEJEVOULAISSAVOIRSIELLEETAITVRAIMENTCOMPREHENSIVEMAISTOUJOURSELLEMEREPONDAITCESTUNCHAPEAUALORSJENELUIPARLAISNIDESERPENTSBOASNIDEFORETSVIERGESNIDETOILESJEMEMETTAISASAPORTEEJELUIPARLAISDEBRIDGEDEGOLFDEPOLITIQUEETDECRAVATESETLAGRANDEPERSONNEETAITBIENCONTENTEDECONNAITREUNHOMMEAUSSIRAISONNABLE'\n\nprinceChiffre = 'OGTGUCODHUQEUUPNQGTMRPUCRPTELNMEGGMALUTEUFFCRVFLHUEEVUJNVFFSHTQEQVTBRCTOXXFRWUPUIGSMHUFTGGNIQVFRHUTEURMUWQUAOCHERISASJJEDNIIVVPIUGBUFCMCXNFTDNBGUCNMDKSEFGTTDKOSLSVEMCJAECODRPOEDNBGHFFSLZBNVWOEPCHNLHJQXGDAUTJEUGEESGJNWTFJDXBIVGUEGGDOXTBGHRBROKOSXEDEVFFMRPEEVUJNQWNEUQ1EWFFMRPEEVUJNQWNEUQMEVISAQFFSSGSSRPOEVPFCROQRHPOEQVKAPCJSUKFNWQVTHUTEXNFSHVDEVVGAWKHAQVQOXTMEVGOFDPUSGGUOXLPUUUFTWQVJRWSSOGVRGQONHTEEVGYPOKDAWKPNVLBIGQOCGWDHRKTIUWOAXVSEPGUIHTFTMCJASRSIVCQIOQUEUFFSDXJOQUKALXPLHWOPHWQAUVPUWFBNVNFMRPEEHVMAJGPGUCQHLGDEVVFXDEUMDDFAXEPUSUFRYKKEVCWALUSEFQONDKURHFVPUGNIHTDOXRE\u0152LNMAFJJNHFFLDTJZRPBCHUUTUGTUWKMEVKMOQGTTHIBRHRFNGCOTOCOULVKALCJNVKFUDWDOXTTDHOBVLGEEVVBSGGDOQVBCWUBVHEEEVVBSGGHEQUTEUKFUALBIEGBUFQVPYGDUFJFZOGTGUCODHUQEUUPNQGTJHNFSDKWUHUEEWTFSSTFSFCOASCTTUQQAPGMIRTFMRPPPLPJOQSVAQFKEQTFNFQOTUCJSXPFQXKNESCSALUTALVVNSGVLXEJDHLFFDKTALUMEARFRLGOCHUVRHNMEGGNOQFFSVKONXOFRR1RUHLBIWQVJRWSSFQOSHTWEMGWOXNBIVUBVRKSSLGMLHGUALVWRDKNEQVDOPRSEKGOSLXFMDKTTRWKOXTTEONFMHTFPRPEALVDEVVVNFJBPHCVAOQSSMGOEOWJPDTMALUOIGGTEURFNWUCODUOIGGGOUGUSYKFRJGTNLFFTRKMEVLFMHOFTWCJSDUBPRTUEHLFLXKQAUNBIVFFBUKEGHFFGRNGDHRPLLVJQXGFTGGDRDXBTHUFTOCHRDPEESGSSRPOEHVBIWDJEQEPNWGOTHFFCRPOALVSEXPIOPOFAXUTIUCJSRPOAENF'<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Python &amp; Cryptographie niveau lyc\u00e9e : D\u00e9chiffrement des substitutions Exemples de textes :<\/p>\n","protected":false},"author":4913,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1821","post","type-post","status-publish","format-standard","hentry","category-non-classe"],"_links":{"self":[{"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/posts\/1821","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/users\/4913"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/comments?post=1821"}],"version-history":[{"count":4,"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/posts\/1821\/revisions"}],"predecessor-version":[{"id":1825,"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/posts\/1821\/revisions\/1825"}],"wp:attachment":[{"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/media?parent=1821"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/categories?post=1821"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/tags?post=1821"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}