Cryptage à l'aide de xor. Opération XOR et cryptage simple des fichiers

Un chiffrement de flux effectue des opérations sur des bits ou des caractères (tels que 8, 16 ou 32 bits). Un chiffrement par flux convertit le même caractère de texte brut en différents caractères de texte chiffré, par exemple en fonction du nombre et des caractères qui ont été traités précédemment.

Cryptage Xor

Dans de nombreux chiffrements de flux, le chiffrement s'effectue comme suit. Le générateur de nombres pseudo-aléatoires produit une séquence de bits (gamma). Ce gamma est appliqué au texte en clair à l'aide d'une opération XOR au niveau du bit. Le résultat est un texte chiffré. Pour décrypter, il faut effectuer exactement la même procédure, appliquer uniquement le gamma obtenu à l'aide d'un générateur identique avec exactement le même état initial au texte chiffré.

Comme nous l’avons vu à l’époque avec Hash, on pourrait supposer que quelque chose de similaire se produit avec le chiffrement symétrique. Une fonction est appliquée à l'entrée qui dépend de la clé pour produire la sortie. Mais contrairement aux hachages, le cryptage n'est pas à sens unique, c'est-à-dire la sortie peut être transformée en bits de la même manière que l'entrée lorsque le message est déchiffré. Cela signifie que la fonction appliquée à l'entrée ne sera rien de plus qu'une série de modifications qui seront apportées à l'entrée pour la masquer. Ces modifications dépendront entièrement de la clé.

Selon le système utilisé par le système de chiffrement, deux types de chiffrements symétriques peuvent être classés : le chiffrement par bloc et le chiffrement par flux. Bien que les mathématiques derrière chaque algorithme de chiffrement puissent être plus ou moins complexes, il n’est pas si difficile de comprendre comment il fonctionne.

Considérons l'idée de cette méthode la plus simple. Comme le sait l'algèbre booléenne, l'opération d'addition logique « ⊕ » modulo 2 (ou OU exclusif logique - XOR, OU exclusif) a la sémantique suivante :

Table de vérité pour XOR :

X je⊕ oui je

X = 10011 101

Examinons d'abord le chiffrement de flux symétrique. Le chiffrement de flux est idéal pour les applications dans lesquelles vous souhaitez chiffrer ce qui est généré en temps réel. Autrement dit, il était initialement destiné à la communication. Cependant, lorsque les données à transmettre sont en temps réel modèle précédent n'est pas valide, nous ne pouvons coder que de petits fragments de l'ensemble, des fragments allant jusqu'à des octets ou même des bits. Autrement dit, chaque octet est généré, crypté et envoyé.

Par conséquent, le fragment envoyé par celui-ci a sa propre signification, car bien qu'il appartienne à l'ensemble, le même octet est déchiffré directement à destination. Même si cela peut paraître compliqué, le concept est relativement simple. L'idée est de pouvoir chiffrer unités minimales le contenu sans qu'ils dépendent de quelque chose d'autre.

oui= 01001 100

z= 11010 001

C'est-à-dire l'opération z= Xoui essentiellement au niveau du bit (au niveau du bit - le résultat ne dépend pas des bits voisins). Si un seul des bits correspondants est 1, alors le résultat est 1. Et si les deux sont 0 ou les deux sont 1, alors le résultat est 0. Si vous regardez attentivement le résultat de l'application XORà deux nombres binaires, alors vous voyez qu'on peut restituer l'un des termes en utilisant le second : X= zoui ou oui= zX.

En tenant compte de ce qui précède, imaginez maintenant deux flux de données constants de bits. Cependant, en général, le chiffrement de flux est beaucoup moins sécurisé que le chiffrement par bloc, et ceux-ci peuvent à leur tour agir comme des flux chiffrés qui évoluent progressivement à partir des chiffrements de flux symétriques abandonnés. Bien que ce cryptage, que l'on ne peut plus considérer comme sécurisé, assuré par lui, qui lui a été fourni avec un relatif succès, reste extrêmement cryptage simple pour la mise en œuvre et le traitement, ce qui le rend idéal pour les applications où la sécurité n'est pas possible. mais important.

