#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; }