Accéder au contenu principal

Ynlqdwmnvqrbk - 1

Une des fonctions cryptographiques les plus élémentaires, c’est la fonction ROT13. L’idée, très simplement, consiste à remplacer chaque lettre du mot que vous souhaitez crypter par la treizième lettre suivante dans l’ordre alphabétique : a, première lettre, est remplacée par n, treize plus unième lettre ; b est remplacé par o etc. sachant, naturellement, qu’à partir de n, on revient au début de l’alphabet.

Par exemple, si nous souhaitons encoder le mot « test », on commence par déterminer le rang de chaque lettre dans l’alphabet (20, 5, 19, 20) auquel on rajoute 13 modulo 26 (soit 7, 18, 6, 7) et on remplace ce résultat par les lettres correspondantes de l’alphabet ; ce qui nous donne « grfg ».

Évidemment, cette rotation de treize places est un cas particulier. Jules César, qui fût un grand utilisateur de cette méthode pour chiffrer ses messages, était susceptible d’appliquer à peu près n’importe quelle rotation de 1 à 25 [1] de telle sorte que, en fonction de la clé choisie, « test » pouvait devenir « uftu » (rot1), « vguv » (rot2), « sdrs » (rot25) etc.

On peut très facilement reproduire l’algorithme de Caius Iulius — par exemple, voici ce que ça peut donner une fois codé sous R :

rot = function(x, n) {
   a <- strsplit(x, "")[[1]]
   v <- match(a, letters) + n
   b <- rep(NA, length(v))
   for(i in 1:length(v)) {
      r <- v[i] - floor(v[i]/26) * 26
      if(r == 0) r <- v[i]
      b[i] <- r
   }
   res <- paste(letters[b], collapse = "")
   return(res)
}

De telle sorte que :

> rot("test", 13)
[1] "grfg"

Et bien sûr :

> rot(rot("test", 13), 13)
[1] "test"

Nous avons donc un algorithme (la rotation alphabétique) et une clé (le facteur de rotation) : c’est la base de la cryptographie.

Seulement voilà : le chiffre de César est extrêmement facile à casser et ce, d’autant plus qu’un des principes fondamentaux de la cryptographie – le principe de Kerckhoffs — stipule que votre adversaire, celui qui va tenter de casser votre code, sait quel algorithme vous utilisez. En l’occurrence, il sait que vous utilisez le chiffre de César et il ne lui reste donc qu’à deviner avec quelle clé.

Une manière très simple et imparable de décoder votre message consiste tout bêtement à essayer toutes les clés possibles — de 1 à 25 — et à voir celle qui renvoie quelque chose qui a un sens. C’est ce que l’on appelle une attaque par la force brute.

Par exemple, si le message à décoder est « dpncpe » et si dico est une liste de tous les mots possibles [2], on peut écrire l’algorithme suivant (toujours sous R) :

msg <- "dpncpe"
res <- NULL
for(i in 1:25) {
   ans <- rot(msg, i)
   ix <- dico == ans
   if(any(ix)) {
      res <- c(res, dico[ix])
   }
}

Ce qui, en moins d’une seconde, nous donne :

> res
[1] "secret"

En l’occurrence, notre algorithme de décodage n’a aucun doute ; il n’y a qu’une seule possibilité : « dpncpe » signifie « secret » avec un facteur de rotation de 11. Code cassé.

Puisque votre adversaire connaît l’algorithme, le seul moyen de sécuriser vos messages c’est de faire en sorte qu’il ne puisse pas — du moins pas dans un délai raisonnable — deviner votre clé. En d’autres termes, vingt-cinq clés possibles, c’est beaucoup trop peu ; il va falloir faire mieux.

Un moyen de faire ça consiste à utiliser une clé de vingt-six chiffres de un à vingt-six qui indiquent à votre algorithme comment permuter chaque lettre de l’alphabet. Par exemple, la clé suivante (key) signifie qu’il faut remplacer a par la vingt-sixième lettre de l’alphabet (donc z), que b doit être remplacé par la neuvième lettre de l’alphabet (i), que c devient b etc.

key <- c(26, 9, 2, 20, 10, 17, 13, 6, 4, 21, 5, 25, 7, 18, 11, 12, 16, 8, 19, 23, 14, 1, 15, 22, 3, 24)

Ça n’a peut-être l’air de rien mais le nombre de permutations possibles de notre alphabet [3] s’élève tout de même à 26! — factorielle de 26 — soit environ 4.10^26 (4 suivi de 26 zéros) clés possibles. Pour la force brute, ça va commencer à être un peu plus sportif.

Voici à quoi ressemble l’algorithme :

algo = function(x, key, code) {
   a <- strsplit(x, "")[[1]]
   if(code) {
      b <- match(a, letters[key])
   } else {
      b <- key[match(a, letters)]
   }
   res <- paste(letters[b], collapse = "")
   return(res)
}

L’argument code est un booléen de telle sorte que si code = TRUE, l’algorithme encode x et si code = FALSE, il sait qu’il doit décoder x. Avec notre clé, on obtient :

> algo("secret", key = key, code = TRUE)
[1] "skynkd"

Et inversement :

> algo("skynkd", key = key, code = FALSE)
[1] "secret"

La force de ce système de cryptage réside non seulement dans le nombre de clé possibles (26!) mais aussi dans le fait que plusieurs combinaisons sont possibles. Pour bien voir ce point, raisonnons un peu : que sait l’adversaire de notre mot secret ?