De là, nous pouvons tirer les conclusions suivantes : connaître le nombre oui et appliquer XORÀ X, Nous obtiendrons z. Ensuite, nous utilisons à nouveau oui, on obtient de z numéro de retour X. De cette façon, nous pouvons transformer la séquence de nombres ( X) je dans la séquence ( z) je. Maintenant nous pouvons nommer le numéro oui clé d’encodage (ou de cryptage). Si une personne ne connaît pas la clé, elle ne pourra pas restaurer la séquence de chiffres d'origine ( X) je. Mais si ( X) je sont une représentation en octets des lettres du texte, alors utilisateur avancé peut déchiffrer le texte crypté. Puisque chaque lettre sera représentée dans le texte chiffré par le même code z, puis à l'aide du dictionnaire de fréquences l'attaquant pourra calculer la clé de chiffrement oui, s'il dispose d'un texte chiffré suffisamment long.

Comme nous pouvons le constater, même si cela ne nous donne pas un degré complet de sécurité, cela est très utile pour de nombreuses tâches. Le chiffrement par bloc symétrique diffère par le concept de chiffrement de flux. Dans ce cas, on ne chiffre pas a priori le contenu petit à petit, mais on applique plutôt une série de transformations à un bloc d'une taille prédéterminée pour conduire à une sortie chiffrée du bloc. La question pourrait alors se poser : si le bloc est petit et que le chiffrement de flux opère sur des unités « plus grandes », les deux concepts peuvent être identiques.

Dans le cas du chiffrement de flux, ce qui compte est la manière dont le flux de clé sera généré et le système qui sera suivi pour « fusionner » les deux flux. Ici, le système est beaucoup plus complexe et stable. Par conséquent, l’idéal serait toujours de chiffrer un contenu représentant des centaines de fois ce nombre, qui comporterait des centaines de blocs indépendants. Chaque bloc fonctionne généralement de la même manière, les mêmes opérations qui s'appliquent à l'un s'appliquent à l'autre. Cependant, comme cela s'est produit avec les chiffrements par flux, il est normal que la clé d'origine soit uniquement la clé du premier bloc, et que la clé des autres blocs soit la clé obtenue non seulement à partir de celui-ci, mais aussi à partir du contenu crypté, ce qui rend "trouver" c'est déjà difficile.

À la lumière de considérations récentes, nous arrivons à la conclusion qu’il est impossible d’encoder directement un texte simple. Premièrement, le nombre représentant l’espace séparera toujours les mots dans le texte chiffré. En mettant en évidence ce même numéro qui apparaît fréquemment, l'utilisateur devinera qu'il s'agit d'un espace codé. Deuxièmement, des prépositions et des conjonctions courtes et fréquentes aideront également le pirate à identifier la clé. Par conséquent, le moyen le plus efficace consiste à utiliser une clé longue qui couvre plusieurs lettres, ou mieux encore, d’une longueur égale à celle du message lui-même. Ainsi, si nous codons un message assez long (au moins 5 à 10 phrases) en utilisant une clé aléatoire de même longueur, alors un tel message est très difficile à déchiffrer. Des résultats de fiabilité encore plus élevés peuvent être obtenus si, par exemple, le texte est compressé avec une sorte d'archiveur avant le cryptage. De plus, si le message est court, vous pouvez ajouter des séquences aléatoires de caractères au début et à la fin du message.

La différence entre les différents chiffrements par blocs résidera dans les transformations effectuées dans les blocs pour produire le résultat. Généralement, ces transformations sont appelées « étapes », et il n'est pas rare d'avoir des chiffrements par blocs comportant plusieurs d'entre eux. À la fin de toutes les étapes de chaque bloc, un message crypté est généré qui, contrairement au cryptage de flux, ici généralement chaque bloc crypté dépend de l'intégralité de son bloc, il n'y a pas de cryptage bit par bit.

Bien que chaque algorithme soit différent, les chiffrements par blocs ont également différents modes travail. Chacun d’eux ne diffère pas par le type de transformations appliquées, mais plutôt par l’interaction entre leurs blocs. Autrement dit, chaque bloc utilisera toujours la même clé indépendamment. Une autre étape serait quelque chose de similaire à ce qui a été observé avec le cryptage de flux. Dans ce cas, chaque bloc n’est pas indépendant. Donc d'une manière simple Une dépendance totale de chaque bloc est obtenue, ce qui rend impossible de nombreuses attaques cryptographiques.

