/ / Déchiffrement XOR de deux chaînes de texte en clair - java, chiffrement, binaire, xor

Déchiffrement XOR de deux chaînes de texte en clair - java, chiffrement, binaire, xor

J'ai été affecté dans ma classe Java AP pour décrypter les éléments suivants: umzDlBF8aFix

avec la clé suivante: oE2dpffzEiFD

Le seul problème est que je ne sais pas comment faire un XOR pour les déchiffrer. Je suis allé jusqu'à les transformer en binaire:

clé: 101000 | 000100 | 110110 | 011101 | 101001 | 011111 | 110011 | 000100 | 100010 | 000101 | 000011

texte chiffré: 110110 | 100110 | 110011 | 100101 | 000001 | 111100 | 011010 | 000101 | 100011 | 110001

mais je ne sais pas quoi faire avec ça. Si vous pouviez m'aider avec ça, ce serait bien! Le code serait bien aussi, mais pas nécessaire.

Merci mille fois!

Réponses:

0 pour la réponse № 1

Vous n'avez pas besoin de les transformer en binaire. XOR est une opération au niveau du bit, vous pouvez donc XOR deux octets ensemble, et ce sera comme XORing chaque bit d'un octet avec le bit correspondant de l'autre octet.

Il suffit d'écrire une boucle de zéro à (et à l'exclusion)la longueur du chiffre, dans lequel vous lisez chaque caractère du chiffre, XOR avec le caractère correspondant de la clé, et ajoutez le résultat à un StringBuilder. Ensuite, invoquez .toString() sur le StringBuilder pour obtenir votre résultat.

Si votre compilateur se plaint qu'il ne peut pas utiliser de caractères XOR, lancez chaque char à un byte, effectuez le XOR entre les octets, puis convertissez le résultat en un char.

le String la classe a un charAt() méthode qui vous permet d'obtenir un personnage à partir d'unindex spécifique dans la chaîne. Alternativement, vous pouvez commencer par obtenir le contenu de chaque chaîne sous forme de tableau de caractères. (Il existe une autre fonction pour cela.)

En prime, vous pouvez faire en sorte que la clé nene doit pas être de la même longueur que le chiffre. Vous pouvez conserver un index distinct adressant les caractères du chiffre, et lorsque cet index atteint la longueur du chiffre, vous pouvez le remettre à zéro, commençant ainsi à lire le chiffre depuis le début.


0 pour la réponse № 2

L'opérateur XOR a la propriété que T XOR KXOR K == T, donc si vous voulez crypter un texte en clair T avec une clé K, vous appliquez l'opération C = T XOR K, et pour décrypter le texte il vous suffit d'appliquer à nouveau la même opération (T = C XOR K). Vous pouvez appliquer l'opération XOR à chaque octet du texte en clair à l'aide d'une boucle for ou d'une carte de programmation fonctionnelle.

EDIT: si vous en avez besoin, l'opérateur XOR dans les langages de programmation est représenté par le caractère "^" donc A ^ B signifie A XOR B.

EDIT2: simple preuve que T XOR K XOR K == T, juste pour que vous n'ayez pas à l'accepter comme par magie:

  • K XOR K est clairement égal à 0
  • T XOR 0 est clairement égal à T
  • Puisque l'opérateur XOR est associatif avec des nombres binaires, nous pouvons écrire T XOR K XOR K comme T XOR (K XOR K) == T XOR 0 == T

0 pour la réponse № 3

Comme d’autres l’ont noté, «xor» est un merveilleuxmécanisme de chiffrement, car le chiffrement et le déchiffrement sont exactement la même opération. Si vous n'utilisez chaque partie de la clé qu'une seule fois, vous disposez de l'algorithme de chiffrement le plus sécurisé possible.

Si vous réutilisez une partie de la clé, elle se transforme en l'un des pires mécanismes de cryptage car cela facilite le piratage.

Le problème que vous avez ici est - comment allez-vousdes caractères à la valeur que vous souhaitez crypter. Vous pouvez prendre les valeurs des caractères Unicode mais vous obtiendrez de faux résultats avec votre texte chiffré et votre clé. Le problème avec l'utilisation d'Unicode en l'état est également que vous pouvez obtenir des caractères non imprimables après le chiffrement / déchiffrement, ce qui n'est normalement pas un problème, mais dans exemples de manuels, il est difficile d'imprimer des caractères non imprimables.

Pour décrypter votre texte, j'ai fait l'hypothèse que la traduction des caractères fonctionne comme ça.

  • A - Z => 0 - 25
  • a - z => 26 - 51
  • 0 - 9 => 52 - 61

(Je n'avais pas besoin de deviner ce que serait 62/63 mais l'espace et le point seraient de bonnes suppositions).

En utilisant cette hypothèse et xor, je prends votre texte chiffré umzDlBF8aFix et votre clé oE2dpffzEiFD et finir avec le texte en clair GiFeMeaPenny.

Puisque c'est lisible en anglais - "Donnez-moi un sou"- il semble que les hypothèses ci-dessus soient plausibles.