Chiffre XOR - XOR cipher

En cryptographie , le chiffrement XOR simple est un type de chiffrement additif , un algorithme de chiffrement qui fonctionne selon les principes :

A 0 = A,
A A = 0,
A B = B A,
(A B) C = A (B C),
(B A) A = B 0 = B,

où désigne l'opération de disjonction exclusive (XOR). Cette opération est parfois appelée addition de module 2 (ou soustraction, qui est identique). Avec cette logique, une chaîne de texte peut être chiffrée en appliquant l'opérateur XOR au niveau du bit à chaque caractère utilisant une clé donnée. Pour déchiffrer la sortie, il suffit de réappliquer la fonction XOR avec la clé pour supprimer le chiffrement.

Exemple

Par exemple, la chaîne "Wiki" ( 01010111 01101001 01101011 01101001 en ASCII 8 bits ) peut être chiffrée avec la clé répétitive 11110011 comme suit :

01010111 01101001 01101011 01101001
11110011 11110011 11110011 11110011
= 10100100 10011010 10011000 10011010

Et inversement, pour le décryptage :

10100100 10011010 10011000 10011010
11110011 11110011 11110011 11110011
= 01010111 01101001 01101011 01101001

Utilisation et sécurité

L'opérateur XOR est extrêmement courant en tant que composant dans des chiffrements plus complexes. En soi, en utilisant une clé à répétition constante, un simple chiffrement XOR peut être trivialement cassé à l'aide d' une analyse de fréquence . Si le contenu d'un message peut être deviné ou autrement connu, la clé peut être révélée. Son principal mérite est qu'il est simple à mettre en œuvre et que l'opération XOR est peu coûteuse en calcul. Un simple chiffrement XOR à répétition (c'est-à-dire utilisant la même clé pour une opération xor sur l'ensemble des données) est donc parfois utilisé pour cacher des informations dans les cas où aucune sécurité particulière n'est requise. Le chiffrement XOR est souvent utilisé dans les logiciels malveillants informatiques pour rendre la rétro-ingénierie plus difficile.

Si la clé est aléatoire et est au moins aussi longue que le message, le chiffrement XOR est beaucoup plus sûr que lorsqu'il y a une répétition de clé dans un message. Lorsque le flux de clés est généré par un générateur de nombres pseudo-aléatoires , le résultat est un chiffrement de flux . Avec une clé vraiment aléatoire , le résultat est un pavé unique , incassable en théorie .

Dans n'importe lequel de ces chiffrements, l'opérateur XOR est vulnérable à une attaque de texte en clair connu , puisque texte en clair ciphertext = key . Il est également trivial de retourner des bits arbitraires dans le texte en clair déchiffré en manipulant le texte chiffré. C'est ce qu'on appelle la malléabilité .

Utilité en cryptographie

La principale raison pour laquelle XOR est si utile en cryptographie est qu'il est « parfaitement équilibré » ; pour une entrée de texte en clair donnée 0 ou 1, le résultat du texte chiffré est également susceptible d'être 0 ou 1 pour un bit de clé vraiment aléatoire.

Le tableau ci-dessous montre les quatre paires possibles de texte en clair et de bits de clé. Il est clair que si rien n'est connu sur la clé ou le texte en clair, rien ne peut être déterminé à partir du texte chiffré seul.

Table de trace de chiffrement XOR
Texte en clair Clé Texte chiffré
0 0 0
0 1 1
1 0 1
1 1 0

D'autres opérations logiques telles que AND ou OR n'ont pas un tel mappage (par exemple, AND produirait trois 0 et un 1, donc sachant qu'un bit de texte chiffré est un 0 implique qu'il y a 2/3 de chance que le texte en clair d'origine bit était un 0, par opposition à la 1/2 chance idéale dans le cas de XOR)

Exemple d'implémentation

Exemple utilisant le langage de programmation Python .

from os import urandom

def genkey(length: int) -> bytes:
    """Generate key."""
    return urandom(length)

def xor_strings(s, t) -> bytes:
    """xor two strings together."""
    if isinstance(s, str):
        # Text strings contain single characters
        return b"".join(chr(ord(a) ^ ord(b)) for a, b in zip(s, t))
    else:
        # Bytes objects contain integer values in the range 0-255
        return bytes([a ^ b for a, b in zip(s, t)])

message = 'This is a secret message'
print('Message:', message)

key = genkey(len(message))
print('Key:', key)

cipherText = xor_strings(message.encode('utf8'), key)
print('cipherText:', cipherText)
print('decrypted:', xor_strings(cipherText, key).decode('utf8'))

# Verify
if xor_strings(cipherText, key).decode('utf8') == message:
    print('Unit test passed')
else:
    print('Unit test failed')

Voir également

Les références

Remarques

Citations

Sources

  • Budiman, MA ; Tarigan, JT; Winata, AS (2020). "Arduino UNO et serrure numérique basée sur Android utilisant la combinaison du chiffrement Vigenere et du chiffrement XOR" . Journal de physique : Série de conférences . Éditions IOP. 1566 (1): 012074. bibcode : 2020JPhCS1566a2074B . doi : 10.1088/1742-6596/1566/1/012074 . ISSN  1742-6588 .
  • Churchhouse, Robert (2002), Codes and Ciphers: Julius Caesar, the Enigma and the Internet , Cambridge: Cambridge University Press, ISBN 978-0-521-00890-7
  • Garg, Satish Kumar (2017). "Cryptographie utilisant Xor Cipher". Journal de recherche de la science et de la technologie . Publications A et V. 9 (1) : 25. doi : 10.5958/2349-2988.2017.00004.3 . ISSN  0975-4393 .
  • Gödel, Kurt (décembre 1931). "Über formel unentscheidbare Sätze der Principia Mathematica und verwandter Systeme I". Monatshefte für Mathematik und Physik (en allemand). 38-38 (1) : 173-198. doi : 10.1007/BF01700692 . ISSN  0026-9255 . S2CID  197663120 .
  • Lewin, Michael (juin 2012). "Tout sur XOR" . Surcharge . 2 ((109): 14–19 . Récupéré le 29 août 2021 .
  • Paar, Christof; Pelzl, janvier (2009). Comprendre la cryptographie : un manuel pour étudiants et praticiens . Springer. ISBN 978-3-642-04101-3. OCLC  567365751 .
  • Richter, Wolfgang (3 août 2012), "Unbreakable Cryptography in 5 Minutes" , Crossroads: The ACM Magazine for Students , Association for Computing Machinery
  • Tutte, WT (19 juin 1998), Fish and I (PDF) , récupéré le 11 janvier 2020Transcription d'une conférence donnée par le professeur Tutte à l' Université de Waterloo