Ainsi, la robustesse de l'algorithme dépend uniquement des caractéristiques du gamma produit par le générateur. Si le gamma n'est constitué que de zéros (cas dégénéré), alors les données ne changent pas du tout pendant le cryptage. Si gamma a une courte période (par exemple 32 bits), alors le cryptage est réduit à une opération XOR avec une constante de 32 bits. Si le gamma est un ensemble aléatoire de bits qui n'obéit à aucun modèle, le résultat est un analogue d'un tampon de cryptage unique offrant une protection absolue. Bien entendu, l’algorithme déterministe utilisé dans le générateur gamma ne peut pas produire une séquence véritablement aléatoire. Si la séquence ne peut pas être répétée, le message ne sera pas déchiffré.

Ces modes de fonctionnement, qui peuvent paraître sans importance, en possèdent beaucoup. Un test bien connu pour vérifier la force d’un système de cryptage contre une éventuelle répétition de modèles est le codage d’image. Généralement, une image comporte des motifs qui se répètent constamment, ce qui signifie qu'il existe généralement des zones similaires dans l'image qui peuvent avoir le même contenu. L’image est alors un exemple parfait d’attaque de chiffrement. Comment c'est fait? L'image n'est rien d'autre que des points uniformément répartis sur toute la surface, chacun ayant une couleur.

Si deux messages étaient chiffrés en utilisant le même gamma et que l'un des messages (le plus long) pouvait d'une manière ou d'une autre obtenir le texte en clair, il serait alors facile d'obtenir le texte en clair de l'autre message. En appliquant l'opération XOR au texte en clair et au texte chiffré du premier message, nous obtenons un fragment gamma. Et en appliquant le gamma au texte chiffré du deuxième message, nous obtenons son texte en clair. C’est pourquoi il ne faut pas autoriser l’utilisation du même gamma lors du chiffrement de deux flux ou messages différents.

Si nous voulions enregistrer une image sur notre système, le plus méthode simple il serait simple de prendre séquentiellement chaque pixel de l'image et de l'ajouter à un fichier binaire, en spécifiant simplement sa couleur. Ceci est mieux compris avec un exemple. Cela pourrait être notre image, exprimée sous forme d’une matrice de points.

Dans un fichier binaire, il stockera simplement une valeur après l'autre. Pour visualiser cette matrice de points, il nous suffit de connaître cette distribution et de l'appliquer à notre écran de contrôle. Toutes les 3 valeurs recevront la couleur de chaque pixel, et son emplacement dans la matrice correspondra à l'emplacement du pixel sur l'écran.

Si le gamma est généré indépendamment du contenu du message, alors un tel algorithme de streaming est appelé synchrone. Généralement, dans les chiffrements de flux synchrones, une clé de cryptage est utilisée pour définir l'état interne initial du générateur gamma.

Concepts de chiffrement de base

Après avoir vu cela, regardons l'application réelle. Les deux images parlent d'elles-mêmes. L'image n'est pas tout à fait claire, mais vous pouvez parfaitement apprécier le plan de la pomme. Cela soulève ce que je pense être l'un des principaux problèmes de sécurité, et le fait est que le problème n'est pas la recherche. systèmes sécurisés, mais dans l'usage qui leur est fait. Il n'est pas rare de retrouver ces motifs dans une image, et comme on peut représenter graphiquement ce cryptage, on obtient un résultat vraiment intéressant comme celui que nous avons montré.

Chiffrement- méthode de conversion informations ouvertesà fermé et à l'arrière. Utilisé pour le stockage une information important V sources peu fiables ou en le transmettant via des canaux de communication non sécurisés. Selon GOST 28147-89, le cryptage est divisé en processus de cryptage et de décryptage.

Chiffrer, code- un ensemble d'algorithmes de transformation cryptographique (chiffrement) qui mappent l'ensemble des données ouvertes possibles à l'ensemble des données cryptées possibles, et leurs transformations inverses.

Le résultat est un nuage de pixels colorés sans aucune signification, laissant l'image réelle complètement cachée. Les blocs de chiffrement, comme expliqué, laissent cependant certaines inconnues, comme ce qui se passe lorsque le contenu chiffré ne correspond pas à la taille du bloc. grande taille ou qu'arrive-t-il aux blocs qui nécessitent un bloc précédent et ne l'ont pas parce qu'ils sont le premier ou le dernier.

