Comment déchiffrer le code César sans connaitre le décalage

Utilisateur anonyme -  
mamiemando Messages postés 33773 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

Comment déchiffrer le code César sans connaitre le décalage en c
Une technique ultérieure de cryptographie consista à opérer non avec un décalage systématique, mais par une substitution aléatoire. Pour cela, on utilise un alphabet-clé, dans lequel les
lettres se succèdent de manière désordonnée.
Exemple : HYLUJPVREAKBNDOFSQZCWMGITX. C'est cette clé qui va servir ensuite à
coder le message. Selon notre exemple, les A deviendront des H, les B des Y, les C des L, etc solution en prrograme c svp !

Configuration: Windows / Chrome 101.0.4951.67
A voir également:

5 réponses

NHenry Messages postés 15219 Date d'inscription   Statut Modérateur Dernière intervention   365
 
Nous ne feront pas votre exercice à votre place.
Merci de décrire précisément votre problème et en postant le code déjà réalisé.

Cliquez ici pour des conseils d'écriture des messages et ici concernant les devoirs scolaires ou PFE.

Pour poster votre code, merci de penser à la coloration syntaxique.
0
mariam-j Messages postés 1602 Date d'inscription   Statut Membre Dernière intervention   37
 
En étudiant la fréquence des nombres --> lettres les plus utilisées (voir Wikipedia)
0
brucine Messages postés 21714 Date d'inscription   Statut Membre Dernière intervention   3 431
 
Bonjour,

Il me semble de toute façon y avoir une coquille ou un raccourci dans l'énoncé.

Le code de César utilise à l'origine une simple translation linéaire, qui a été sophistiquée par la suite en translations affines.

Dans la substitution aléatoire mono-alphabétique, il n'y a pas de translation.

Si on connaît cette clé, ce que l'énoncé ne dit pas non plus de manière claire, la résolution informatique en est simple; sinon, le décryptage passe en effet par un message suffisamment long dont on pourra analyser la fréquence des lettres puis retrouver les bigrammes les plus probables.

La question précédente ne serait pas entièrement drôle si on ne s'intéressait pas à la langue dans laquelle le message est écrit (cette fréquence est langue-dépendante).

La fréquence calculée est comparée à celle de textes en clair en différentes langues, fournissant la langue à décrypter à partir de ces calculs ou de tables idoines les rapportant.

