Besoin d'aide pour un projet de NSI !

Fermé
TomateeFarcie - Modifié le 5 déc. 2019 à 07:43
 trifou - 5 déc. 2019 à 08:31
Bonjour,

Je suis en première avec la spécialité NSI (Numérique et Sciences de l'Informatique) et je dois rendre un projet pour bientôt. Le problème est que j'ai beau me creuser la tête mais je reste perdu et c'est frustrant.
Voilà le sujet (projet 1 et 3. Le 1 est nécessaire pour faire le 3):

Projet 1: chiffre de César
Écrire une fonction cesar():
- recevant comme arguments une chaîne de caractère clair et un nombre clé compris entre 0 et 25;
-renvoyant chiffre la chaîne de caractère chiffré à l'aide de César.
Écrire le programme permettant d'utiliser et de tester cette fonction. Choisir (et expliquer les choix) comment traiter les espaces, les signes de ponctuation et les chiffres. Même question pour la casse (majuscule/minuscule)

Projet 3: attaque chiffre de César par cryptanalyse statistique
Écrire une fonction cesar_cs():
-recevant comme arguments une chaîne de caractère chiffre dont on sait qu'il s'agit d'un texte en français chiffré par l'algorithme de César (clé inconnue);
-renvoyant un tableau contenant les fréquences d'utilisation de chacune des lettres de l'alphabet dans chiffre.
Écrire le programme permettant d'utiliser et de tester cette fonction. Choisir (et expliquer les choix) comment traiter les espaces, les signes de ponctuation et les chiffres. Même question pour la casse (majuscule/minuscule). Retrouver une table de fréquences pour le français et tester des exemples.

Voici ce que j'ai déjà fait (projet 1 mais pas tout le projet 3...):

   
# -*- coding: utf-8 -*-
"""
Éditeur de Spyder

Ceci est un script temporaire.
"""

""" Avertissement : on considère que les textes en clair sont
    constitués uniquement de lettres majuscules (sans ponctuation, 
    espace ou signe diacritique) """

def decalage(caractere, cle):
    """ en entrée :
        * caractere : caractère clair à chiffrer
        * clé : nombre compris entre 0 et 25
        en sortie :
        * retourne un caractère chiffré par décalage
    """    
    val_clair = ord(caractere) + cle
    if val_clair > 90:
        val_clair = val_clair - 26
    return chr(val_clair) 
        
def cesar(clair, cle):
    """ en entrée :
        * clair : chaîne de caractère (texte en clair)
        * cle : nombre compris entre 0 et 25
        en sortie : 
        retourne une chaîne de caractère chiffrée en César (décalage)
    """
    chiffre = ""
    for i in range(len(clair)):
        caractere_clair = clair[i]
        chiffre = chiffre + decalage(caractere_clair, cle)
    return chiffre


def decalage(caractere, cle):

    val_clair = ord(caractere) + cle
    if val_clair > 90:
        val_clair = val_clair - 26
    return chr(val_clair) 
        
def cesar(clair, cle):
    
    chiffre = ""
    for i in range(len(clair)):
        caractere_clair = clair[i]
        chiffre = chiffre + decalage(caractere_clair, cle)
    return chiffre
    
cle=13
chiffre="TOTO"

texte1 = "Oruhp lsvxp groru vlw dphw, frqvhfwhwxu dglslvflqj holw. Pdxulv hohphqwxp dxfwru olehur hjhw frpprgr. Skdvhooxv ihuphqwxp sxuxv dw shoohqwhvtxh ihuphqwxp. Grqhf hurv oruhp, oreruwlv hw srvxhuh hx, pdwwlv vdjlwwlv wruwru. Doltxdp whpsxv txdp lq odfxv vrgdohv hxlvprg. Ylydpxv vlw dphw hvw vdslhq. Pdhfhqdv pdjqd iholv, frqydoolv hx ulvxv hx, vrgdohv ihxjldw oljxod. Fxudelwxu odruhhw sxuxv wlqflgxqw, vdjlwwlv vdslhq hx, idflolvlv qlvo. Pdxulv vroolflwxglq xowulfhv hxlvprg. Pdhfhqdv hohphqwxp qrq vdslhq qhf sruwwlwru. Lq xowulflhv dxjxh pl, frqvhfwhwxu ruqduh pdxulv shoohqwhvtxh xw. Hwldp xowulflhv, ulvxv hjhw ukrqfxv vdjlwwlv, sxuxv xuqd khqguhulw iholv, vhpshu wlqflgxqw hudw rufl hjhw ulvxv. Txlvtxh fxuvxv dufx yho hxlvprg judylgd. Surlq ukrqfxv gljqlvvlp oruhp, qrq pdwwlv lsvxp oxfwxv vhg. Yhvwlexoxp dqwh lsvxp sulplv lq idxflexv rufl oxfwxv hw xowulfhv srvxhuh fxelold Fxudh; Vhg lq xoodpfrushu holw. Qxood frqvhfwhwxu, odfxv hx judylgd uxwuxp, ulvxv gxl ydulxv qlvo, qrq frpprgr wruwru oljxod qhf oruhp. Qxood idflolvl. Pdxulv vfhohulvtxh xowulfhv groru, vlw dphw ldfxolv ohr. Lq vlw dphw ohfwxv pdvvd. Pruel yxosxwdwh iholv vdslhq, xw lqwhugxp xuqd ihxjldw txlv. Lq groru gxl, glfwxp lq vhp vroolflwxglq, dxfwru pdalpxv qxood. Shoohqwhvtxh txlv glfwxp vhp, xw yhvwlexoxp rufl. Vhg hjhw dqwh dxfwru gxl vrgdohv doltxdp ruqduh d dqwh. Hwldp eodqglw phwxv sxuxv, txlv whpsru phwxv skduhwud lg. Skdvhooxv hohlihqg hqlp vhg pl suhwlxp sodfhudw. Xw holw oruhp, pdalpxv yho vhp xw, ihuphqwxp ruqduh wxuslv. Lqwhjhu hjhw iholv qhf rufl yxosxwdwh xowulflhv hjhw qrq hqlp. Pdxulv sxuxv txdp, frqydoolv d frqvhtxdw df, vrgdohv xw qhtxh. Gxlv df txdp xowulfhv, ldfxolv dufx ylwdh, dffxpvdq odfxv. Ylydpxv vhg frqjxh vhp. Yhvwlexoxp wulvwltxh suhwlxp ohfwxv, sodfhudw yhvwlexoxp wruwru shoohqwhvtxh vhg. Qxood gxl ulvxv, frqglphqwxp d doltxdp qrq, yxosxwdwh txlv dufx. Grqhf df hjhvwdv olehur. Shoohqwhvtxh hohphqwxp qxqf lg wxuslv idflolvlv xowulflhv. Vhg vdjlwwlv rglr qhf doltxdp vxvflsl
w. w ylwdh odfxv whooxv. Grqhf idxflexv lg qhtxh vlw dphw frpprgr. Vhg elehqgxp holw qhf whpsxv ukrqfxv. Pdhfhqdv idxflexv hxlvprg pdvvd hw suhwlxp. Grqhf lq dxfwru whooxv. Fxudelwxu sxuxv qlvl, yroxwsdw d yhklfxod frqglphqwxp, frqjxh lq qlvo. Pruel proolv, vhp qrq frpprgr yhqhqdwlv, wruwru iholv odruhhw odfxv, hx vxvflslw mxvwr hurv qhf groru. Txlvtxh txdp ohr, ilqlexv lg hqlp wlqflgxqw, dxfwru yhvwlexoxp dxjxh."
texte_chiffre = texte1.upper()

def uncesar(chiffre, cle):

    val_clair = chr(chiffre) - cle
    if val_clair > 90:
        val_clair = val_clair + 26
    return ord(val_clair) 

# test
print(uncesar(texte_chiffre, 3))




Si quelqu'un pouvait m'éclairer :)
Merci beaucoup!

1 réponse

Bonjour,

On te demande d'abord de faire un tableau et insérer dedans le nombre de chaque caractères du texte chiffré.
Ce tableau sera un simple dictionnaire.

Sachant que dans un texte standard en français, les caractères les plus fréquents sont e, s, a, n, t, i, o, u, et plus le texte est long, plus ce sera facile de trouver la clef de chiffrage et de décoder le texte.

Tu peux donc en fonction de ton tableau retrouver en quelques essais la clef.

Il faut que tu travailles sur un vrai texte écrit en français, pas sur un générateur de texte lorem ipsum... Sinon il faudra aussi faire des statistiques sur les caractères les plus présents sur un grand texte générés par ton générateur et faire les comparaisons des deux tableaux.
0