This commit is contained in:
2025-05-13 12:29:59 +02:00
commit 1bb273e8ac
12 changed files with 304 additions and 0 deletions

BIN
tp1/ex2/fichier.crypt Normal file

Binary file not shown.

1
tp1/ex2/key1.k Normal file
View File

@@ -0,0 +1 @@
<1E>N<EFBFBD> {q2<71>*:<3A><><EFBFBD><EFBFBD>mfU#<23> `<60><><1B>?&Q3

83
tp1/ex2/xtea.c Normal file
View File

@@ -0,0 +1,83 @@
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define DELTA 0x9E3779B9
void xtea_encrypt_block(uint32_t *v, const uint32_t key[4]) {
uint32_t v0 = v[0], v1 = v[1], sum = 0;
for (unsigned i = 0; i < 32; i++) {
v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);
sum += DELTA;
v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum >> 11) & 3]);
}
v[0] = v0;
v[1] = v1;
}
void xtea_decrypt_block(uint32_t *v, const uint32_t key[4]) {
uint32_t v0 = v[0], v1 = v[1];
uint32_t sum = DELTA * 32;
for (unsigned i = 0; i < 32; i++) {
v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum >> 11) & 3]);
sum -= DELTA;
v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);
}
v[0] = v0;
v[1] = v1;
}
void xtea_process(int encrypt, const char *keyfile, const char *infile, const char *outfile) {
uint32_t key[4];
FILE *fk = fopen(keyfile, "rb");
if (!fk || fread(key, sizeof *key, 4, fk) != 4) {
fprintf(stderr, "Erreur lecture clé\n");
exit(1);
}
fclose(fk);
FILE *fin = fopen(infile, "rb");
FILE *fout = fopen(outfile, "wb");
if (!fin || !fout) {
fprintf(stderr, "Erreur ouverture fichiers\n");
exit(1);
}
uint8_t block[8];
size_t n;
while ((n = fread(block, 1, 8, fin)) == 8) {
xtea_encrypt_block((uint32_t*)block, key);
if (!encrypt)
xtea_decrypt_block((uint32_t*)block, key);
fwrite(block, 1, 8, fout);
}
if (encrypt) {
for (size_t i = n; i < 8 - 1; i++) {
block[i] = 0;
}
block[8 - 1] = 8 - n;
xtea_encrypt_block((uint32_t*)block, key);
fwrite(block, 1, 8, fout);
} else if (n > 0) {
fprintf(stderr, "Erreur : fichier chiffré mal aligné\n");
exit(1);
}
fclose(fin);
fclose(fout);
}
int main(int argc, char *argv[])
{
if (argc != 5) {
fprintf(stderr, "Usage : %s -e|-d keyfile infile outfile\n", argv[0]);
return 1;
}
int enc = (strcmp(argv[1], "-e") == 0);
xtea_process(enc, argv[2], argv[3], argv[4]);
return 0;
}

96
tp1/ex2/xtea_cbc.c Normal file
View File

@@ -0,0 +1,96 @@
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define DELTA 0x9E3779B9
void xtea_encrypt_block(uint32_t v[2], const uint32_t key[4]) {
uint32_t v0 = v[0], v1 = v[1], sum = 0;
for (unsigned i = 0; i < 32; i++) {
v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);
sum += DELTA;
v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum >> 11) & 3]);
}
v[0] = v0; v[1] = v1;
}
void xtea_decrypt_block(uint32_t v[2], const uint32_t key[4]) {
uint32_t v0 = v[0], v1 = v[1];
uint32_t sum = DELTA * 32;
for (unsigned i = 0; i < 32; i++) {
v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum >> 11) & 3]);
sum -= DELTA;
v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);
}
v[0] = v0; v[1] = v1;
}
void xtea_cbc_process(int encrypt, const char *iv_str, const char *keyfile, const char *infile, const char *outfile) {
uint32_t key[4];
uint8_t iv[8];
memcpy(iv, iv_str, 8);
FILE *fk = fopen(keyfile, "rb");
if (!fk || fread(key, sizeof(uint32_t), 4, fk) != 4) {
fprintf(stderr, "Erreur lecture clé\n");
exit(1);
}
fclose(fk);
FILE *fin = fopen(infile, "rb");
FILE *fout = fopen(outfile, "wb");
if (!fin || !fout) {
fprintf(stderr, "Erreur ouverture fichiers\n");
exit(1);
}
uint8_t block[8], prev[8];
memcpy(prev, iv, 8);
size_t n;
while ((n = fread(block, 1, 8, fin)) == 8) {
if (encrypt) {
for (int i = 0; i < 8; i++){
block[i] ^= prev[i];
}
xtea_encrypt_block((uint32_t*)block, key);
fwrite(block, 1, 8, fout);
memcpy(prev, block, 8);
} else {
uint8_t saved[8];
memcpy(saved, block, 8);
xtea_decrypt_block((uint32_t*)block, key);
for (int i = 0; i < 8; i++) {
block[i] ^= prev[i];
}
fwrite(block, 1, 8, fout);
memcpy(prev, saved, 8);
}
}
if (encrypt) {
for (size_t i = n; i < 7; i++) block[i] = 0;
block[7] = 8 - n;
for (int i = 0; i < 8; i++) block[i] ^= prev[i];
xtea_encrypt_block((uint32_t*)block, key);
fwrite(block, 1, 8, fout);
} else if (n > 0) {
fprintf(stderr, "Erreur : fichier chiffré mal aligné\n");
exit(1);
}
fclose(fin);
fclose(fout);
}
int main(int argc, char *argv[]) {
if (argc != 6) {
fprintf(stderr, "Usage : %s -e|-d iv keyfile infile outfile\n", argv[0]);
return 1;
}
int encrypt = (strcmp(argv[1], "-e") == 0);
xtea_cbc_process(encrypt, argv[2], argv[3], argv[4], argv[5]);
return 0;
}