Ainsi, si les blocs ont une longueur de 64 bits et que le dernier bloc n’en a que 32, les 32 bits restants seront remplis. Pour cela il y a diverses méthodes, plus ou moins élaboré, mais dire au moins que tout remplir avec un simple caractère "null" n'est pas recommandé. Concernant le deuxième problème, il est normal qu'il y ait une entrée supplémentaire dans la clé et le contenu qui doivent être cryptés dans le système, appelé vecteur d'initialisation. Cependant, comme ces vecteurs ne sont pas spécifiques à l’algorithme et ne sont généralement pas fournis en entrée, il est normal que l’algorithme les implémente.

Les chiffrements sont divisés en théoriquement indéchiffrables et pratiquement indéchiffrables, et selon la structure des clés en symétriques et asymétriques, selon que la clé de cryptage coïncide ou non avec la clé de déchiffrement. Les chiffrements symétriques, à leur tour, sont divisés en chiffrements par blocs et par flux.

Cryptographie- la science des méthodes permettant d'assurer la confidentialité (impossibilité de lire les informations par des tiers) et l'authenticité (intégrité et authenticité de la paternité, ainsi que l'impossibilité de refuser la paternité) de l'information.

Une autre solution serait de ne pas l'utiliser, ou de supposer que s'il n'est pas exprimé, le vecteur d'initialisation sera une chaîne de zéros. Il y avait peu de blocs de chiffrement qui existaient et existent encore. Tout cela, bien sûr, sauf le secret. Autrefois, plus le cryptage était secret, plus il était invulnérable. Il semblait logique que si personne ne savait comment il était mis en œuvre ni comment il fonctionnait, il serait difficile de le déchiffrer. Cependant, le problème est qu’un million de dirigeants pensent plus grand et mieux que les quelques leaders en ingénierie qui ont créé cet algorithme.

Initialement, la cryptographie étudiait les méthodes de cryptage des informations - transformation réversible du texte brut (original) basée sur un algorithme secret et/ou une clé en texte chiffré (texte chiffré). La cryptographie traditionnelle constitue une branche des cryptosystèmes symétriques, dans lesquels le cryptage et le déchiffrement s'effectuent à l'aide de la même clé secrète.

Quel que soit son degré de sécurité, il serait aujourd’hui impensable d’utiliser un système de cryptage à clé de 56 bits. Dans le pire des cas, une simple force brute nécessiterait 2 56 vérifications, et avec le matériel actuel, cela serait une valeur facilement réalisable. Dans certains schémas, ces clés étaient indépendantes, dans d'autres, il s'agissait de clés dérivées. Cependant, l'algorithme original autorisait les blocs des tailles différentes et les clés.

Une fois cette opération effectuée, une série d'opérations sont effectuées sur la matrice, telles que le décalage de colonnes, le mélange et d'autres opérations non linéaires. La matrice de résultat est envoyée sous forme de bloc crypté dans une séquence d'octets. Pour terminer avec un court exemple de schéma de codage symétrique, montrant de nombreux concepts abordés ici.

La cryptographie est l'une des sciences les plus anciennes ; son histoire remonte à plusieurs milliers d'années.

Texte ouvert (source)- des données (pas nécessairement du texte) transmises sans recours à la cryptographie.

Texte crypté (fermé)- les données obtenues après avoir utilisé le cryptosystème avec la clé spécifiée.

Cryptosystème- une famille de transformations réversibles de texte clair en texte chiffré.

Enfin, les fichiers de sortie créés à partir des processus d'application. Le cryptage symétrique est sûr à utiliser algorithme correct et les systèmes de cryptage. Le cryptage asymétrique est apparu comme une alternative. Mais voyons d'abord la nécessité du chiffrement asymétrique, il serait absurde de créer un système qui n'a aucune utilité.

Nous avons dit que le chiffrement symétrique posait deux problèmes. La première est qu'il est basé sur des algorithmes bidirectionnels, c'est-à-dire que presque toutes les transformations que traverse le bloc à travers les différentes étapes sont des fonctions réversibles qui, grâce à la même clé, peuvent reconstruire le message original. Cela signifie que la puissance de l’algorithme symétrique réside uniquement dans les transformations algébriques effectuées sur le bloc. Donc presque tout chiffres symétriques, qui ont été étudiés avant ou après la découverte de diverses attaques à différents stades.

Clé- un paramètre de chiffrement qui détermine le choix d'une transformation spécifique d'un texte donné. Dans les chiffres modernes Algorithme de cryptage est connue et la force cryptographique du chiffre est entièrement déterminée par le secret de la clé (principe de Kerkhoffs).



Chiffrement- le processus d'application normale de transformation cryptographique d'un texte en clair basé sur un algorithme et une clé, aboutissant à un texte chiffré.

L'idée derrière ces attaques est de détruire progressivement chaque étape afin qu'en ajoutant une autre étape, le calcul puisse être considéré comme réalisable. Le deuxième problème auquel est confronté le chiffrement symétrique est celui de la clé. La clé est nécessaire à la fois pour chiffrer le message et pour le déchiffrer. Cela implique que la source et la destination doivent partager la clé spécifiée. Cela n'a peut-être pas d'importance à première vue, mais cela signifie que si nous voulons vraiment une sécurité décente, le meilleur cas de scenario nous devrons avoir une clé de communication différente avec chacun des utilisateurs avec lesquels nous souhaitons établir une communication sécurisée, puisque nous ne partagerons jamais la même clé avec d'autres utilisateurs, si tel est le cas, les autres utilisateurs pourront lire les messages destinés pour les autres.

Décryptage- le processus d'application normale de la conversion cryptographique du texte chiffré en texte brut.

Décryptage (décryptage)- le processus d'extraction de texte en clair sans connaître la clé cryptographique basée sur une clé chiffrée connue. Le terme décryptage est généralement utilisé en relation avec le processus de cryptanalyse d'un texte chiffré (la cryptanalyse elle-même, d'une manière générale, peut également impliquer l'analyse d'un système de chiffrement, et pas seulement le message ouvert crypté par celui-ci).

Cryptanalyse- la science qui étudie méthodes mathématiques violations de la confidentialité et de l’intégrité des informations.

Attaque cryptographique- une tentative d'un cryptanalyste de provoquer des déviations dans le système d'échange d'informations sécurisé attaqué. Une attaque cryptographique réussie est appelée rupture ou ouverture.

Force cryptographique- la capacité d'un algorithme cryptographique à résister à la cryptanalyse.


Algorithme de chiffrement XOR

L’algorithme de chiffrement le plus simple et le plus primitif est peut-être le chiffrement XOR. L'algorithme de chiffrement XOR peut être compliqué par certaines méthodes, qui peuvent donner de très bons résultats. Mais dans sa mise en œuvre de base, l’algorithme est extrêmement instable.

L'algorithme de chiffrement XOR est basé sur l'utilisation de l'opération logique binaire exclusive ou. Dans une vue tableau, la fonction ressemble à ceci :

UN B Axor B

L'entrée de l'algorithme est le texte source (en général, n'importe quel ensemble d'octets, c'est-à-dire un fichier arbitraire) et une chaîne de mot de passe.

L'idée de l'algorithme est qu'un peu au niveau du bit opération logique XOR. Le résultat est écrit dans un fichier.

L'opération XOR est symétrique. Cela signifie que si vous cryptez le même fichier 2 fois avec le même mot de passe, le résultat sera ce fichier lui-même sans modification. De ce fait, il devient clair que la même fonction sera utilisée pour le cryptage et le déchiffrement, ce qui simplifie grandement la mise en œuvre de l'algorithme. De plus, si le même mot de passe est utilisé lors du décryptage et lors du cryptage, le résultat sera le fichier original. Si les mots de passe sont différents, le résultat sera un fichier contenant des données incorrectes.

Examinons plus en détail l'algorithme de chiffrement XOR :

  1. En entrée, nous recevons des pointeurs vers les fichiers source et résultants ainsi qu'une chaîne de mot de passe (qui ne doit pas être vide).
  2. Lecture du caractère (octet) suivant de fichier source.
  3. Appliquez l'opération XOR à l'octet lu et au caractère de mot de passe suivant.
  4. Le résultat de l'opération est écrit dans le fichier résultant.
  5. Si la fin du fichier source n'est pas atteinte, passez à l'étape 2.

Si le mot de passe est plus court que le fichier d'origine (et ce sera le cas dans la grande majorité des cas), alors le mot de passe est utilisé de manière cyclique, c'est-à-dire Après le dernier caractère du mot de passe, on revient au premier.

Il faut mettre en œuvre la procédure :

procédure XOR_CoDec (const SourceFile, DestFile, Mot de passe : string) ;

Où les éléments suivants sont passés en paramètres :

SourceFile – nom du fichier source.

DestFile – nom du fichier résultant.