From 1bb273e8aca52fa0cdb37edc98e69d29e0b2a811 Mon Sep 17 00:00:00 2001 From: oddos-ma Date: Tue, 13 May 2025 12:29:59 +0200 Subject: [PATCH] tp1 --- tp1/.vscode/settings.json | 6 +++ tp1/ex1/decrypt | Bin 0 -> 15760 bytes tp1/ex1/decrypt.c | 39 +++++++++++++++ tp1/ex1/fichierout.decrypt | 16 +++++++ tp1/ex1/file.crypt | Bin 0 -> 644 bytes tp1/ex2/fichier.crypt | Bin 0 -> 127152 bytes tp1/ex2/key1.k | 1 + tp1/ex2/xtea.c | 83 ++++++++++++++++++++++++++++++++ tp1/ex2/xtea_cbc.c | 96 +++++++++++++++++++++++++++++++++++++ tp1/ex3/fichier1.txt | 1 + tp1/ex3/hachage | Bin 0 -> 15800 bytes tp1/ex3/hachage.c | 62 ++++++++++++++++++++++++ 12 files changed, 304 insertions(+) create mode 100644 tp1/.vscode/settings.json create mode 100755 tp1/ex1/decrypt create mode 100644 tp1/ex1/decrypt.c create mode 100644 tp1/ex1/fichierout.decrypt create mode 100644 tp1/ex1/file.crypt create mode 100644 tp1/ex2/fichier.crypt create mode 100644 tp1/ex2/key1.k create mode 100644 tp1/ex2/xtea.c create mode 100644 tp1/ex2/xtea_cbc.c create mode 100644 tp1/ex3/fichier1.txt create mode 100755 tp1/ex3/hachage create mode 100644 tp1/ex3/hachage.c diff --git a/tp1/.vscode/settings.json b/tp1/.vscode/settings.json new file mode 100644 index 0000000..ffc0b53 --- /dev/null +++ b/tp1/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "files.associations": { + "mutex": "c", + "fcntl.h": "c" + } +} \ No newline at end of file diff --git a/tp1/ex1/decrypt b/tp1/ex1/decrypt new file mode 100755 index 0000000000000000000000000000000000000000..8f63a4204c0fc823c4445e276bac34cc1fa2e6a3 GIT binary patch literal 15760 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 P|2t@slYxOjjDUUsV&-Yl literal 0 HcmV?d00001 diff --git a/tp1/ex1/decrypt.c b/tp1/ex1/decrypt.c new file mode 100644 index 0000000..daf129b --- /dev/null +++ b/tp1/ex1/decrypt.c @@ -0,0 +1,39 @@ +#include +#include +#include +#include +#include + +#define MASK_BIT_7 0x80 +#define MASK_BIT_6 0x40 +#define MASK_BIT_5 0x20 +#define MASK_BIT_4 0x10 +#define MASK_BIT_3 0x08 +#define MASK_BIT_2 0x04 +#define MASK_BIT_1 0x02 +#define MASK_BIT_0 0x01 + +unsigned char next(unsigned char lfsr) { + lfsr = lfsr << 1 | __builtin_parity(lfsr & 0xfa); +} + +int main(int argc, char *argv[]) { + int fd_in,fd_out; + unsigned char w,buf;; + + + assert(argc >= 4); + fd_in = open(argv[1],O_RDONLY); + fd_out = open(argv[2],O_WRONLY|O_TRUNC|O_CREAT,0600); + w = (unsigned char)strtol(argv[3],NULL,0); + + while(1){ + ssize_t nb = read(fd_in,&buf,1); + if (nb <=0) + break; + buf ^= w; + write(fd_out,&buf,1); + w=next(w); + } + return 0; +} \ No newline at end of file diff --git a/tp1/ex1/fichierout.decrypt b/tp1/ex1/fichierout.decrypt new file mode 100644 index 0000000..7558a2f --- /dev/null +++ b/tp1/ex1/fichierout.decrypt @@ -0,0 +1,16 @@ +Demain, dès l'aube, à l'heure où blanchit la campagne, +Je partirai. Vois-tu, je sais que tu m'attends. +J'irai par la forêt, j'irai par la montagne. +Je ne puis demeurer loin de toi plus longtemps. + +Je marcherai les yeux fixés sur mes pensées, +Sans rien voir au dehors, sans entendre aucun bruit, +Seul, inconnu, le dos courbé, les mains croisées, +Triste, et le jour pour moi sera comme la nuit. + +Je ne regarderai ni l'or du soir qui tombe, +Ni les voiles au loin descendant vers Harfleur, +Et quand j'arriverai, je mettrai sur ta tombe +Un bouquet de houx vert et de bruyère en fleur. + +— Victor Hugo, Les Contemplations, 3 septembre 1847 diff --git a/tp1/ex1/file.crypt b/tp1/ex1/file.crypt new file mode 100644 index 0000000000000000000000000000000000000000..1f1e6c254d0fa5ffb3b54687f074421b66eacbf8 GIT binary patch literal 644 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 literal 0 HcmV?d00001 diff --git a/tp1/ex2/key1.k b/tp1/ex2/key1.k new file mode 100644 index 0000000..7fc6ef4 --- /dev/null +++ b/tp1/ex2/key1.k @@ -0,0 +1 @@ +÷Nà {q2‘*:¬¨œÇmfU#© `í±Å?&Q3 \ No newline at end of file diff --git a/tp1/ex2/xtea.c b/tp1/ex2/xtea.c new file mode 100644 index 0000000..ec2d2ad --- /dev/null +++ b/tp1/ex2/xtea.c @@ -0,0 +1,83 @@ +#include +#include +#include +#include + +#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; +} \ No newline at end of file diff --git a/tp1/ex2/xtea_cbc.c b/tp1/ex2/xtea_cbc.c new file mode 100644 index 0000000..e65f342 --- /dev/null +++ b/tp1/ex2/xtea_cbc.c @@ -0,0 +1,96 @@ +#include +#include +#include +#include + +#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; + +} \ No newline at end of file diff --git a/tp1/ex3/fichier1.txt b/tp1/ex3/fichier1.txt new file mode 100644 index 0000000..f6c118c --- /dev/null +++ b/tp1/ex3/fichier1.txt @@ -0,0 +1 @@ +je ne sais pa \ No newline at end of file diff --git a/tp1/ex3/hachage b/tp1/ex3/hachage new file mode 100755 index 0000000000000000000000000000000000000000..8b70af9efec885463853c05b97ce80d9dd8a9cd3 GIT binary patch literal 15800 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 literal 0 HcmV?d00001 diff --git a/tp1/ex3/hachage.c b/tp1/ex3/hachage.c new file mode 100644 index 0000000..3d3b3c5 --- /dev/null +++ b/tp1/ex3/hachage.c @@ -0,0 +1,62 @@ +#include +#include +#include + +#define DELTA 0x9e3779b9 + +void xtea_encrypt(uint32_t v[2], uint32_t const key[4]) { + uint32_t v0 = v[0], v1 = v[1], sum = 0; + for (int 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 hash_file(const char *filename) { + FILE *f = fopen(filename, "rb"); + if (!f) { + perror("Erreur ouverture fichier"); + return; + } + + uint8_t buffer[24]; + uint64_t final_hash[1] = {0}; + size_t bytes_read; + + while ((bytes_read = fread(buffer, 1, 24, f)) > 0) { + if (bytes_read < 24) { + memset(buffer + bytes_read, 24 - bytes_read, 24 - bytes_read); + } + + uint32_t x[2]; + memcpy(x, buffer, 8); + + uint32_t key[4]; + memcpy(key, buffer + 8, 16); + + uint32_t x_orig[2] = {x[0], x[1]}; + xtea_encrypt(x, key); + + x[0] ^= x_orig[0]; + x[1] ^= x_orig[1]; + + final_hash[0] ^= ((uint64_t)x[0] << 32) | x[1]; + } + + fclose(f); + + printf("Empreinte (hachage) : %016llx\n", (unsigned long long)final_hash[0]); +} + +int main(int argc, char *argv[]) { + if (argc != 2) { + printf("Usage : %s \n", argv[0]); + return 1; + } + + hash_file(argv[1]); + return 0; +} \ No newline at end of file