D’abord, puisqu’il connait l’algorithme, il sait que le nombre de lettres n’a pas varié. Si dans « skynkd » il y en a six, c’est que dans le mot en clair il y en a six aussi. Ce simple fait réduit son champ de recherche à 3 148 mots (avec mon dictionnaire). Par ailleurs, il sait que toutes les lettres qui composent mon mot sont différentes les unes des autres à l'exception de la deuxième et la cinquième qui sont identiques. Ce qui nous laisse 146 possibilités. Par exemple, « toison » fonctionne — auquel cas s = t, k = o, y = i, n = s et d = n — mais « enfant » fonctionne également — s = e, k = n, y = f, n = a et d = t.

C’est-à-dire qu’à l’instar du chiffre de Vernam, si vous n’avez pas la bonne clé, il est théoriquement impossible de savoir avec certitude ce que signifie « skynkd ». Vous avez 146 possibilités — « toison », « enfant », « caviar », « fumeur », « mouton »… et bien-sûr « secret » — mais aucun moyen de savoir laquelle est la bonne.

Là où ça va se compliquer, c’est si vous rallongez votre message. Parce qu’en multipliant les caractères, vous allez donner une nouvelle arme à votre adversaire, une arme extrêmement puissante : les probabilités.

---
[1] Je prends quelques libertés avec la réalité historique : l’alphabet latin classique ne comportait que 23 lettres puisque, d’une part, les romains de l’époque impériale ne distinguaient ni le V du U ni le I du le J et que, d’autre part, le W n’existait pas. Notez, puisque nous y sommes, qu’à l’époque archaïque, le G, le X et le Y n’existaient pas non plus.
[2] En l’occurrence j’utilise un dictionnaire de 22 740 mots français trouvé sur internet.
[3] Et je vous passe les majuscules, les lettres accentuées et les signes de ponctuation…

Commentaires

  1. Le Diable probablement02/02/2014 21:31

    Pour aller plus loin, et pour ceux qui ont le temps, je recommande ceci :

    https://www.coursera.org/course/crypto

    Dispensé par une pointure internationale de la cryptographie, gratuit, etc. Profitez-en avant que ce soit interdit. :)

    RépondreSupprimer

Enregistrer un commentaire

Posts les plus consultés de ce blog

Brandolini’s law

Over the last few weeks, this picture has been circulating on the Internet. According to RationalWiki, that sentence must be attributed to Alberto Brandolini, an Italian independent software development consultant [1]. I’ve checked with Alberto and, unless someone else claims paternity of this absolutely brilliant statement, it seems that he actually is the original author. Here is what seems to be the very first appearance of what must, from now on, be known as the Brandolini’s law (or, as Alberto suggests, the Bullshit Asymmetry Principle):The bullshit asimmetry: the amount of energy needed to refute bullshit is an order of magnitude bigger than to produce it.— ziobrando (@ziobrando) 11 Janvier 2013To be sure, a number of people have made similar statements. Ironically, it seems that the “a lie can travel halfway around the world while the truth is still putting on its shoes” quote isn’t from Mark Twain but a slightly modified version of Charles Spurgeon’s “a lie will go round the w…

Pro Macron - lettre ouverte à mes amis libéraux

Pardon pour cette platitude mais le succès d’Emmanuel Macron c’est avant tout l’expression d’un désir de renouvellement de notre classe politique. Je ne crois pas, si vous me permettez cette hypothèse personnelle, que la plupart de ses électeurs aient voté pour son programme et je suis même convaincu que très peu l’ont lu. Emmanuel Macron est avant tout l’incarnation de ce que nombre de nos concitoyens attendent : une nouvelle tête — un candidat dont les débuts en politiques n’ont pas été photographiés en noir et blanc [1] — et, à tort ou à raison, une rupture avec le système politique hérité de la Libération.Et c’est précisément ça qui a, je crois, tué la candidature de François Fillon. Face à Nicolas Sarkozy et Alain Juppé, lors de la primaire, il pouvait aisément passer pour le candidat du renouvellement de la droite et ce, d’autant plus qu’il tenait à l’époque un discours très libéral au regard de ce à quoi nous sommes habitués de la part des Républicains [2]. Seulement voilà : no…

Les Chicago Boys, Milton Friedman et Augusto Pinochet

Cinq Chicago Boys vers 1957
(dont Sergio de Castro, à droite)Tout commence en 1955. Nous sommes alors en pleine guerre froide et les deux grands blocs — l’URSS et les États-Unis — se livrent une lutte sans merci pour accroître leurs zones d’influences respectives. Dans la longue liste des terrains d’affrontement, l’Amérique Latine figure en bonne place et le Chili n’échappe pas à cette règle. La situation chilienne, du point de vue américain, est particulièrement inquiétante : la gauche y vire marxiste, le reste du spectre politique est divisé et les politiques populistes du général-président Carlos Ibáñez ne laissent rien présager de bon. À Washington, on cherche donc à restaurer l’influence des États-Unis dans la région.C’est dans ce contexte qu’en juin 1955, Theodore Schultz, Earl Hamilton, Arnold Harberger et Simon Rottenberg, tous représentants de l’Université de Chicago, débarquent à Santiago pour y signer un accord avec l’Université Pontificale Catholique du Chili. L’objet de l’…