Le Chiffreur César est le prochain dans notre série de problèmes d’algorithme walkthroughs. Classé comme un algorithme « facile » sur des sites web comme Leetcode, c’est un autre problème classique qui revient souvent dans les entretiens techniques et constitue un bon entraînement pour tout ingénieur logiciel cherchant à rafraîchir ses compétences en résolution de problèmes.
Informations de base
D’abord, quelques informations de base sur le chiffre César afin que nous sachions à quoi nous avons affaire.Le chiffre César est un exemple simple de cryptographie, définie par Merriam-Webster comme : le chiffrement et le déchiffrement de messages en code secret ou en chiffre.
Aussi : le codage et le décodage informatisés d’informations.
Le chiffre César repose sur la transposition de chaque lettre d’une chaîne de caractères un nombre déterminé de places (le classique est trois) dans l’alphabet. Le chiffrement César est également connu sous le nom de chiffrement par décalage puisqu’il implique le décalage des lettres afin de dissimuler le sens du message. Le chiffrement César est ainsi nommé car on dit que Jules César et ses alliés ont utilisé cette méthode de chiffrement afin d’envoyer des messages secrets impliquant des secrets militaires (IBM Z Security).
Chef de chiffrement César
Maintenant que nous avons un peu de contexte sur le Cipher César et comment il fonctionne, nous pouvons passer à l’examen du problème de l’algorithme réel. Étant donné une chaîne non vide composée de lettres minuscules et une clé (un nombre entier non négatif) qui spécifie combien de places dans l’alphabet il faut décaler chaque lettre de la chaîne, notre mission est d’écrire une fonction qui renvoie la chaîne codée. Nous voulons que les lettres s’enroulent autour de l’alphabet ; z
décalé d’une place devrait retourner la lettre a
.
Maintenant, pensons au problème d’un point de vue conceptuel avant de sauter dans le code. Nous savons que nous devons systématiquement décaler chaque lettre de la chaîne d’entrée d’un certain nombre de places. Comment trouver un moyen de faire correspondre chaque lettre à un nombre afin de pouvoir représenter chaque lettre de manière cohérente et de pouvoir facilement décaler chaque lettre par la clé donnée ? Nous pourrions faire notre propre mappage de lettres en chiffres, en stockant notre système de mappage dans un objet où la clé est un nombre entier et la valeur est la lettre correspondante, mais existe-t-il une méthode plus simple ? Heureusement pour nous, il y en a une.
JavaScript, comme beaucoup d’autres langages de programmation, possède une fonction qui nous permet d’obtenir la valeur Unicode d’une lettre : charCodeAt()
. Cette petite fonction intégrée très pratique nous permettra de créer efficacement un système de mapping pour l’alphabet.
Ok, parfait. Maintenant que nous avons notre système de mappage trié, nous devons penser à la logistique.
Initialisons un tableau vide dans lequel nous pouvons garder nos résultats – nous appellerons ce tableau newLetters
. Nous pouvons itérer à travers la chaîne passée et pour chaque lettre de la chaîne, convertir la lettre de l’alphabet à sa valeur unicode. Nous pouvons ensuite ajouter la clé (le nombre représentatif du nombre d’endroits où nous transposons notre lettre) à la valeur unicode pour obtenir la valeur unicode de la nouvelle lettre. Nous voudrons ensuite utiliser la fonction JavaScript intégrée String.fromCharCode()
pour reconvertir les valeurs unicode en chaînes de caractères. Comme étape finale, nous pouvons pousser nos résultats dans le tableau newLetters et ensuite joindre les éléments de notre tableau ensemble dans une seule chaîne de caractères pour obtenir notre réponse finale.
Ce qu’il faut garder à l’esprit
Pas terriblement compliqué, mais nous voudrons garder quelques choses importantes à l’esprit. Premièrement, il est utile de savoir que la valeur unicode de a
est 97 et que la valeur unicode de z
est 122. Nos valeurs unicode doivent être comprises entre 97 et 122 pour rester dans l’alphabet.
Pour s’assurer que nos lettres s’enroulent autour de l’alphabet (c’est-à-dire que le z décalé d’une position est un a), si une valeur unicode est supérieure à 122, nous utiliserons l’opérateur modulo pour la forcer à une valeur inférieure à 122. Puisque a
est égal à 97, nous ajoutons ensuite le nombre résultant de l’utilisation de l’opérateur modulo à l’étape précédente à 96 pour obtenir une valeur qui correspond à une lettre de l’alphabet.
Comme autre protection contre l’obtention d’un grand nombre, nous pouvons également forcer la clé dans un nombre gérable. Puisque l’alphabet anglais est composé de 26 lettres, nous savons qu’en décalant les lettres de 26 places, nous nous retrouvons exactement au même endroit où nous avons commencé, ce qui va à l’encontre du but du chiffrement. Nous pouvons donc utiliser l’opérateur modulo pour nous assurer que la clé est inférieure à 26.
Code résultant
Maintenant que nous avons parcouru le concept de la solution, prenez une seconde pour réfléchir à la façon de la coder. Essayez-le d’abord par vous-même. Ce n’est pas grave si votre code est désordonné et pas aussi sec que vous le souhaiteriez – obtenez d’abord une solution qui fonctionne et ensuite vous pourrez remanier et nettoyer votre code.
Voici à quoi ressemble mon code :