Programme passerelle dans le cadre du projet Prosecco
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

249 lines
7.1 KiB

  1. /* chiffre.c : Système simple de chiffrement d'octets inspiré de la méthode PlayFair */
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <fcntl.h>
  6. #include <unistd.h>
  7. #include "chiffre.h"
  8. #ifdef XOR_SIMPLE
  9. static long long CLE = 0xABCD1276FA8745EC; // clé simple de 64 bits
  10. /* Fonction de chiffrement avec xOR, en utilisant une clé fixe de 64 bits. */
  11. void chiffre_xor_simple(char *buf, int l)
  12. {
  13. long long *debut, *fin;
  14. debut = (long long*) buf;
  15. fin = (long long*) (buf + l);
  16. /* Le chiffrement avec xOR */
  17. while (debut < fin) *debut++ ^= CLE;
  18. #ifdef TRACE_CH
  19. if (ori == 0) { // le thread local -> distant
  20. if (Chiff == 1) printf("Chiffrement l=%d vers %d !\n", l, ntohs(PORTD));
  21. else printf("Déchiffrement l=%d depuis %d !\n", l, ntohs(PORTL));
  22. } else { // le fils principal distant -> local
  23. if (Chiff == 1) printf("Déchiffrement l=%d depuis %d !\n", l, ntohs(PORTD));
  24. else printf("Chiffrement l=%d vers %d !\n", l, ntohs(PORTL));
  25. }
  26. #endif
  27. }
  28. #endif
  29. #ifdef XOR_FICHIER
  30. static char *NFCLE = "/tmp/clepass"; // nom du fichier utilisé pour la clé
  31. static char BCLE[LCLE]; // buffer contenant la clé
  32. /* Gestion des clés à partir d'un fichier externe. */
  33. int init_cle_xor_fichier(void)
  34. {
  35. int fd;
  36. if ((fd = open(NFCLE, O_RDONLY)) == -1) return -1;
  37. if (read(fd, BCLE, LCLE) != LCLE) return -1;
  38. close(fd);
  39. return 0;
  40. }
  41. /* Fonction de chiffrement avec xOR, en utilisant une clé externe provenant d'un fichier. */
  42. void chiffre_xor_fichier(char *buf, int l)
  43. {
  44. long long *debut, *fin, *cle, *fin_cle;
  45. debut = (long long *) buf;
  46. fin = (long long *) (buf + l);
  47. cle = (long long *) BCLE;
  48. fin_cle = (long long *)(BCLE + LCLE);
  49. /* Le chiffrement avec xOR */
  50. while (debut < fin) {
  51. *debut++ ^= *cle++; // équivalent à *debut ^= *cle; debut++; cle++;
  52. if (cle == fin_cle) cle = (long long *) BCLE;
  53. }
  54. #ifdef TRACE_CH
  55. if (ori == 0) { // le thread local -> distant
  56. if (Chiff == 1) printf("Chiffrement l=%d vers %d !\n", l, ntohs(PORTD));
  57. else printf("Déchiffrement l=%d depuis %d !\n", l, ntohs(PORTL));
  58. } else { // le fils principal distant -> local
  59. if (Chiff == 1) printf("Déchiffrement l=%d depuis %d !\n", l, ntohs(PORTD));
  60. else printf("Chiffrement l=%d vers %d !\n", l, ntohs(PORTL));
  61. }
  62. #endif
  63. }
  64. #endif
  65. #ifdef PLAYFAIR
  66. static char table_chiffre[NBO]; /* table des octets à chiffrer */
  67. static char table_bool[NBO] = {0}; /* table pour noter le remplissage des octets */
  68. #ifdef DEBUG
  69. /* Fonction qui affiche la table de chiffrement. */
  70. static void Trace(void)
  71. {
  72. int i, j;
  73. unsigned char c;
  74. fprintf(stderr, "Table de chiffrement:\n");
  75. for (i = 0; i < LCM; i++) {
  76. for (j = 0; j < LCM; j++) {
  77. c = (unsigned char) table_chiffre[(i * LCM) + j];
  78. if ((c >= ' ') && (c <= '~')) fprintf(stderr, " %c ", c);
  79. else fprintf(stderr, "%.2x ", c);
  80. }
  81. fprintf(stderr, "\n");
  82. }
  83. fprintf(stderr, "\n");
  84. }
  85. #endif
  86. void init_table_chiffre(char *cle) /* on passe la clé en parametre */
  87. {
  88. /* initialisation de la table */
  89. int i, I = 0, j;
  90. char c;
  91. for (i = 0; i < (int) strlen(cle); i++) {
  92. c = cle[i];
  93. if (table_bool[(int) c]) continue;
  94. table_chiffre[I++] = c;
  95. table_bool[(int) c] = 1;
  96. }
  97. /*
  98. for (i = 0; i < NBO; i++) {
  99. if (buf2[i]) continue;
  100. buf[I++] = (char) i;
  101. buf2[i] = 1;
  102. }
  103. */
  104. for (j = 0; j < SAUT; j++) {
  105. for (i = j; i < NBO; i += SAUT) {
  106. if (table_bool[i]) continue;
  107. table_chiffre[I++] = i;
  108. table_bool[i] = 1;
  109. }
  110. }
  111. #ifdef DEBUG
  112. Trace();
  113. for (i = 0; i < NBO; i++) {
  114. if (table_bool[i]) continue;
  115. fprintf(stderr, "Valeur %d non affectée !!\n", i);
  116. }
  117. #endif
  118. }
  119. /* Fonction qui définit les coordonnées d'un caractère à partir de sa position dans la table */
  120. static void coordCar(char C, int *l, int *c)
  121. {
  122. int i;
  123. for (i = 0; i < NBO; i++) if (table_bool[i] == C) break;
  124. *c = i % LCM;
  125. *l = i / LCM;
  126. }
  127. /* Fonction qui retourne le caractère de la ligne l, colonne c */
  128. static char carLC(int l, int c)
  129. {
  130. return(table_bool[(l * LCM) + c]);
  131. }
  132. /* fonction qui chiffre directement dans le buffer des données à chiffrer */
  133. void chiffre_playfair(char *B, int T) // B adresse du buf, T le nb d'octets
  134. {
  135. int i, l1, c1, l2, c2;
  136. for (i = 0; i < T; i += 2) {
  137. if (i == T - 1) { /* cas particulier du dernier octet */
  138. coordCar(B[i], &l1, &c1);
  139. l1 += 2; /* on descend de 2 lignes */
  140. if (l1 >= LCM) l1 -= LCM;
  141. B[i] = carLC(l1, c1);
  142. } else { /* cas du couple */
  143. coordCar(B[i], &l1, &c1);
  144. coordCar(B[i + 1], &l2, &c2);
  145. if (l1 == l2) { /* sur la même ligne */
  146. /* on décale vers le haut */
  147. l1--;
  148. if (l1 < 0) l1 += LCM;
  149. B[i] = carLC(l1, c1);
  150. B[i + 1] = carLC(l1, c2);
  151. } else if (c1 == c2) { /* sur la même colonne */
  152. /* on décale vers la droite */
  153. c1++;
  154. if (c1 >= LCM) c1 -= LCM;
  155. B[i] = carLC(l1, c1);
  156. B[i + 1] = carLC(l2, c1);
  157. } else { /* on a un rectangle */
  158. /* schéma
  159. c1 c2
  160. l1 x b
  161. l2 a y
  162. On fait la permutation x, y => a, b
  163. **************************************/
  164. B[i] = carLC(l2, c1);
  165. B[i + 1] = carLC(l1, c2);
  166. }
  167. }
  168. }
  169. }
  170. /* Fonction inverse de chiffre_playfair, puisque cette fonction n'est pas involutive */
  171. void dechiffre_playfair(char *B, int T) // B adresse du buf, T le nb d'octets
  172. {
  173. int i, l1, c1, l2, c2;
  174. for (i = 0; i < T; i += 2) {
  175. if (i == T - 1) { /* cas particulier du dernier octet */
  176. coordCar(B[i], &l1, &c1);
  177. l1 -= 2; /* on monte de 2 lignes */
  178. if (l1 < 0) l1 += LCM;
  179. B[i] = carLC(l1, c1);
  180. } else { /* cas du couple */
  181. coordCar(B[i], &l1, &c1);
  182. coordCar(B[i + 1], &l2, &c2);
  183. if (l1 == l2) { /* sur la même ligne */
  184. /* on décale vers le bas */
  185. l1++;
  186. if (l1 >= LCM) l1 -= LCM;
  187. B[i] = carLC(l1, c1);
  188. B[i + 1] = carLC(l1, c2);
  189. } else if (c1 == c2) { /* sur la même colonne */
  190. /* on décale vers la gauche */
  191. c1--;
  192. if (c1 < 0) c1 += LCM;
  193. B[i] = carLC(l1, c1);
  194. B[i + 1] = carLC(l2, c1);
  195. } else { /* on a un rectangle */
  196. /* schéma
  197. c1 c2
  198. l1 x b
  199. l2 a y
  200. On fait la permutation x, y => a, b
  201. **************************************/
  202. B[i] = carLC(l2, c1);
  203. B[i + 1] = carLC(l1, c2);
  204. }
  205. }
  206. }
  207. }
  208. #endif