Renverse moi si tu peux...

Les échanges entre les membres de l'équipe Coding UP sont chiffrés avec un algorithme utilisant une clé de 160 bits divisée en 20 sous-clés (KEY = [SK0, SK1, ..., SK18, SK19]). Lorsque nous cryptons un message, l'algorithme exécute les étapes suivantes :

  1. initialise une variable 8 bits KeyA à 0, puis applique succesivement à KeyA un XOR (ou exclusif) avec chacune des 20 sous-clés SKi :
    KeyA = 0 xor SK0 xor SK1 xor SK2 ... xor SK18 xor SK19
  2. calcule le reste de la division entière de KeyA par 20 ; stocke le résultat dans nKeyPos :
    nKeyPos = KeyA modulo 20
  3. sélectionne le premier caractère du message à chiffrer et lui applique un XOR avec le produit de KeyA avec la sous-clé à la position nKeyPos :
    caractère_chiffré = caractère_en_clair XOR (SKnKeyPos * KeyA)
  4. ajoute le caractère chiffré à la clé KeyA modulo 256 (pour rester sur 8 bits) :
    KeyA = (KeyA + caractère_chiffré) modulo 256
  5. calcule la nouvelle valeur de nKeyPos :
    nKeyPos = caractère_chiffré modulo 20

Pour faciliter la compréhension, nous donnons ci-dessous une implémentation de l'algorithme en langage C :

void Encrypt(unsigned char key[20], unsigned char *pPlainBuffer, unsigned char *pCipherBuffer, unsigned int nLength) {
  int nKeyPos = 0;
  unsigned int n;
  unsigned char KeyA = 0;

  if ((pPlainBuffer != NULL) && (pCipherBuffer != NULL)) {
    for (n = 0; n < 20; n++)
      KeyA ^= key[n];
    nKeyPos = KeyA % 20;
    for (n = 0; n < nLength; n++) {
      pCipherBuffer[n] = pPlainBuffer[n]^(key[nKeyPos]*KeyA);
      KeyA += pCipherBuffer[n];
      nKeyPos = pCipherBuffer[n] % 20;
    }
  }
}

L'algorithme de déchiffrement est identique au processus décrit ci-dessus, excepté pour l'étape n°3 qui devient :

  1. sélectionne le premier caractère du message à déchiffrer et lui applique un XOR avec le produit de KeyA avec la sous-clé à la position nKeyPos :
    caractère_en_clair = caractère_chiffré XOR (SKnKeyPos * KeyA)

Soit l'implémentation en langage C :

void Decrypt(unsigned char key[20], unsigned char *pCipherBuffer, unsigned char *pPlainBuffer, unsigned int nLength) {
  int nKeyPos = 0;
  unsigned int n;
  unsigned char KeyA = 0;

  if ((pPlainBuffer != NULL) && (pCipherBuffer != NULL)) {
    for (n = 0; n < 20; n++)
      KeyA ^= key[n];
    nKeyPos = KeyA % 20;
    for (n = 0; n < nLength; n++) {
      pPlainBuffer[n] = pCipherBuffer[n]^(key[nKeyPos]*KeyA);
      KeyA += pCipherBuffer[n];
      nKeyPos = pCipherBuffer[n] % 20;
    }
  }
}

Défi :

Afin de faciliter nos échanges nous utilisons toujours la même clé. Cette clé a été générée aléatoirement, i.e. les sous-clés sont des valeurs tirées au hasard entre 0 et 255. Nous vous donnons à titre d'exemple, un message que nous nous sommes échangé hier :
Damned il y a une injection SQL dans la soumission des epreuves ! Un challenger peut ainsi decouvrir le mot de passe maitre qui permet de valider toutes les epreuves sans avoir a les resoudre...

Sa version chiffrée correspond à :

f8 25 06 f3 65 f3 20 05 07 50 39 11 83 89 1b 70
98 d5 67 2e d5 b5 d8 b8 4b 2f 5c 57 0f 53 4c 60
a4 29 4d 99 97 4e d9 81 97 42 2a ec 15 09 5d 55
44 40 a2 1f db 0e fc d2 ba 39 55 e2 8d 69 ac 2d
b3 c5 3b 8b 04 53 a8 43 d8 24 dd 9f 51 64 fa 2a
eb c1 12 43 50 21 7c 0c 96 77 b6 90 ed 82 59 0d
73 ca c7 eb 10 0c e1 e7 41 10 78 18 96 f3 a0 60
89 3c 3b eb a2 fa 4b 19 af 72 ed 9f b7 35 2b 60
1c 53 72 f5 3c 9c 14 0c 8a af 0e 89 9f 43 62 98
b9 18 f4 27 3a d3 6d 29 a2 cc 9d 5a 56 40 ba 25
3d 9e 07 09 25 48 03 a1 c2 eb c2 cd 46 63 9c 9e
11 65 b7 6c 6d 11 ea 22 fd b4 87 a9 1a ef e5 54
64 56

Saurez-vous découvrir la réponse de snarkturne(1), le concepteur de ce site ?

e8 9b e2 16 e6 2e 6f 2e 33 18 af cd e5 58 34 b9
6b 41 dd 9d 24 cb 69 af 50 a5 37 21 02 ef bf 10
58 1e d3 88 08 79 06 cd ee 2c 0d 6d 6c fd b8 d5
c1 c1 73 d3 05 5f 32 a1 2d df e0 6b 2d 54 6d d0
d2 3b 0f e8 5f 19 c1 5c e0 ba 4b 39 bf f7 75 8a
0e ad 06 02 f8 23 44 05 69 48 19 d4 15 5b 1b 5e
3a 11 7f 48 67 a5 60 f4 6d 8a cd 2d 3b 60 ea 8d
49 94 9d 11 86 cf 0c c1 d1 fa e2 98 2d ff a5 6a
54 14 45 f2 b7 e1 1a a2 6e 3a b1 e5 ba 47 0b d3
0d 7d f1 91 49 e9 6a bf 90 7f 2b 29 96 88 74 25
d5 6e d1 62 1a 08 6a ca 99 3b ae 42 41 11 62 a1
66 cc 9d 09 70 e7 4e f5 0d a7 34 c4 c4 f5 bb d8
18 77 a2 7f 71 c9 c3 b0 0c 15 7e 9a 88 50 02 e6
b4 ac 7e 58 01 fd 94 05

(1) Notez que je ne suis pas responsable des crises de nerfs que pourrait provoquer la recherche de la solution du défi. C'est Phoenix1204 l'auteur de ce challenge... :-). En cas de mécontentement, vous pouvez l'appeler au 06 XX XX XX XX

Snarkturne

Ce problème est tiré de c0d1ng UP 2014

Type de retour

Une chaîne de caractères

Entrée du problème

Pas de donnée d'entrée

Formulaire de réponse

Vous devez être connecté pour pouvoir répondre aux défis

Tags : cryptographie cup14