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 :
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 :
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