Chiffrement Cybermen-Daleks

Ils sont prudents...

Ce défi est tiré de c0d1ngUP 2023

Le Docteur a besoin d'un cryptanalyste, et c'est à vous qu'il a fait appel. Il semble que les Cybermen et les Daleks utilisent un nouveau système de chiffrement pour communiquer. Vous avez pu mettre la main sur la méthode de chiffrement dans un dépôt GitInvaders et vous disposez maintenant de fonctions de chiffrement écrites en C :

#include <string.h>
#include <assert.h>
#define BLKSIZE1 5
#define BLKSIZE2 5
#define MODULE 33554432L

char alp[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ. ,:!?";

int pgcd(unsigned long int a, unsigned long int b) {
    if (b == 0) return a;
    return pgcd(b, a % b);
}


int letter_num(char c) {
    switch(c) {
      case '.': return 26;
      case ' ': return 27;
      case ',': return 28;
      case ':': return 29;
      case '!': return 30;
      case '?': return 31;
      default: return c - 65;
    }
}
char num_letter(int n) {
    return alp[n];
    }

void crypt1_blk(char blk[], char key[], char res[]) {
    for (int i = 0; i < BLKSIZE1; i++) {
        res[i] = num_letter(letter_num(blk[i]) ^ letter_num(key[i]));
    }
}

void crypt2_blk(char blk[], unsigned long int key, char res[]) {
    unsigned long int n = 0;
    for (int i = 0; i < BLKSIZE2; i++) {
        n = n * 32 + letter_num(blk[i]);
    }
    n = (n * key) % MODULE;
    for (int i = BLKSIZE2 - 1; i >=0; i--) {
        res[i] = num_letter(n % 32);
        n = n / 32;
    }
}

void crypt(char message[], char key1[], int key2, char res[]) {
    assert (strlen(message) % (BLKSIZE1 * BLKSIZE2 / pgcd(BLKSIZE1, BLKSIZE2)) == 0);
    assert (pgcd(key2, MODULE) == 1);
    assert (strlen(key1) == BLKSIZE1);
    assert (key2 >= 0 && key2 < MODULE);

   for (int i=0; i<strlen(message); i += BLKSIZE1) {
       crypt1_blk(&message[i], key1, &res[i]); 
   }
   for (int i=0; i<strlen(message); i += BLKSIZE2) {
       crypt2_blk(&res[i], key2, &res[i]); 
   }
}

Les Daleks et les Cybermen ont certainement une paire de clés communes (key1 et key2 du code C) et chiffrent leurs messages avec ces clés.

Le Tardis a aussi pu intercepter deux messages :

  • Cybermen aux Daleks : :RMOP,DOCC,QTUY,QMHWVA L DCUUGYMHN QUQXWK!KJGL?FRD EL,OJQMOXUIYSDOBMQF
  • Réponse des Daleks : MA.AYTBUAY

Il y a fort à parier que la dernière réponse des Daleks est : EXTERMINER

Serez-vous capable de décrypter le message et d'informer le Docteur du plan machiavélique qui se trame ?

Validez le défi avec le message des Cybermen.

Type de retour
Une chaîne de caractères
Entrées du problème
Pas de données d'entrée
Vous devez être connecté.e pour proposer une réponse au défi
Vous devez être connecté.e pour accéder aux forums.