Elle s'obtient par simple sommation manuelle ou par le calcul de l'indice de coïncidence dont la valeur, elle aussi comparée à des tables standard, permet de déterminer la langue utilisée (et aussi dans une certaine mesure le type de méthode de chiffrement, cette question n'étant ici pas pertinente).
0
Eric83_2094 Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 

Bonjour j'ai trouvé un déchiffreur de code de César en ligne si vous en avez besoin. Voici : https://www.prospection-de-loisir.fr/code-de-cesar/

0
mamiemando Messages postés 33773 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 

Bonjour,

Préliminaires :

  • Dans le message initial on voit que le décalage n'est pas le même pour chaque lettre (donc il n'y a pas un décalage pré-défini et appliqué à chaque caractère). Comme le souligne  @brucine StatutMembre (voir #3) ce n'est donc pas un codage de César.
    • Il existe des versions plus avancées comme le chiffre de Vigenère qui est consiste à faire un décalage à la manière du codage de César et en y ajoutant la position dans du caractère dans le texte, mais ça n'est pas le cas de l'énoncé puisque le chiffrement ne dépend pas de la position.
  • Si on avait été dans un codage de César habituel, la page wikipedia sur le chiffrement par décalage recense toute une série de technique pour attaquer un codage de césar.

Retour au problème initial

Vu qu'on est dans un cas plus compliqué (c'est-à-dire une bijection arbitraire des lettres de l'alphabet vers les lettres de l'alphabet). Il y a donc un grand nombre de permutations à considérer (en gros toutes les permutations possibles des 26 caractères de l'alphabet) soit 26! = 403291461126605635584000000. Autant dire que ça part plutôt mal si on y va en brute force. La meilleure manière de s'en sortir est alors de privilégier en priorité les permutations qui ont le plus de chances d'aboutir, typiquement en se basant sur une analyse fréquentielle (comme le propose @mariam-j StatutMembre dans #2). 

En plus j'ai l'impression que ton problème est mal posé pour plusieurs raisons

  • Dans l'exemple que tu donnes est un exemple de chiffrement (dont la clé est HYLUJPVREAKBNDOFSQZCWMGITX) et rien qu'écrire le chiffrement est déjà un exercice intéressant en soit pour découvrir le langage C. J'ai l'impression comme le dit @brucine (voir #3) que ce qu'on attend de toi n'est pas d'attaquer un code, mais plutôt de faire un chiffrement.
  • Si la permutation est arbitraire, la deviner est dans le cas général indécidable. Par exemple, si le message chiffré est XYX, est-ce que le mot de départ était SAS, SOS, SES, TOT, ... ?

Donc si on admet que la question consiste juste à chiffrer voici ce que donnerait.

#include <stdio.h>

void encode(const char *key, const char *in, char *out) {
    for (const char *c = in; *c; c++, out++) {
        *out = key[*c - 'A'];
    }   
    *out = '\0';
}

int main() {
    const char *key = "HYLUJPVREAKBNDOFSQZCWMGITX";
    const char *in = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    char buffer[255];
    encode(key, in, buffer);
    printf("encode(%s, %s) = %s\n", key, in, buffer);

    const char *in2 = "COMMENTCAMARCHE";
    encode(key, in2, buffer);
    printf("encode(%s, %s) = %s\n", key, in2, buffer);
    return 0;
}

Résultat : 

encode(HYLUJPVREAKBNDOFSQZCWMGITX, ABCDEFGHIJKLMNOPQRSTUVWXYZ) = HYLUJPVREAKBNDOFSQZCWMGITX
encode(HYLUJPVREAKBNDOFSQZCWMGITX, COMMENTCAMARCHE) = LONNJDCLHNHQLR

Maintenant, je te laisse le soin de comprendre ce qui se passe dans ce programme, ce qui est déjà en soit un bon exercice pour comprendre les pointeurs. Dans l'intervalle, demande à ton enseignant si le but est de chiffrer un message (comme je viens de le faire) ou effectivement d'attaquer un chiffrement. Si c'est le cas, demande-lui quelles sont les hypothèses faites sur ce chiffrement et parle-lui de tous les problèmes que les un.e.s et les autres ont soulevé si tel est réellement ton exercice.

Bonne chance

0
PierrotLeFou
 

Je suppose que mamiemando pourrait répondre mieux que moi à cette question:
Si le pseudonyme d'une personne est "Utilisateur anonyme", cela ne veut-il pas dire qu'il n'est plus inscrit dans CCM?
Le message original est daté du   - 22 mai 2022 à 16:28
Si c'est un devoir à remettre pour "la semaine prochaine", il est un peu tard.
Ou bien il y a contradiction dans ce message, ou bien il y a deux questions.
> Comment déchiffrer le code César sans connaitre le décalage en c (est-ce le langage C?)
> Une technique ultérieure de cryptographie consista à opérer non avec un décalage systématique, mais par une substitution aléatoire. ... solution en prrograme C svp !
La séquence donnée est bien une permutation de l'alphabet.
Il y a bien 26 lettres et en Python collections.Counter ne donne que des fréquences de 1.
Une question serait comment générer en C une telle permutation aléatoire?
Dans plusieurs langages, il existe une fonction shuffle() qui le fait déjà.
On peut le simuler en utilisant la fonction rand() en C.

0
mamiemando Messages postés 33773 Date d'inscription   Statut Modérateur Dernière intervention   7 882 > PierrotLeFou
 

Si le pseudonyme d'une personne est "Utilisateur anonyme", cela ne veut-il pas dire qu'il n'est plus inscrit dans CCM ?

Ça veut juste dire que ça peut être n'importe qui.

Si c'est un devoir à remettre pour "la semaine prochaine", il est un peu tard. Ou bien il y a contradiction dans ce message, ou bien il y a deux questions.

Sans doute, mais le problème reste intemporel, non résolu, et en soi potentiellement intéressant, même si je n'encourage pas le déterrage de fils de discussion. J'avoue ne pas avoir fait attention à la date ou l'auteur du message initial.

La séquence donnée est bien une permutation de l'alphabet.
Il y a bien 26 lettres et en Python collections.Counter ne donne que des fréquences de 1. Une question serait comment générer en C une telle permutation aléatoire? Dans plusieurs langages, il existe une fonction shuffle() qui le fait déjà.
On peut le simuler en utilisant la fonction rand() en C.

Tu peux coder un équivalent de shuffle en C ce n'est pas difficile. Mais dans le cas présent ça n'aiderait pas vraiment car tu n'as pas spécialement envie de chercher une permutation aléatoire (aucune garantie de résultat). Soit le but est de (dé)chiffrer (à clé donnée) et le problème est déterministe, soit le problème est d'attaquer une permutation aléatoire (clé inconnue) et j'aurais plutôt tendance à partir sur une exploration déterministe en favorisant en priorité les permutations les plus prometteuses (e.g., à l'aide d'une analyse fréquentielle).

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
PierrotLeFou
 

On fait quoi avec les déterrages sur ce forum?
Au lieu de substution aléatoire, je préfère parler de substitution par permutation de l'alphabet.
Si P(a) est le caractère associé à la lettre a.
Pour déjouer jusqu'à un certain point le décryptage statistique, on peut faire comme suit:
On applique une fois la fonction au premier caractère: P(a)
On applique deux fois la fonction au deuxième caractère: P(P(a))
On applique trois fois la fonction au troisième caractère: P(P(P(a)))
Pour le quatrième caractère, on revient au cas du premier caractère.
Et ainsi de suite.
Ça peut être plus complexe encore.

-1