FR 3060789 A1 20180622 FR 1662780 A 20161219 1 PROCÉDÉ D'EXÉCUTION PAR UN MICROPROCESSEUR D'UN CODE MACHINE POLYMORPHIQUE D'UNE FONCTION PRÉDÉTERMINÉE [001] L'invention concerne un procédé d'exécution par un microprocesseur d'un 5 code machine polymorphique d'une fonction prédéterminée. L'invention concerne également un code machine polymorphique, un support d'enregistrement d'informations et un appareil électronique pour la mise en oeuvre de ce procédé. [002] La demande US2015/0095659A1 décrit un procédé d'exécution par un microprocesseur d'un code machine polymorphique d'une fonction prédéterminée lors 10 duquel le microprocesseur : a) acquiert une valeur numérique apte à varier, d'une exécution à une autre du même code machine polymorphique, puis b) génère, en fonction de la valeur numérique acquise, un premier et, en alternance, un second flots d'instructions, ces premier et second flots d'instructions étant chacun 15 aptes à réaliser la fonction prédéterminée lorsqu'ils sont exécutés par le microprocesseur, chacun de ces flots d'instructions étant formé d'une succession de blocs de base, chaque bloc de base débutant à une adresse de branchement et se terminant par une instruction de branchement vers une adresse de branchement d'un autre bloc de base, ces premier et second flots d'instructions se distinguant l'un de 20 l'autre par au moins un opcode d'instructions ou un opérande différent ou une valeur littérale différente ou un nombre d'instructions différent, c) enregistre le flot d'instructions généré dans une mémoire principale, puis d) exécute flot d'instructions généré qui vient d'être enregistré. [003] Un tel procédé d'exécution présente l'avantage de rendre plus difficiles les 25 tentatives d'attaque ou de cryptanalyse par canaux auxiliaires plus connues sous le terme anglais de « side channel attack ». De telles attaques sont par exemple décrites dans les articles suivants : - C. Clavier : « Side channel analysis for reverse engineering (scare) - an improved attack against a secret a3/a8 gsm algorithm », Cryptology ePrint Archive, Report 30 2004/049, 2004, - M. San Pedro et Al : « FIRE : Fault Injection for Reverse Engineering », Springer Berlin Heidelberg, 2011, pp 280-293. [004] De façon générale, une attaque par canaux auxiliaires consiste à mesurer un une grandeur physique observable pendant le fonctionnement du microprocesseur 35 lorsque celui-ci exécute la fonction prédéterminée attaquée pour en déduire des informations sur le fonctionnement et les données internes de cette fonction prédéterminée. Par exemple, le paramètre observé peut être la consommation électrique ou le rayonnement électromagnétique du microprocesseur. [005] Le procédé décrit dans US2015/0095659A1 est robuste vis-à-vis des 40 attaques par canaux auxiliaires car le code exécuté pour réaliser la fonction 3060789 2 prédéterminée varie d'une exécution à une autre. Ainsi, toute chose identique par ailleurs, cela se traduit par le fait que le paramètre observé varie de façon imprédictible à chaque exécution de la fonction prédéterminée. [6] Toutefois, en observant dans la mémoire principale, le flot d'instructions généré lors de l'exécution du code machine polymorphique, un attaquant peut quand même obtenir des informations sur le fonctionnement de cette fonction prédéterminée. Par exemple, pour cela, l'attaquant peut désassembler le flot d'instructions généré. [7] L'invention vise à remédier à ce problème en proposant un procédé 10 d'exécution par un microprocesseur d'un code machine polymorphique qui soit robuste vis-à-vis des attaques par désassemblage du flot d'instructions généré et vis-à-vis des attaques par canaux auxiliaires. [8] Elle a donc pour objet un tel procédé dans lequel : - avant l'étape c) : 15 - pour chaque adresse de branchement à laquelle débute un bloc de base, le microprocesseur ajoute automatiquement dans le flot d'instructions généré une instruction de renouvellement apte, lorsqu'elle est exécutée par le microprocesseur, à déclencher, immédiatement après le branchement vers cette adresse de branchement, le renouvellement d'un vecteur d'initialisation 20 d'un module de déchiffrement par flot avec une valeur spécifique associée à cette adresse de branchement, puis - un module de chiffrement par flot, paramétré par un vecteur d'initialisation, chiffre le flot d'instructions au fur et à mesure qu'il est généré, au cours de ce chiffrement chaque bloc de base est chiffré à l'aide de la valeur spécifique du 25 vecteur d'initialisation associée à l'adresse de branchement à laquelle il débute, - lors de l'étape c), seul le flot d'instructions ainsi chiffré est enregistré dans la mémoire principale, - lors de l'étape d), à chaque fois qu'une instruction du flot d'instructions chiffré est 30 chargée depuis la mémoire principale pour être exécutée, cette instruction est d'abord déchiffrée par le module de déchiffrement, puis transférée, sans passer par la mémoire principale, vers une unité arithmétique et logique du microprocesseur, puis exécutée par cette unité arithmétique et logique, au cours de ce déchiffrement, les instructions de renouvellement ajoutées sont exécutées au fur et à mesure qu'elles 35 sont rencontrées dans le flot d'instructions. [009] Dans le procédé revendiqué, le code exécuté pour réaliser la fonction prédéterminée varie d'une exécution à une autre. Ainsi, le procédé revendiqué conserve sa robustesse vis-à-vis des attaques par canaux auxiliaires. [0010] De plus, dans le procédé revendiqué, le flot d'instructions généré qui réalise 40 la fonction prédéterminée est présent dans la mémoire principale uniquement sous 3060789 3 forme chiffrée. Ainsi, les tentatives d'attaque par désassemblage des instructions du flot d'instructions généré sont rendues plus difficiles. [0011] De plus, la valeur du vecteur d'initialisation du module de chiffrement varie d'un bloc de base à un autre bloc de base dans le flot d'instructions généré. Ainsi, la 5 totalité du flot d'instructions généré n'est pas chiffrée de la même façon, ce qui rend plus difficile toute tentative de cryptanalyse du flot d'instructions chiffré enregistré dans la mémoire principale. [0012] Enfin, un bloc de base n'est déchiffré que s'il est exécuté. A l'inverse, un bloc de base n'est jamais déchiffré s'il n'est pas exécuté. Le procédé revendiqué évite 10 donc de déchiffrer systématiquement l'ensemble du flot chiffré, ce qui rend son exécution plus rapide. [0013] Les modes de réalisation de ce procédé peuvent présenter une ou plusieurs des caractéristiques suivantes : ^ lors de l'étape b), c'est l'exécution, par le microprocesseur, d'un groupe 15 d'instructions du code machine polymorphique, appelé générateur, qui génère le flot d'instructions, les instructions de ce générateur étant enregistrées dans la mémoire principale, uniquement sous forme chiffrée de sorte que l'étape b) comporte le chargement d'une instruction chiffrée du générateur depuis la mémoire principale, puis son déchiffrement par le microprocesseur, suivi de 20 son transfert, sans passer par la mémoire principale, vers une unité arithmétique et logique du microprocesseur et l'exécution de cette instruction par l'unité arithmétique et logique ; ^ le microprocesseur ajoute l'instruction de renouvellement au début de chaque bloc de base de sorte que l'exécution de ce bloc de base débute par 25 l'exécution de cette instruction de renouvellement ; ^ l'instruction de renouvellement de la valeur du vecteur d'initialisation du prochain bloc de base à exécuter est ajoutée dans le précédent bloc de base à exécuter immédiatement avant ce prochain bloc de base, et lors du chiffrement, l'instruction de renouvellement ajoutée dans le précédent bloc de 30 base est chiffrée en utilisant la même valeur du vecteur d'initialisation que celle utilisée pour chiffrer toutes les autres instructions du précédent bloc de base ; ^ lors du chiffrement, le flot d'instructions est seulement chiffré en le combinant bit à bit, à l'aide d'une fonction prédéterminée, avec une séquence pseudoaléatoire générée par un générateur de séquence pseudo-aléatoire initialisé, 35 au début de chaque bloc de base, par la valeur spécifique associée à l'adresse de branchement à laquelle débute ce bloc de base, et lors du déchiffrement, le flot d'instructions est déchiffré en le combinant bit à bit, à l'aide de l'inverse de ladite fonction prédéterminée, avec une séquence pseudo-aléatoire générée par un générateur de séquence pseudo-aléatoire identique initialisé, au début 3060789 4 de chaque bloc de base, par la valeur spécifique associée à l'adresse de branchement à laquelle débute ce bloc de base ; ^ - lors de l'étape b), l'un des blocs de base du flot d'instructions généré comporte une instruction de branchement aval, c'est-à-dire une instruction de 5 branchement vers une adresse aval de branchement dont la valeur numérique n'est pas immédiatement déterminable par le microprocesseur car elle dépend d'un nombre d'instructions contenues dans une partie future du flot d'instructions qui n'a pas encore été générée à cet instant, - lors du chiffrement du flot d'instructions au fur et à mesure qu'il est généré, lorsque cette instruction de branchement aval est rencontrée dans le bloc de base en cours de chiffrement, le microprocesseur : - réserve dans la mémoire principale, à l'emplacement où doit être enregistrée l'instruction de branchement aval chiffrée, un espace de même taille ou de taille supérieure à la taille de l'instruction de branchement aval chiffrée, et - associe une fonction de rappel à une étiquette correspondant à cette adresse aval de branchement, cette fonction de rappel étant paramétrée par la valeur spécifique du vecteur d'initialisation associée à l'adresse de branchement à laquelle débute ce bloc de base en cours de chiffrement et par un numéro d'ordre identifiant la position de cette instruction de branchement aval par rapport au début du bloc de base en cours de chiffrement, puis - le chiffrement du flot d'instructions se poursuit sans avoir, à ce stade, chiffré et enregistré dans la mémoire principale, l'instruction de branchement aval, - lorsque ladite partie future du flot d'instructions a été générée, le microprocesseur exécute la fonction de rappel associée à l'étiquette correspondant à cette adresse aval de branchement, l'exécution de cette fonction de rappel par le microprocesseur provoquant : - le remplacement de l'étiquette par la valeur numérique de l'adresse aval de branchement dans l'instruction de branchement aval, - l'initialisation du module de chiffrement avec la valeur du vecteur d'initialisation qui paramètre cette fonction de rappel, - la génération par le module de chiffrement ainsi initialisé d'une séquence pseudo-aléatoire jusqu'à générer la succession de bits de cette séquence pseudo-aléatoire correspondant au numéro d'ordre qui paramètre la fonction de rappel, puis - la combinaison bit à bit de cette succession générée de bits avec l'instruction de branchement aval dans laquelle l'étiquette a été 3060789 5 remplacée par la valeur numérique de l'adresse aval de branchement, puis - l'enregistrement de l'instruction de branchement aval ainsi chiffrée dans l'espace réservé à cet effet dans la mémoire principale ; 5 ^ - lors de l'étape b), l'un des blocs de base du flot d'instructions comporte une instruction de branchement aval, c'est-à-dire une instruction de branchement vers une adresse aval de branchement dont la valeur numérique n'est pas immédiatement déterminable par le microprocesseur car elle dépend d'un nombre d'instructions contenues dans une partie future du flot d'instructions 10 qui n'a pas encore été générée à cet instant, - lors du chiffrement du flot d'instructions au fur et à mesure qu'il est généré, lorsque cette instruction de branchement aval est rencontrée dans le bloc de base en cours de chiffrement, le microprocesseur : - insert, dans le flot d'instructions, un bloc de base aval situé 15 immédiatement après le bloc de base en cours de chiffrement, la taille de ce bloc de base aval étant connue et ce bloc de base aval se terminant par une copie de l'instruction de branchement aval, - remplace l'instruction de branchement aval, dans le bloc de base en cours de chiffrement, par une instruction de branchement 20 inconditionnelle vers l'adresse de branchement à laquelle débute le bloc de base aval inséré, - chiffre l'instruction de branchement inconditionnelle puis l'enregistre dans la mémoire principale à l'emplacement où aurait due être enregistrée l'instruction de branchement aval chiffrée, 25 - réserve dans la mémoire principale, à l'emplacement où doit être enregistré le bloc de base aval chiffré, un espace au moins de même taille que ce bloc de base aval, - associe une fonction de rappel à une étiquette correspondant à l'adresse aval de branchement, puis 30 - le chiffrement du flot d'instructions se poursuit sans avoir, à ce stade, chiffré et enregistré dans la mémoire principale, le bloc de base aval inséré, - lorsque ladite partie future du flot d'instructions a été générée, le microprocesseur exécute la fonction de rappel associée à l'étiquette 35 correspondant à cette adresse aval de branchement, l'exécution de cette fonction de rappel par le microprocesseur provoquant : - le remplacement de l'étiquette par la valeur numérique de l'adresse aval de branchement dans l'instruction de branchement aval du bloc de base aval inséré, 3060789 6 - le chiffrement par le module de chiffrement du bloc de base aval inséré en utilisant pour cela la valeur spécifique du vecteur d'initialisation associée avec l'adresse de branchement à laquelle débute ce bloc de base aval inséré, puis 5 - l'enregistrement du bloc de base aval ainsi chiffré dans l'espace réservé à cet effet dans la mémoire principale ; ^ - l'opération de chiffrement, notée Encrypt(m), mise en oeuvre par le module de chiffrement est homomorphique par rapport à une opération O, c'est-à-dire que Encrypt(m) O Encrypt(r) = Encrypt (m O r), 10 - lors de l'étape b), l'un des blocs de base du flot d'instructions généré comporte une instruction de branchement aval, c'est-à-dire une instruction de branchement vers une adresse aval de branchement dont la valeur numérique n'est pas immédiatement déterminable par le microprocesseur car elle dépend d'un nombre d'instructions contenues dans une partie future du flot 15 d'instructions qui n'a pas encore été générée à cet instant, - lors du chiffrement du flot d'instructions au fur et à mesure qu'il est généré, lorsque cette instruction de branchement aval est rencontrée dans le bloc de base en cours de chiffrement, le microprocesseur : - remplace cette instruction de branchement aval par un cryptogramme 20 R tel que R = Encrypt(r), où r est un mot connu de même longueur que l'instruction de branchement aval, - enregistre le cryptogramme R dans la mémoire principale à l'emplacement où doit être enregistrée l'instruction de branchement aval chiffrée, 25 - associe une fonction de rappel à une étiquette correspondant à cette adresse aval de branchement, cette fonction de rappel étant paramétrée par la valeur spécifique du vecteur d'initialisation associée à l'adresse de branchement à laquelle débute ce bloc de base en cours de chiffrement, par un numéro d'ordre identifiant la position de cette 30 instruction de branchement aval par rapport au début du bloc de base en cours de chiffrement, et par le mot r, puis - le chiffrement du flot d'instructions se poursuit sans avoir, à ce stade, chiffré et enregistré dans la mémoire principale, l'instruction de branchement aval, 35 - lorsque ladite partie future du flot d'instructions a été générée, le microprocesseur exécute la fonction de rappel associée à l'étiquette correspondant à cette adresse aval de branchement, l'exécution de cette fonction de rappel par le microprocesseur provoquant : - la détermination d'un mot x tel que x O r = i, où i est l'instruction de branchement aval dans laquelle l'étiquette a été remplacée par la valeur 3060789 7 numérique de l'adresse aval de branchement et r est le mot qui paramètre la fonction de rappel, - l'initialisation du module de chiffrement avec la valeur du vecteur d'initialisation qui paramètre cette fonction de rappel, 5 - la génération par le module de chiffrement ainsi initialisé d'une séquence pseudo-aléatoire jusqu'à générer la succession de bits de cette séquence pseudo-aléatoire correspondant au numéro d'ordre qui paramètre la fonction de rappel, puis - la combinaison bit à bit de cette succession générée de bits avec le 10 mot x déterminé pour obtenir un cryptogramme X, puis - le calcul de R O X pour obtenir un cryptogramme de l'instruction de branchement aval, puis - l'enregistrement du cryptogramme de l'instruction de branchement aval ainsi obtenu dans la mémoire principale à la place du mot R ; 15 ^ l'étape a) comporte, à chaque exécution du code machine polymorphique, le tirage aléatoire ou pseudo-aléatoire de ladite valeur numérique ; ^ lors des étapes b) et d), le module de chiffrement et le module de déchiffrement sont chacun paramétrés par une clef secrète de sorte que le flot d'instructions chiffré varie aussi en fonction de la valeur de cette clef secrète, la 20 valeur de cette clef secrète restant inchangée pendant toute l'exécution du code machine polymorphique ; ^ la fonction prédéterminée est une primitive cryptographique apte à chiffrer ou déchiffrer des données. [0014] L'invention a également pour objet un code machine polymorphique d'une 25 fonction prédéterminée, ce code machine polymorphique comportant des instructions exécutables par un microprocesseur qui, lorsqu'elles sont exécutées par ce microprocesseur, provoque : a) l'acquisition d'une valeur numérique apte à varier, d'une exécution à une autre du même code machine polymorphique, puis 30 b) la génération, en fonction de la valeur numérique acquise, d'un premier et, en alternance, d'un second flots d'instructions, ces premier et second flots d'instructions étant chacun apte à réaliser la fonction prédéterminée lorsqu'ils sont exécutés par le microprocesseur, chacun de ces flots d'instructions étant formé d'une succession de blocs de base, chaque bloc de base débutant à une adresse de branchement et se 35 terminant par une instruction de branchement vers une adresse de branchement d'un autre bloc de base, ces premier et second flots d'instructions se distinguant l'un de l'autre par au moins un opcode d'instructions ou un opérande différent ou une valeur littérale différente ou un nombre d'instructions différent, c) l'enregistrement du flot d'instructions généré dans une mémoire principale, puis 3060789 8 d) l'exécution du flot d'instructions généré qui vient d'être enregistré, dans lequel : - avant l'étape c) : - pour chaque adresse de branchement à laquelle débute un bloc de base, le 5 microprocesseur ajoute automatiquement dans le flot d'instructions généré une instruction de renouvellement apte, lorsqu'elle est exécutée par le microprocesseur, à déclencher, immédiatement après le branchement vers cette adresse de branchement, le renouvellement d'un vecteur d'initialisation d'un module de déchiffrement par flot avec une valeur spécifique associée à 10 cette adresse de branchement, puis - un module de chiffrement par flot, paramétré par un vecteur d'initialisation, chiffre le flot d'instructions au fur et à mesure qu'il est généré, au cours de ce chiffrement chaque bloc de base est chiffré à l'aide de la valeur spécifique du vecteur d'initialisation associée à l'adresse de branchement à laquelle il 15 débute, - lors de l'étape c), seul le flot d'instructions ainsi chiffré est enregistré dans la mémoire principale, - lors de l'étape d), à chaque fois qu'une instruction chiffré du flot d'instructions est chargée depuis la mémoire principale pour être exécutée, cette instruction est d'abord 20 déchiffrée par le module de déchiffrement, puis transférée, sans passer par la mémoire principale, vers une unité arithmétique et logique du microprocesseur, puis exécutée par cette unité arithmétique et logique, au cours de cette étape d), les instructions de renouvellement ajoutées sont exécutées au fur et à mesure qu'elles sont rencontrées dans le flot d'instructions. 25 [0015] L'invention a également pour objet un support d'enregistrement d'informations comportant le code machine polymorphique. [0016] L'invention a également pour objet un appareil électronique apte à exécuter un code machine polymorphique d'une fonction prédéterminée, cet appareil comportant un microprocesseur programmé pour réaliser les étapes suivantes : 30 a) l'acquisition d'une valeur numérique apte à varier, d'une exécution à une autre du même code machine polymorphique, puis b) la génération, en fonction de la valeur numérique acquise, d'un premier et, en alternance, d'un second flots d'instructions, ces premier et second flots d'instructions étant chacun apte à réaliser la fonction prédéterminée lorsqu'ils sont exécutés par le 35 microprocesseur, chacun de ces flots d'instructions étant formé d'une succession de blocs de base, chaque bloc de base débutant à une adresse de branchement et se terminant par une instruction de branchement vers une adresse de branchement d'un autre bloc de base, ces premier et second flots d'instructions se distinguant l'un de l'autre par au moins un opcode d'instructions ou un opérande différent ou une valeur 40 littérale différente ou un nombre d'instructions différent, 3060789 9 c) l'enregistrement du flot d'instructions généré dans une mémoire principale, puis d) l'exécution du flot d'instructions généré qui vient d'être enregistré, dans lequel le microprocesseur est également programmé pour réaliser les étapes suivantes : 5 - avant l'étape c) : - pour chaque adresse de branchement à laquelle débute un bloc de base, le microprocesseur ajoute automatiquement dans le flot d'instructions généré une instruction de renouvellement apte, lorsqu'elle est exécutée par le microprocesseur, à déclencher, immédiatement après le branchement vers 10 cette adresse de branchement, le renouvellement d'un vecteur d'initialisation d'un module de déchiffrement par flot avec une valeur spécifique associée à cette adresse de branchement, puis - un module de chiffrement par flot, paramétré par un vecteur d'initialisation, chiffre le flot d'instructions au fur et à mesure qu'il est généré, au cours de ce 15 chiffrement chaque bloc de base est chiffré à l'aide de la valeur spécifique du vecteur d'initialisation associée à l'adresse de branchement à laquelle il débute, - lors de l'étape c), seul le flot d'instructions ainsi chiffré est enregistré dans la mémoire principale, 20 - lors de l'étape d), à chaque fois qu'une instruction chiffrée du flot d'instructions est chargée depuis la mémoire principale pour être exécutée, cette instruction est d'abord déchiffrée par le module de déchiffrement, puis transférée, sans passer par la mémoire principale, vers une unité arithmétique et logique du microprocesseur, puis exécutée par cette unité arithmétique et logique, au cours de cette étape d), les 25 instructions de renouvellement ajoutées sont exécutées au fur et à mesure qu'elles sont rencontrées dans le flot d'instructions. [0017] L'invention sera mieux comprise à la lecture de la description qui va suivre, donnée uniquement à titre d'exemple et faite en référence aux figures suivantes : - la figure 1 est une illustration schématique d'un appareil électronique comportant un 30 microprocesseur et un support d'enregistrement d'informations ; - la figure 2 est une illustration schématique d'un code machine polymorphique apte à être exécuté par l'appareil de la figure 1 ; - la figure 3 est un organigramme d'un procédé de construction et d'exécution du code machine polymorphique de la figure 2 ; 35 - la figure 4 est une illustration, en langage évolué, du code d'une fonction prédéterminée ; - la figure 5 est un organigramme d'un procédé de chiffrement par flot mis en oeuvre dans le procédé de la figure 3 ; - la figure 6 est une illustration en langage évolué de la fonction prédéterminée de la 40 figure 4 après sa transformation par le procédé de la figure 5 ; 3060789 10 - la figure 7 est un organigramme d'un procédé de déchiffrement par flot mis en oeuvre dans le procédé de la figure 3 ; - les figures 8, 9 et 10 sont des organigrammes d'autres modes de réalisation possibles d'un procédé de chiffrement par flot utilisable dans le procédé de la figure 5 3. [0018] Dans ces figures, les mêmes références sont utilisées pour désigner les mêmes éléments. Dans la suite de cette description, les caractéristiques et fonctions bien connues de l'homme du métier ne sont pas décrites en détails. [0019] Dans cette description, les définitions suivantes sont adoptées. 10 [0020] Un « programme » désigne un ensemble d'une ou de plusieurs fonctions prédéterminées que l'on souhaite faire exécuter par un microprocesseur. [0021] Un « code source » est une représentation du programme dans un langage informatique, n'étant pas directement exécutable par un microprocesseur et étant destiné à être transformé par un compilateur en un code machine directement 15 exécutable par le microprocesseur. [0022] Un programme ou un code est dit être « directement exécutable » lorsqu'il est apte à être exécuté par un microprocesseur sans que ce microprocesseur n'ait besoin au préalable de le compiler au moyen d'un compilateur ou de l'interpréter au moyen d'un interpréteur. 20 [0023] Une « instruction » désigne une instruction machine exécutable par un microprocesseur. Une telle instruction est constituée : - d'un opcode, ou code d'opération, codant la nature de l'opération à exécuter, et -d'un ou plusieurs opérandes définissant la ou les valeurs des paramètres de cette opération. 25 [0024] Un « code machine » est un ensemble d'instructions machines. Il s'agit typiquement d'un fichier contenant une succession de bits portant la valeur « 0 » ou « 1 », ces bits codant les instructions à exécuter par le microprocesseur. Le code machine est directement exécutable par le microprocesseur, c'est-à-dire sans nécessiter une compilation préalable. 30 [0025] Un « flot d'instructions » est une succession d'instructions classées les unes après les autres et qui forme, en code machine, une suite ordonnée de bits. Le flot d'instructions débute par une instruction initiale et se termine par une instruction finale. Par rapport à une instruction donnée du flot d'instructions, les instructions situées du côté de l'instruction initiale sont appelées « instruction amont » et les 35 instructions situées du côté de l'instruction finale, sont appelées « instructions aval ». Dans ce texte, ce flot d'instructions en mémoire est découpé en une succession de blocs de base immédiatement consécutifs ou séparés par des blocs de données. [0026] Dans ce texte, un « bloc de base » est un groupe d'instructions successives du flot d'instructions qui débute à une adresse de branchement et qui se termine par 40 une instruction de branchement. Ainsi, l'exécution d'un bloc de base débute 3060789 11 systématiquement par l'exécution de l'instruction située à son adresse de branchement et se termine systématiquement par l'exécution de l'instruction de branchement qui termine ce bloc de base. De préférence, un bloc de base ne comporte pas d'autres instructions de branchement que celle située à la fin de ce bloc 5 de base. Ainsi, les instructions d'un bloc de base sont systématiquement toutes lues par le processeur les unes après les autres dans l'ordre où elles sont présentes dans ce bloc de base. Toutefois, un bloc de base peut aussi contenir une ou plusieurs instructions de branchement conditionnel avant sa dernière instruction de branchement. La notion de bloc de base telle qu'elle est définie ici s'applique aux 10 parties du flot d'instructions qui sont chiffrées. S'il existe des parties non chiffrées du flot d'instructions, alors dans ces parties non chiffrées, il n'est pas nécessaire qu'un bloc de base débute à une adresse de branchement. [0027] Une « instruction de branchement » est une instruction qui, lorsqu'elle est exécutée par le microprocesseur, déclenche un saut vers l'adresse de branchement 15 d'un autre bloc de base du flot d'instructions. Cette instruction de branchement comporte donc au moins l'adresse de branchement de cet autre bloc de base. Typiquement, à cet effet, cette instruction remplace la valeur actuelle du compteur ordinal par la valeur de l'adresse de branchement. On rappelle que le compteur ordinal contient l'adresse de la prochaine instruction à exécuter par le 20 microprocesseur. En absence d'instruction de branchement, le compteur ordinal est incrémenté de 1 à chaque fois qu'une instruction est exécutée. En absence d'instruction de branchement, les instructions sont systématiquement exécutées séquentiellement les unes après les autres dans l'ordre où elles sont enregistrées dans une mémoire principale. L'instruction de branchement peut être inconditionnelle, 25 c'est à dire que le saut vers l'adresse de branchement est systématiquement réalisé dès que cette instruction est exécutée. Une instruction de branchement inconditionnel est par exemple l'instruction « JMP » en assembleur. L'instruction de branchement peut aussi être conditionnelle, c'est-à-dire que le saut vers l'adresse de branchement est déclenché lors de son exécution uniquement si une condition particulière est 30 vérifiée. Par exemple, une instruction de branchement conditionnel est une instruction « JE », « JA » ou « JNE » en assembleur. L'instruction de branchement peut aussi bien être un appel à une fonction. Dans ce texte, le terme « instruction de branchement » désigne aussi bien les instructions de branchement direct qu'indirect. Une instruction de branchement direct est une instruction de branchement qui 35 contient directement la valeur numérique de l'adresse de branchement. Une instruction de branchement indirect, est une instruction de branchement vers une adresse de branchement contenue dans une mémoire ou un registre du microprocesseur. Ainsi, contrairement à une instruction de branchement direct, une instruction de branchement indirect ne contient pas directement la valeur numérique 40 de l'adresse de branchement. 3060789 12 [0028] On appelle « instruction de branchement aval », une instruction qui provoque, lorsqu'elle est exécutée par un microprocesseur, un saut vers une instruction aval dans le flot d'instructions. [0029] On appelle « instruction de branchement amont », une instruction qui 5 provoque, lorsqu'elle est exécutée par un microprocesseur, un saut vers une instruction amont du flot d'instructions. [0030] Une « adresse de branchement » est l'adresse dans la mémoire principale à laquelle se trouve la première instruction d'un bloc de base. [0031] On parlera d'exécution d'une fonction pour désigner l'exécution des 10 instructions réalisant cette fonction. [0032] Dans un souci de simplification, dans cette description, ces instructions ne sont pas représentées sous forme binaire, mais plutôt sous une forme symbolique exprimée dans un langage évolué de plus haut niveau. En particulier, l'opcode est représenté de façon connue par un mnémonique. 15 [0033] La figure 1 représente un appareil électronique 1 comportant un microprocesseur 2, une mémoire principale 4 et un support 6 d'enregistrement d'informations. Par exemple, l'appareil 1 est un ordinateur, un smartphone, une tablette électronique ou similaire. [0034] Le microprocesseur 2 comporte ici : 20 - une unité arithmétique et logique 10 ; - un ensemble 12 de registres ; - un module de commande 14 ; - une interface 16 d'entrée/sortie de données, - un module 18 public de chiffrement par flot, 25 - un module 20 privé de déchiffrement par flot, et - une mémoire sécurisée 22 non volatile uniquement accessible par les modules 18 et 20. [0035] La mémoire 4 est configurée pour stocker des instructions devant être exécutées par l'unité 10. Ici, la mémoire 4 est une mémoire non sécurisée. Par 30 « mémoire non sécurisée », on désigne le fait qu'un programme utilisateur peut accéder au contenu de cette mémoire et en lire le contenu. Typiquement, la mémoire 4 est une mémoire volatile. Le compteur ordinal du microprocesseur 2 pointe sur cette mémoire 4. L'unité 10 est notamment configurée pour exécuter les instructions enregistrées dans la mémoire 4, dans l'ordre où ces instructions sont enregistrées 35 dans la mémoire 4, et, le cas échéant, pour enregistrer le résultat de ces instructions exécutées dans un ou plusieurs des registres 12. Ici, on considère qu'une instruction, pour être exécutée par l'unité 10, doit être placée dans la mémoire 4. Dans cette description, on utilisera comme synonymes « exécution par le microprocesseur 2 » et « exécution par l'unité 10 ». La mémoire 4 peut être une mémoire externe au 40 microprocesseur 2 comme représenté sur la figure 1. Dans ce cas, la mémoire 4 est 3060789 13 réalisée sur un substrat mécaniquement séparé du substrat sur lequel sont réalisés les différents éléments du microprocesseur 2 comme l'unité 10. Toutefois, en variante, la mémoire 4 peut aussi être une mémoire interne intégrée à l'intérieur du microprocesseur 2. Dans ce dernier cas, elle est réalisée sur le même substrat que 5 les autres éléments du microprocesseur 2. Enfin, dans d'autre configuration, la mémoire 4 se compose de plusieurs mémoires dont certaines sont des mémoires internes et d'autres des mémoires externes. [0036] Le module 14 est configuré pour déplacer des instructions entre l'ensemble 12 de registres et l'interface 16. A cet effet, le microprocesseur 2 comporte également 10 ici un bus d'échange de données 24. [0037] L'interface 16 est notamment apte à acquérir des données, par exemple depuis la mémoire 4 et le support 6 extérieurs au microprocesseur 2. [0038] Le support 6 est aussi une mémoire non sécurisée. Typiquement, il s'agit d'une mémoire non sécurisée non volatile. Par exemple, elle est du type EEPROM ou 15 Flash. Elle contient ici un code exécutable 30 d'un programme exécutable par le microprocesseur 2. Ce code exécutable 30 contient le code machine polymorphique d'une ou plusieurs fonctions prédéterminées. Pour simplifier l'illustration, seul un code machine polymorphique 40 est représenté sur la figure 1. [0039] Le module de chiffrement 18 est un module de chiffrement par flot également 20 connu sous le terme anglais de « stream cipher », c'est-à-dire qu'il chiffre les bits d'un flot d'instructions au fur et à mesure qu'ils arrivent sans attendre qu'un bloc de bits d'une longueur supérieure à un seuil prédéterminé soit entièrement reçu. Typiquement, le seuil prédéterminé est strictement supérieur à 1 et généralement supérieur à 32, 64 ou plus. Ici, le module de chiffrement 18 est un module de 25 chiffrement matériel réalisé sur le même substrat ou la même puce que l'unité arithmétique et logique 10. Par exemple, le module 18 est le module de chiffrement connu sous le nom de « Trivium ». Pour plus d'informations sur ce module de chiffrement 18, le lecteur peut se référer à l'article suivant : Christophe De Canniere et Bart Preneel : « TRIVIUM Specifications », eSTREAM, ECRYPT Stream Cipher 30 Project, 2006. [0040] Ainsi, par la suite, seul le principe de fonctionnement du module 18 est rappelé. Le module 18 comporte : - un générateur 26 de séquences pseudo-aléatoire, - un vecteur d'initialisation dont la valeur courante est notée IV, par la suite, et 35 - une clé secrète k. [0041] La séquence pseudo-aléatoire générée varie en fonction de la valeur courante IV, du vecteur d'initialisation et de la clé secrète k. Lors du chiffrement d'un flot d'instructions, chaque bit de ce flot d'instructions entrant dans le module 18 est combiné avec le dernier bit généré de la séquence pseudo-aléatoire. Cette séquence 40 pseudo-aléatoire s'allonge d'un bit à chaque fois qu'un bit entrant du flot d'instructions 3060789 14 est reçu. Pour combiner ces deux bits, le chiffrement Trivium utilise l'opération « ou exclusif », notée XOR. Au cours du chiffrement d'un flot d'instructions, la valeur du vecteur d'initialisation peut être renouvelée, c'est-à-dire que sa valeur peut être modifiée. Par contre, dans ce mode de réalisation, pour simplifier la description, on 5 suppose que la clé secrète k n'est jamais modifiée. Par exemple, elle est enregistrée dans la mémoire 22 lors de la fabrication du microprocesseur 2. Le module 18 peut être appelé par un programme utilisateur pour chiffrer un flux d'instructions avec une valeur IV, du vecteur d'initialisation imposée par ce programme utilisateur. Pour cela, le microprocesseur 2 est modifié de manière à pouvoir exécuter lors du chiffrement 10 d'un flux d'instructions : - une instruction de renouvellement notée Init(IV), et - une instruction de chiffrement Encrypt(m). [0042] Lorsque l'unité arithmétique et logique 10 exécute l'instruction Init(IV), en réponse, la valeur IV est enregistrée dans un registre 12 ou dans la mémoire 22. Le 15 fonctionnement de cette instruction lors du chiffrement et du déchiffrement est décrit plus en détail en référence aux figures 5 et 7. [0043] Lorsque l'instruction Encrypt(m) est exécutée par l'unité arithmétique et logique 10, les bits du mot m sont transmis les uns après les autres au module 18 qui, en réponse, retourne les bits les uns après les autres d'un cryptogramme M du mot m 20 obtenu en combinant bit à bit le mot m avec le mot de même longueur le plus récemment généré par le générateur 26. [0044] Le module 20 est un module de déchiffrement par flot qui réalise l'opération inverse de celle réalisée par le module 18. Il permet donc de déchiffrer un flot d'instructions chiffré par le module 18 lorsqu'il est initialisé avec le même vecteur 25 d'initialisation que celui utilisé par le module 18 pour chiffrer ce même flot d'instructions. À cet effet, il comporte : - son propre générateur 28 de séquences pseudo-aléatoire identique au générateur 26, - son propre vecteur d'initialisation qui peut prendre, au même instant, une valeur 30 différente de celle du vecteur d'initialisation du module 18, et - la même clé secrète k. [0045] Contrairement au module 18, le module 20 ne peut pas être directement appelé par un programme utilisateur. Autrement dit, il n'existe pas d'instruction qui permette de lancer explicitement le déchiffrement d'une instruction. Plus précisément, 35 à partir du moment où un mode chiffré du microprocesseur 2 est activé, le module 20 est systématiquement appelé pour déchiffrer la prochaine instruction à exécuter avant que celle-ci soit transmise à l'unité arithmétique et logique 10 pour y être exécutée. Il n'est donc pas nécessaire de disposer d'une instruction Decrypt(m) permettant d'appeler explicitement le module 20 pour déchiffrer le message m. 3060789 15 [0046] La figure 2 représente plus en détail le code machine polymorphique 40 d'une fonction prédéterminée destiné à être exécutée par le microprocesseur 2. Pour les principes généraux sur la structure et le fonctionnement d'un tel code machine polymorphique 40, le lecteur peut se référer à la demande US2015/0095659A1. Par 5 conséquent, seuls les détails nécessaires à la compréhension de l'invention sont décrits plus précisément. [0047] Le code 40 comporte une succession d'instructions aptes à être exécutées par le microprocesseur 2. Ainsi, ce code 40 est caractérisé par les instructions enregistrées sur le support 6. 10 [0048] Plus précisément, le code 40 comporte : -un bloc 42 d'instructions pour acquérir une valeur numérique apte à varier d'une exécution à la suivante du code 40, et -au moins un bloc d'instructions, appelé générateur 44 spécifique, apte à générer, lorsqu'il est exécuté par le microprocesseur 2, un flot d'instructions, dites instructions 15 cibles, qui réalise la fonction prédéterminée lorsque ces instructions cibles sont à leur tour exécutées par le microprocesseur 2. [0049] Ici, le bloc 42 obtient un aléa numérique (« random number » en langue anglaise) en tant que valeur numérique apte à varier d'une exécution à une autre du code 40. Par exemple, le bloc 42 acquiere l'aléa numérique à partir d'une source de 20 nombres pseudo-aléatoires. Cet aléa numérique est un nombre pseudo-aléatoire entier supérieur ou égal à 0 et inférieur ou égal à un seuil « RAND_MAX ». [0050] Le générateur 44 comporte ici : -un bloc d'instructions codant une pluralité de variantes 48 de codage de la fonction prédéterminée, 25 -des instructions de sélection 50 ; -un module 52 d'allocation de registres ; -un module 54 de traduction d'instructions ; -un module d'ordonnancement d'instructions, par la suite, appelé « ordonnanceur 56 », et 30 -un bloc d'instructions 60, dit de contrôle, aptes à placer dans la mémoire 4 le flot d'instructions cibles généré. [0051] Les instructions de sélection 50 et les modules 52, 54, 56 sont par exemple identiques à ceux déjà décrits dans la demande US2015/095659A1. Ainsi, seules quelques explications sur leur fonctionnement sont rappelées ici. 35 [0052] Chacune des variantes 48 génère, lorsqu'elle est exécutée par le microprocesseur 2, un flot spécifique d'instructions cibles réalisant la fonction prédéterminée. Chaque variante de codage est ainsi apte à produire un flot spécifique d'instructions qui est différent du flot d'instructions cibles généré par les autres variantes de codage mais qui sont tous fonctionnellement équivalents. Deux flots 40 d'instructions sont dits fonctionnellement équivalents s'ils produisent 3060789 16 systématiquement, lorsqu'ils sont exécutés par le microprocesseur 2, le même résultat à partir des mêmes données en entrée. Chacun de ces flots spécifiques d'instructions cibles se distingue les uns des autres par au moins : - un opcode différent, ou 5 - une valeur littérale différente, ou - un nombre d'instructions différent. [0053] Les instructions 50 permettent de choisir, parmi la pluralité de variantes 48, en fonction de l'aléa numérique acquis par l'exécution des instructions 42, une variante de codage à exécuter pour générer le flot spécifique d'instructions cibles. 10 [0054] Le module 52 est un bloc d'instructions configuré pour allouer, lorsqu'il est exécuté par le microprocesseur 2, un ou plusieurs registres de l'ensemble 12 pour l'exécution d'instructions sur l'unité 10. Un tel module 52 est connu en soi. Ce module 52 réalise cette affectation notamment en fonction d'une valeur d'un aléa numérique. Par exemple, ce module 52 comporte des instructions aptes à modifier, en fonction de 15 la valeur de l'aléa numérique, la valeur d'un opérande d'une instruction correspondant à l'identifiant d'un registre mémoire de l'ensemble 12. Ici, à cet effet, le module 52 comporte un bloc d'instructions pour acquérir une valeur d'un aléa numérique. Par exemple, ce module 52 est réalisé en implémentant les fonctionnalités du procédé de renommage de registre décrites dans le document W002/054228 A1. A titre 20 d'exemple, ce module 52 associe un registre « r5 » de l'ensemble 12 à un identifiant « A » de registre si la valeur de l'aléa numérique est paire et, sinon, il l'associe à un registre « r9 ». [0055] Le module 54 est un bloc d'instructions configuré pour générer les instructions cibles à partir des variantes de codage 48. 25 [0056] L'ordonnanceur 56 est un bloc d'instructions configuré pour modifier, en fonction d'un aléa numérique, l'ordre dans lequel les instructions cibles doivent être exécutées par l'unité 10. Cet ordonnanceur 56 reçoit en entrée : -une valeur d'un aléa numérique, et -une ou plusieurs instructions générées par le module 54 et auxquelles le module 52 30 a affecté un ou plusieurs registres. [0057] Cet ordonnanceur 56 fournit en sortie les instructions cibles dans l'ordre où elles doivent être exécutées par le microprocesseur 2. Ces instructions cibles placées les unes après les autres dans l'ordre où elles doivent être exécutées sont enregistrées, par l'ordonnanceur 56, dans une file d'attente. Par la suite, cette 35 succession d'instructions cibles placées les unes après les autres dans l'ordre où elles doivent être exécutées forme le flot d'instructions à exécuter pour réaliser la fonction prédéterminée. Cette file d'attente est réalisée à partir de registres internes du microprocesseur 2. Par exemple, la file d'attente est réalisée à l'aide de plusieurs registres de l'ensemble 12. A ce stade, le flot d'instructions généré n'est pas chiffré. 3060789 17 [0058] Le bloc 60 d'instructions de contrôle se charge ici de chiffrer chaque instruction du flot d'instructions avant de les enregistrer dans la mémoire 4. Les opérations réalisées par le bloc 60, lorsqu'il est exécuté par le microprocesseur 2, sont décrites plus en détail en référence aux figures 3 à 7. 5 [0059] Par exemple, le code 40 est construit à l'aide d'une version modifiée du logiciel « deGoal ». Ce logiciel « deGoal » permet notamment de créer un générateur de code machine polymorphique. Le principe de fonctionnement de ce logiciel est décrit dans les articles suivants : - Henri-Pierre Charles, Damien Couroussé, Victor Lomüller, Fernando A. Endo, and 10 Rémi Gauguey "deGoal a Tool to Embed Dynamic Code Generators into Applications," in Compiler Construction, 2014, vol. 8409. - Damien Couroussé, Victor Lomüller, and Henri-Pierre Charles "Introduction to Dynamic Code Generation - an Experiment with Matrix Multiplication for the STHORM Platform," in Smart Multicore Embedded Systems, Springer Verlag, 2013, 15 pp. 103-124. Dans ces articles, le générateur 44 est désigné sous le terme de « compilette » et le flot d'instructions cibles est désigné sous le terme de « kernel ». [0060] Ce logiciel « deGoal » est cependant modifié de façon à ce que la génération du code 20 - ne dépende pas de données fournies en entrée de la fonction prédéterminée à exécuter, -dépende d'un ou plusieurs aléas numériques, et - chiffre le flot d'instructions généré enregistré dans la mémoire 4. [0061] Un exemple de génération et d'exécution du code 40 va maintenant être 25 décrit plus en détail en référence à l'organigramme de la figure 3. [0062] Lors d'une étape 70, le programme 30 devant être exécuté est acquis automatiquement par un ordinateur afin d'y être compilé. Cet ordinateur peut être l'appareil 1 ou être un appareil distinct de l'appareil 1. [0063] Ici, le programme 30 comporte une fonction prédéterminée à exécuter sur le 30 microprocesseur 2 de façon sécurisée et, notamment, de manière à être le plus résistant possible contre des attaques par canal auxiliaire et contre des attaques par désassemblage d'instructions dans la mémoire 4. Souvent, cette fonction prédéterminée est une primitive cryptographique telle que l'algorithme de chiffrement connu sous le nom « Advanced Encryption Standard » (AES). Toutefois, pour 35 simplifier les explications, par la suite, la description est faite dans le cas particulier où cette fonction prédéterminée est une fonction qui calcule la somme des entiers positifs compris entre 1 et N. Les explications données dans ce cas particulier s'appliquent à toute autre fonction prédéterminée. [0064] Dans cet exemple, lors de l'étape 70, la fonction prédéterminée est d'abord 40 acquise sous la forme d'un code source puis compilée pour former le code machine 3060789 18 polymorphique 40. Cette étape 70 est, par exemple, réalisée comme décrit dans la demande US2015/095659A1. [0065] A l'issue de cette étape, lors d'une étape 72, le code 40 est chiffré. Par exemple, le code 40 est chiffré en mettant en oeuvre un chiffrement par flot. Ici, pour 5 simplifier l'exécution du code 40 sur le microprocesseur 2, le code 40 est chiffré en mettant en oeuvre un chiffrement par flot identique à celui qui sera utilisé lors de l'exécution du code 40 par le microprocesseur 2. A cet effet, un module de chiffrement par flot identique au module 18 est utilisé. En particulier, le code 40 est chiffré en utilisant la même clé secrète k que celle utilisée par les modules 18 et 20 et 10 enregistrée dans la mémoire sécurisée 22. Ce chiffrement par flot mis en oeuvre lors de l'étape 72 est décrit en détail plus loin dans le cas particulier où il est utilisé pour chiffrer le flot d'instructions généré par l'exécution du générateur 44. [0066] Lors d'une étape 74, le programme 30 et le code 40 chiffré sont enregistrés sur le support 6. 15 [0067] Une phase 80 d'exécution du programme 30 et du code 40 par le microprocesseur 2 peut alors débuter. [0068] Tout d'abord, lors d'une étape 82, juste avant le début de l'exécution du code 40, le microprocesseur 2 passe dans un mode de fonctionnement appelé « mode chiffré ». Lorsque le microprocesseur 2 est dans ce mode, chaque instruction à 20 exécuter est d'abord déchiffrée avant d'être exécutée. A l'inverse, dans un mode de fonctionnement appelé « mode non-chiffré », les instructions à exécuter sont chargées depuis la mémoire 4 vers le microprocesseur 2 et sont exécutées sans procéder au préalable à leur déchiffrement. Pour basculer entre les modes chiffré et non-chiffré, le microprocesseur 2 est apte : 25 - à exécuter une instruction Enable_Encrypt qui bascule le microprocesseur 2 du mode non-chiffré vers le mode chiffré immédiatement après la fin du bloc de base en cours d'exécution , et - à exécuter une instruction Disable_Encrypt qui bascule le microprocesseur 2 du 30 mode chiffré vers le mode non-chiffré immédiatement après la fin du bloc de base en cours d'exécution. [0069] L'instruction Enable_Encrypt peut se trouver à n'importe quel endroit du bloc de base en cours d'exécution, et être exécutée à n'importe quel moment au cours de l'exécution de ce bloc de base. Le basculement vers le mode chiffré se fait toujours 35 lors de l'exécution de la prochaine instruction de branchement. Il n'est donc pas nécessaire que l'instruction Enable_Encrypt se trouve immédiatement avant la fin du bloc de base en cours d'exécution. [0070] Par exemple, ici, le programme 30 comporte une instruction Enable_Encrypt et une instruction Init(IV0) juste avant le début du code 40 et une instruction 3060789 19 Disable_Encrypt juste à la fin du code 40. Ainsi, lors du passage dans le mode chiffré, le vecteur d'initialisation du module 20 est initialisé avec la valeur IV°. [0071] Ensuite, lors d'une étape 84, le code 40 chiffré est transféré dans la mémoire 4 et une étape 86 d'exécution du code 40 débute. 5 [0072] Lors de l'étape 86, à chaque fois que le microprocesseur charge depuis la mémoire 4 une instruction à exécuter, le module 20 déchiffre d'abord cette instruction puis l'instruction déchiffrée est transmise à l'unité arithmétique et logique 10 qui l'exécute. Ici, le déchiffrement des instructions du code 40 est mis en oeuvre comme décrit plus en détail dans le cas du déchiffrement du flot d'instructions généré par le 10 générateur 44. [0073] En particulier, lors de l'étape 86, le microprocesseur 2 exécute le générateur 44. En réponse, le générateur 44 génère un flot d'instructions apte, lorsqu'il est exécuté à son tour par le microprocesseur 2, à réaliser la fonction prédéterminée. [0074] La génération de ce flot d'instructions se déroule comme décrit dans la 15 demande de US2015/0095659A1. En particulier, lors de la génération du flot d'instructions, le générateur 44 sélectionne de façon aléatoire une variante de codage du flot d'instructions parmi une pluralité de variantes 28 possibles. Ainsi, d'une exécution à la suivante, le codage du flot d'instructions généré varie, ce qui rend difficile toute tentative d'attaque par observation de canaux auxiliaires. De plus, ici, 20 les registres utilisés et l'ordonnancement du flot d'instructions varient aléatoirement à chaque exécution du générateur 44. Ceci rend donc encore plus difficile la cryptanalyse de la fonction prédéterminée par observation de canaux auxiliaires. [0075] Après l'exécution de l'ordonnanceur 56, le flot d'instructions généré est enregistré dans une file d'attente formée dans l'ensemble 12 de registres. Dans cette 25 file d'attente, les instructions du flot d'instructions généré sont «en clair», c'est-à-dire qu'elles ne sont pas chiffrées et donc directement exécutables par l'unité arithmétique et logique 10. [0076] L'exécution du bloc de contrôle 60 conduit alors à chiffrer, au fur et à mesure qu'elles sont générées, les instructions du flot d'instructions contenues dans la file 30 d'attente, en mettant en oeuvre un chiffrement par flot exécuté par le module 18, puis à transférer les instructions nouvellement chiffrées vers la mémoire 4. Dès lors, le flot d'instructions enregistré dans la mémoire 4 est chiffré, ce qui rend plus difficile toute tentative de cryptanalyse par désassemblage des instructions du flot d'instructions généré. Le chiffrement du flot d'instructions généré est décrit plus en détail en 35 référence à la figure 5. [0077] Ensuite, lors d'une étape 88, le flot d'instructions chiffré contenu dans la mémoire 4 est exécuté par le microprocesseur 2. [0078] Lors de cette étape 88, à chaque fois que le microprocesseur 2 charge depuis la mémoire 4 une instruction du flot d'instructions chiffré, celle-ci est d'abord 40 déchiffrée par le module 20 puis exécutée par l'unité arithmétique et logique 10. Le 3060789 20 déchiffrement des instructions du flot d'instructions chiffré est décrit plus en détail en référence à la figure 7. [0079] Typiquement, le code 40 se termine par l'instruction Disable_Encrypt puis une instruction de branchement. Aussi, lorsque l'exécution du code 40 est terminée, lors 5 d'une étape 90, le microprocesseur 2 retourne dans le mode non-chiffré puis poursuit l'exécution du programme 30. [0080] Lors de la même exécution du programme 30, le code 40 peut être exécuté plusieurs fois. Aussi, lors de la même exécution du programme 30, les étapes 82 à 90 peuvent être réitérées plusieurs fois. 10 [0081] Le chiffrement et le déchiffrement du flot d'instructions généré par l'exécution du générateur 44 vont maintenant être décrits dans le cas particulier du flot d'instructions représenté sur la figure 4. [0082] La figure 4 représente le flot d'instructions de la fonction prédéterminée écrit dans un langage de haut niveau comme, par exemple, en langage C. Les symboles 15 « ET1 », « ET2 », « ET3 » et « ET4 » sont des étiquettes ou « label » en anglais vers lesquelles une instruction de branchement peut renvoyer. Le flot d'instructions est divisé en une succession de blocs de base ou « basic block » en anglais. Sur la figure 4, les différents blocs de base de la fonction prédéterminée portent les références BB1, BB2, BB3 et BB4. Sur cette figure, les instructions de branchement 20 correspondent aux instructions « Goto ET2», « If i=N, then Goto ET4 Else Goto ET3 » et « Goto ET2 ». Plus précisément, ici l'instruction « Goto ET2 » est une instruction de branchement aval inconditionnelle. L'instruction « If i=N, then Goto ET4 Else Goto ET3 » correspond à une instruction de branchement aval conditionnel « If i = N, then Goto ET4 » et à une instruction de branchement amont conditionnel « If i # N, then 25 Goto ET3 ». Par la suite, elle est donc traitée comme une succession de deux instructions de branchement. L'instruction « Goto ET2 » est une instruction de branchement amont inconditionnelle. Chaque bloc de base se termine par une instruction de branchement et ne comporte au plus qu'une seule instruction de branchement inconditionnel. Entre deux blocs de base immédiatement successifs 30 dans le flot d'instructions généré, il est normalement inutile d'ajouter une instruction de branchement aval inconditionnel vers le bloc de base immédiatement consécutif. Toutefois, pour respecter systématiquement la syntaxe d'un bloc de base chiffré telle que définie dans cette demande, le générateur 44 est apte à ajouter, si celle-ci n'est pas déjà présente, une instruction de branchement inconditionnel vers le bloc de 35 base suivant à la fin du bloc de base précédent. En effet, comme cela est expliqué plus loin, dans le mode chiffré, l'instruction de branchement est utilisée par le bloc de contrôle 60 pour identifier la fin d'un bloc de base. Elle doit donc être systématiquement présente à la fin de chaque bloc de base dans les cas où : (1) le bloc de base généré sera chiffré, ou 3060789 21 (2) le bloc de base contient une instruction Enable_Encrypt ou Disable_Encrypt afin de garantir le changement de mode d'exécution lors du passage au bloc de base suivant. C'est donc pour cette raison que le bloc BB1 se termine par une instruction de 5 branchement inconditionnel vers le bloc BB2. [0083] Il existe plusieurs possibilités pour introduire systématiquement une instruction de branchement à la fin d'un bloc de base. Par exemple, dans un premier mode de réalisation, lorsque le bloc de contrôle 60 rencontre le début d'un bloc de base suivant sans que la fin du bloc de base précédent contienne une instruction de 10 branchement, il ajoute automatiquement dans le flot d'instructions et à la fin du bloc de base précédent, une instruction de branchement inconditionnelle vers le bloc de base suivant. Le début d'un bloc de base est détecté par la présence d'une étiquette qui permet de sauter directement d'un autre bloc de base du code 40 vers ce bloc de base 15 [0084] Le symbole « » dans le bloc BB4 indique que la représentation des instructions contenues dans ce bloc a été omise. [0085] Notons qu'il ne s'agit que d'une description générique de la fonction prédéterminée. Le flot d'instructions spécifique utilisé pour réaliser cette fonction prédéterminée n'est connu qu'au moment de l'exécution du générateur 44 par le 20 microprocesseur 2. [0086] La figure 5 présente un procédé de chiffrement par flot du flux d'instructions généré par l'exécution du générateur 44. Ce procédé est adapté au cas où les blocs de base à chiffrer ne comportent aucune instruction de branchement indirect et aucun appel à une fonction. Dans ce procédé, le bloc de contrôle 60 traite dans l'ordre les 25 instructions successives du flux d'instructions généré depuis l'instruction initiale jusqu'à l'instruction finale de ce flot. [0087] Plus précisément, initialement, le bloc de contrôle 60 initialise la valeur du vecteur d'initialisation du module 18 avec la valeur IV° enregistrée dans l'ensemble 12 ou dans la mémoire 22 par l'exécution de l'instruction Init(IV0). À ce stade, la valeur 30 du vecteur d'initialisation du module 18 est donc égale à IV°. [0088] Ensuite, le bloc de contrôle 60 traite les instructions du flot d'instructions généré contenu dans l'ensemble 12 de registre les unes après les autres. [0089] Lors d'une étape 102, à chaque fois qu'une nouvelle instruction est traitée par le bloc de contrôle 60, il vérifie si l'adresse de cette instruction est une adresse de 35 branchement. L'adresse de l'instruction et l'adresse de branchement sont des adresses relatives par rapport au début du flot d'instructions généré. Par exemple, chaque adresse est un numéro d'ordre de l'instruction compté à partir de l'instruction initiale du flot d'instructions généré. [0090] Lors d'une étape 104, si l'adresse de l'instruction traitée correspond à une 40 adresse de branchement, le bloc de contrôle 60 obtient une valeur numérique IV, qu'il 3060789 22 associe à cette adresse de branchement. Typiquement, cette valeur numérique IV, est différente, ou presque toujours différente, des valeurs numériques associées aux autres adresses de branchement. Par exemple, pour cela, la valeur numérique IV, est un aléa numérique obtenu, par exemple, de la même façon que lors de l'étape 86. 5 [0091] Ensuite, cette adresse de branchement est associée à cette valeur numérique IV,. Par exemple, cette adresse de branchement est enregistrée dans une table TA associée à la valeur numérique IV,. Ici, à titre d'illustration, la même table TA est aussi utilisée pour associer l'étiquette correspondant à cette adresse de branchement et la valeur numérique de cette adresse de branchement. On rappelle 10 ici qu'une adresse de branchement est une valeur numérique alors que l'étiquette est un symbole identifiant l'adresse de branchement. [0092] Finalement, le bloc de contrôle 60 transmet une instruction Init(IV,) à l'unité arithmétique et logique 10. En réponse, l'unité arithmétique et logique 10 l'exécute, ce qui provoque le remplacement immédiat de la valeur précédente du vecteur 15 d'initialisation du module 18 par la valeur IV,. La valeur IV, devient donc la valeur courante IN/c. Ainsi, toutes les instructions suivantes du bloc de base qui débutent à cette adresse de branchement sont chiffrées en utilisant la valeur IV, pour le vecteur d'initialisation du module 18. [0093] Ensuite, lors d'une étape 106, le bloc de contrôle 60 vérifie si l'instruction 20 traitée est une instruction de branchement. [0094] Dans l'affirmatif, il procède à une étape 108. Lors de l'étape 108, le bloc de contrôle 60 relève l'étiquette vers laquelle l'instruction de branchement redirige. Par exemple, ici, l'étiquette relevée est l'une des étiquettes ET1, ET2, ET3 ou ET4. Si l'étiquette relevée est déjà associée dans la table TA à une adresse de branchement, 25 alors l'étiquette est remplacée, dans l'instruction de branchement, par l'adresse de branchement correspondante qui lui est associée. Ce cas de figure correspond au cas d'une instruction de branchement amont. De plus, dans le cas d'une étiquette de branchement amont, l'adresse de branchement est déjà associée à une valeur IV, du vecteur d'initialisation. 30 [0095] Si l'étiquette relevée n'est pas déjà associée dans la table TA à une adresse de branchement, alors cela signifie que l'instruction de branchement traitée est une instruction de branchement aval. Si l'étiquette relevée n'est pas déjà associée à une valeur numérique IV, dans la table TA, alors le bloc de contrôle 60 obtient une nouvelle valeur numérique IV, et associe l'étiquette relevée à cette nouvelle valeur 35 numérique obtenue dans la table TA. Pour cela, par exemple, le bloc de contrôle 60 obtient la nouvelle valeur IV, comme décrit pour l'étape 104. [0096] Ensuite, le bloc de contrôle 60 ajoute dans le flot d'instructions généré, juste avant cette instruction de branchement, une instruction Init(IV,). [0097] Une fois l'étape 108 terminée, lors d'une étape 110, l'instruction Init(IV,) 40 ajoutée est ensuite transmise au module 18 qui la chiffre à l'aide de la valeur 3060789 23 courante IV. du vecteur d'initialisation de ce module 18. Une fois chiffrée, l'instruction Init(IV,) est enregistrée dans la mémoire 4 juste après la précédente instruction chiffrée par le module 18. [0098] Dans le cas de l'instruction « If i = N then Goto ET4, Else Goto ET3 », celle-ci 5 est traitée comme la succession de deux instructions de branchement conditionnel. Dans ce cas, juste avant chaque instructions de branchement conditionnel, une instruction Init(IV,) spécifique à son adresse de branchement est ajoutée. Pour cela, par exemple, les étapes 108 et 110 sont réalisées pour chaque adresse de branchement. 10 [0099] Ensuite, lors d'une étape 120, le bloc de contrôle 60 vérifie si l'instruction traitée est une instruction de branchement aval. En effet, dans le cas d'une instruction de branchement amont, la valeur numérique de l'adresse de branchement qui doit être substituée à l'étiquette est immédiatement disponible dans la table TA de sorte que l'instruction de branchement amont peut être immédiatement chiffrée par le 15 module 18. Dans le cas d'une instruction de branchement aval, la valeur numérique de l'adresse de branchement correspondant à l'étiquette n'est pas immédiatement déterminable. En particulier, dans le cas d'un code machine polymorphique, elle dépend des variantes de codage sélectionnées ou qui seront sélectionnées pour des blocs de base situés en aval. Or, selon la variante sélectionnée, le nombre 20 d'instructions de ces blocs de base varie ou peut varier. Ainsi, lorsque le bloc de contrôle 60 rencontre une instruction de branchement aval, il ne peut pas immédiatement remplacer l'étiquette par la valeur numérique de l'adresse de branchement. Par exemple, ce problème se pose dans le cas de l'instruction de « If i = N then Goto ET4 ». En effet, au moment du chiffrement de cette instruction, 25 l'adresse de branchement correspondant à l'étiquette ET4 n'est pas immédiatement déterminable. [00100] Si l'instruction de branchement est une instruction de branchement aval, lors d'une étape 122, le bloc de contrôle 60 réserve dans la mémoire 4 à l'emplacement où doit être enregistrée cette instruction de branchement aval un espace de même 30 taille que cette instruction de branchement. [00101] Ensuite, lors d'une étape 124, une fonction de rappel Recall(IV., n0) est associée à l'étiquette ET4. Cette fonction Recall(IV., n0) est paramétrée par : - la valeur IV. courante du vecteur d'initialisation du module 18, et - par un nombre n, identifiant la position du groupe de bits de la séquence pseudo35 aléatoire générée par le générateur 26 à combiner avec cette instruction de branchement aval pour obtenir son cryptogramme. [00102] Ce cryptogramme doit être identique à celui qui aurait été obtenu si l'adresse de branchement avait été immédiatement déterminable au moment où l'on cherche à chiffrer pour la première fois cette instruction de branchement aval. Ici, le nombre n. 40 est le numéro d'ordre de cette instruction de branchement aval compté à partir de la 3060789 24 première instruction chiffrée en utilisant la valeur IV, du vecteur d'initialisation, c'est-à-dire à partir de la première instruction du bloc de base en cours de chiffrement. [00103] Ici, on suppose que toutes les instructions ont la même longueur et que cette longueur est égale à la longueur d'un mot. Par exemple, la longueur d'un mot est 5 constante et égale à 32 bits. Dès lors, à partir de la connaissance du nombre no, il est possible de déterminer la position, dans la séquence pseudo-aléatoire générée, des 32 bits à combiner avec cette instruction de branchement aval pour la chiffrer. [00104] Par exemple, chaque fonction de rappel est associée à une étiquette grâce à une table qui contient sur la même ligne l'étiquette et l'adresse de la fonction de 10 rappel à appeler. [00105] En parallèle, lors d'une étape 130, à chaque fois qu'une nouvelle étiquette est associée à la valeur numérique d'une adresse de branchement dans la table TA lors de l'étape 104, le bloc de contrôle 60 vérifie si cette nouvelle étiquette correspond à une étiquette associée à une ou plusieurs fonctions de rappel. 15 [00106] Dans l'affirmative, lors d'une étape 132, chaque fonction de rappel associée à cette nouvelle étiquette est exécutée. Lors de l'exécution de cette fonction de rappel, l'étiquette présente dans l'instruction de branchement qui n'avait pas jusqu'à présent pu être chiffrée est remplacée par la valeur numérique de l'adresse de branchement qui est maintenant connue. Ensuite, la fonction de rappel renouvelle la valeur 20 numérique du vecteur d'initialisation du module 18 en la remplaçant par la valeur de son paramètre IV,. Puis, n,-1 mots sont transmis au module 18 pour que la séquence pseudo-aléatoire retrouve le même état que celui qui était le sien juste avant le chiffrement de l'instruction de branchement aval. Par exemple, le bloc de contrôle 60 réalise cela en appelant (no-1) fois la fonction Encrypt(m), où m est un mot de 32 bits 25 par exemple tiré aléatoirement ou pseudo-aléatoirement. Ensuite, le bloc de contrôle 60 appelle la fonction Encrypt(m) dans laquelle le mot m est cette fois-ci égal à l'instruction de branchement aval dans laquelle l'étiquette a été remplacée par l'adresse de branchement. En réponse, le module 18 retourne l'instruction de branchement aval chiffrée au bloc de contrôle 60. Le bloc de contrôle 60 enregistre 30 alors dans l'espace de la mémoire 4 réservé à cet effet l'instruction de branchement aval chiffrée ainsi obtenue. [00107] Si lors de l'étape 106 l'instruction traitée n'est pas une instruction de branchement ou si lors de l'étape 120 l'instruction traitée n'est pas une instruction de branchement aval, alors le procédé se poursuit par une étape 140 de chiffrement de 35 l'instruction traitée. Plus précisément, l'instruction traitée est transmise au module 18 qui la chiffre à l'aide de la valeur courante IV, du vecteur d'initialisation du module 18. [00108] Ensuite, lors d'une étape 142, le bloc de contrôle 60 enregistre l'instruction ainsi chiffrée dans la mémoire 4 à la suite de la précédente instruction du flot d'instructions. Dans le cas où l'instruction traitée est une instruction de branchement, 40 l'instruction de branchement chiffrée est donc enregistrée dans la mémoire 4 3060789 25 immédiatement après l'instruction Init(IV,) ajoutée avant cette instruction de branchement. [00109] La figure 6 représente, en langage C, le même flot d'instructions que celui représenté sur la figure 4 mais après que les instructions Init(IV,) aient été ajoutées 5 dans ce flot d'instructions en suivant le principe décrit dans le procédé de la figure 5. Sur cette figure, les différentes valeurs utilisées pour renouveler le vecteur d'initialisation du module 18 sont notées IV2, IV3 et IV4. [00110] L'exécution du flot d'instructions chiffré enregistré dans la mémoire 4 va maintenant être décrite en référence au procédé de la figure 7. 10 [00111] Lors d'une étape 150, juste avant le début de l'exécution du flot d'instructions chiffré, la valeur du vecteur d'initialisation du module 20 est initialisée avec la même valeur que celle qu'avait le module 18 au début du chiffrement de ce flot d'instructions. Par exemple, pour cela, le microprocesseur 2 exécute successivement une instruction Enable_Encrypt, une instruction Init(IV0) puis une instruction de 15 branchement vers l'adresse de branchement du premier bloc de base du flot d'instructions chiffré. L'instruction Enable_Encrypt ramène le microprocesseur 2 dans son mode chiffré s'il avait, entre-temps, basculé vers le mode non-chiffré. [00112] Ensuite, lors d'une opération 152, le microprocesseur 2 charge depuis la mémoire 4, les unes après les autres et dans l'ordre où elles sont enregistrées, les 20 instructions chiffrées du flot d'instructions. [00113] Dans le mode chiffré, à chaque fois qu'une instruction est chargée, celle-ci est d'abord transmise au module 20 qui la déchiffre. Ensuite, l'instruction déchiffrée est transmise, sans passer par la mémoire 4, à l'unité arithmétique et logique 10 qui l'exécute. 25 [00114] Lorsque l'unité arithmétique et logique 10 exécute l'instruction Init(IV,), cela charge immédiatement la valeur IV, dans un registre de l'ensemble 12 ou dans la mémoire 22. Ensuite, à chaque fois que l'unité arithmétique et logique exécute un branchement vers une adresse de branchement, la valeur du vecteur d'initialisation du module 20 est remplacée par la valeur IV, enregistrée dans le registre de 30 l'ensemble 12 ou dans la mémoire 22 par la dernière instruction Init(IV,) exécutée. Ainsi, immédiatement après un saut vers un autre bloc de base, toutes les instructions suivantes sont déchiffrées avec cette nouvelle valeur IV, du vecteur d'initialisation du module 20 jusqu'à ce que le microprocesseur exécute la prochaine instruction de branchement. 35 [00115] La figure 8 représente un procédé alternatif de chiffrement par flot susceptible d'être mis en oeuvre à la place du procédé de la figure 5. Ce procédé, contrairement à celui de la figure 5, fonctionne même si les blocs de base à chiffrer comportent des instructions de branchement indirect et/ou des appels à des fonctions. Ce procédé est identique à celui de la figure 5 sauf que l'étape 104 est remplacée par une étape 160 40 et les étapes 106, 108 et 110 sont omises. 3060789 26 [00116] L'étape 160 est identique à l'étape 104 sauf que le bloc de contrôle 60 insère au début du bloc de base l'instruction Init(IV,) et enregistre cette instruction Init(IV,) en clair dans la mémoire 4 à l'emplacement correspondant à l'adresse de branchement du bloc de base. Ainsi, chaque bloc de base débute par une instruction de 5 renouvellement en clair et la suite des instructions de ce bloc de base sont chiffrées à l'aide de la valeur IV, contenue dans cette instruction de renouvellement. [00117] Lors de l'exécution du flot d'instructions chiffré à l'aide du procédé de la figure 8, le déchiffrement se déroule comme décrit en référence à la figure 7 sauf que, à chaque fois qu'une instruction est chargée, le microprocesseur 2 vérifie d'abord s'il 10 s'agit d'une instruction de renouvellement. Dans l'affirmative, il ne procède pas au déchiffrement de cette instruction de renouvellement et la transmet immédiatement à l'unité arithmétique et logique 10 qui l'exécute immédiatement. Dans ce mode de réalisation, l'exécution de l'instruction Init(IV,) remplace immédiatement la valeur courante IV, du vecteur d'initialisation du module 20 par la nouvelle valeur IV,. Ainsi, 15 contrairement au mode de réalisation précédent, dans ce mode de réalisation, ce n'est pas l'exécution d'une instruction de branchement qui déclenche le renouvellement de la valeur du vecteur d'initialisation du module 20. De plus, dans ce mode de réalisation, chaque instruction de renouvellement est systématiquement située au début d'un bloc de base et non pas systématiquement située avant une 20 instruction de branchement. [00118] La figure 9 représente un procédé de chiffrement par flot susceptible d'être mis en oeuvre à la place du procédé de la figure 8. Ce procédé est identique au procédé de la figure 8 sauf que : - les étapes 122 et 124 sont remplacées par des étapes 172 à 180, et 25 - l'étape 132 est remplacée par une étape 182. [00119] Lors de l'étape 172, le bloc de contrôle 60 insère dans le flot d'instructions un bloc de base aval immédiatement après le bloc de base courant et avant le bloc de base suivant. Ainsi, l'adresse de branchement de ce bloc de base aval est connue. De plus, le bloc de base aval a une taille connue à l'avance car il comporte 30 systématiquement le même nombre d'instructions. Le bloc de base aval inséré débute par une instruction de renouvellement et se termine par une copie à l'identique de l'instruction de branchement aval traitée. L'instruction de renouvellement du bloc de base aval est générée, par exemple, de la même façon que lors de l'étape 160. 35 [00120] Lors d'une étape 174, l'instruction de branchement aval du bloc de base traitée, c'est-à-dire du bloc de base située juste avant le bloc de base aval inséré, est remplacée par une instruction de branchement inconditionnel vers l'adresse de branchement du bloc de base aval. [00121] Lors d'une étape 176, cette instruction de branchement inconditionnel est 40 transmise au module 18 qui la chiffre. Le bloc de contrôle 60 enregistre alors dans la 3060789 27 mémoire 4 l'instruction de branchement inconditionnel juste après la dernière instruction chiffrée enregistrée dans la mémoire 4. Ainsi, l'instruction de branchement inconditionnel chiffré est enregistrée à la place qu'aurait dû occuper l'instruction de branchement aval. 5 [00122] Lors d'une étape 178, le bloc de contrôle 60 réserve ensuite dans la mémoire 4 un espace, à la suite de l'instruction de branchement inconditionnel chiffré, dont la taille est supérieure ou égale à la taille du bloc de base inséré. [00123] Enfin, lors d'une étape 180, le bloc de contrôle 60 associe à l'étiquette de l'instruction de branchement aval traité une fonction de rappel Recall(). 10 [00124] Ensuite, le procédé se poursuit par le traitement de la première instruction du bloc de base situé immédiatement après le bloc de base aval. Ainsi, à ce stade, le bloc de base aval n'est pas chiffré. [00125] Lors de l'étape 182, le bloc de contrôle 60 : - remplace l'étiquette contenue dans l'instruction de branchement aval par l'adresse 15 de branchement qui est maintenant connue, puis - chiffre le bloc de base aval. [00126] Pour chiffrer le bloc de base aval, le microprocesseur 2 commence par exécuter l'instruction Init(IV;) située au début de ce bloc de base aval. Ensuite, l'instruction de branchement aval, dans laquelle l'étiquette a été remplacée par la 20 valeur numérique de l'adresse de branchement correspondante, est chiffrée à l'aide de la valeur IV; du vecteur d'initialisation du module 18. [00127] Enfin, le bloc de base aval contenant l'instruction Init(IV;) en clair et l'instruction de branchement aval chiffrée est enregistré dans la mémoire 4 dans l'espace réservé à cet effet. 25 [00128] L'exécution et le déchiffrement du flot d'instructions chiffré obtenu avec le procédé de la figure 9 est identique à celui décrit dans le cas de la figure 8. [00129] Dans le mode de réalisation de la figure 9, la fonction Recall() n'a pas besoin d'être paramétrée par une valeur IV, du vecteur d'initialisation et par un nombre n, comme dans le mode de réalisation précédent. 30 [00130] La figure 10 représente un procédé de chiffrement par flot susceptible d'être utilisé à la place du procédé de la figure 5 ou 8. Ce procédé exploite le fait que l'opération de chiffrement par flot mise en oeuvre est une fonction homomorphique par rapport à l'opération XOR. Autrement dit : Encrypt(m) XOR Encrypt(r) = Encrypt(m XOR r), où Encrypt (...) est la fonction de chiffrement exécutée par le module 18 avec 35 un vecteur d'initialisation et une clé secrète donnée. [00131] Par exemple, le procédé de chiffrement de la figure 10 est identique au procédé de la figure 5 sauf que : - les étapes 122, 124 sont remplacées par, respectivement, des étapes 200 et 201, et - l'étape 132 est remplacée par une étape 202. 3060789 28 [00132] Lors de l'étape 200, le bloc de contrôle 60 remplace l'instruction de branchement aval par un cryptogramme R obtenu en chiffrant un mot r connu. Par exemple, pour cela, le bloc de contrôle 60 transmet au module 18 le mot r et obtient en retour le mot R. On a donc R = Encrypt(r). Le mot R est de même taille que 5 l'instruction de branchement aval chiffrée. Ensuite, le mot R est enregistré dans la mémoire 4 à la place de l'instruction de branchement aval à chiffrer. [00133] L'étape 201 est identique à l'étape 124 sauf que la fonction de rappel associée à l'étiquette correspondant à l'adresse de branchement comporte un paramètre supplémentaire, à savoir la valeur du mot r utilisée pour générer le 10 cryptogramme R. [00134] Lors de l'étape 202, l'exécution de la fonction de rappel provoque : a) le remplacement, dans l'instruction de branchement aval, de l'étiquette par la valeur numérique de l'adresse de branchement correspondante, l'instruction de branchement paramétrée par l'adresse de branchement forme alors un mot i, 15 b) la détermination d'un mot x tel que x XOR r = c) l'initialisation du module 18 avec la valeur IV, du paramètre de la fonction de rappel, d) la transmission de n,-1 mots au module 18, puis e) la transmission du mot x déterminé au module 18 qui retourne, en réponse, le 20 cryptogramme X du mot x, f) la combinaison des cryptogrammes X et R pour obtenir le cryptogramme I de l'instruction de branchement aval selon la relation suivante : I = X XOR R, et g) l'enregistrement du cryptogramme I dans la mémoire 4 à la place du cryptogramme R. 25 [00135] Les opérations c) et d) ci-dessus ont déjà été décrites en détail en référence à l'étape 132. [00136] Lors de l'opération f), la relation X XOR R peut aussi s'écrire de la façon suivante : Encrypt(x) XOR Encrypt(r) = Encrypt(x XOR r) = Encrypt (i). On comprend donc que cette relation permet d'obtenir le cryptogramme I sans jamais envoyer au 30 module 18 l'instruction de branchement aval. [001371 Variante du code machine polymorphique : [00138] D'autres procédés que celui décrit dans la demande US2015/0096569A1 sont possibles pour générer le code machine polymorphique. Par exemple, un autre procédé est décrit dans l'article de Giovanni Agosta et al., « A code morphing 35 methodology to automate power analysis countermeasures », Proceedings of the 49th Annual ACM/IEEE Design Automation Conference (DAC'12), pages 77-82, Juin 2012. [00139] Les différentes variantes décrites à la fin de la demande US2015/0096569A1 peuvent aussi être adaptées et combinées aux modes de réalisation décrit ici. 3060789 29 [00140] Le module 52 et/ou l'ordonnanceur 56 peuvent être omis. Dans ce cas, l'allocation des registres et/ou l'ordre des instructions du flot d'instructions généré ne varie pas en fonction d'un aléa numérique. [00141] Il n'est pas nécessaire de tirer aléatoirement ou pseudo-aléatoirement la 5 valeur numérique qui est utilisée pour sélectionner la variante de codage 28. Par exemple, en variante, cette valeur numérique est fonction des conditions dans lesquelles s'exécute le code 40. Par exemple, cette valeur numérique dépend de la température du microprocesseur, du temps d'allumage de l'appareil 1 ou de tout autre paramètre susceptible de varier d'une exécution à la suivante du code 40. Cette 10 valeur numérique peut aussi varier en fonction du contexte dans lequel s'exécute le code 40 comme par exemple en fonction de la quantité de mémoire disponible, de la fréquence du microprocesseur, du type de système d'exploitation ou autre. [00142] En variante, le code 40 et, en particulier, le générateur 44 ne sont pas chiffrés. 15 [00143] Dans un autre mode de réalisation, seul le générateur 44 est chiffré. Par contre, le flot d'instructions généré par ce générateur 44, lorsqu'il est exécuté, n'est pas chiffré. [00144] Il est aussi possible d'empiler les générateurs. Par exemple, un premier générateur génère le code d'un second générateur qui génère lui-même, lorsqu'il est 20 exécuté par le microprocesseur 2, le code d'un troisième générateur qui, lorsqu'il est exécuté, génère le flot d'instructions qui réalise la fonction prédéterminée. [00145] Dans une variante, l'algorithme utilisé pour chiffrer le code 40 est différent de celui utilisé pour chiffrer le flot d'instructions généré par le générateur 44. Par exemple, les instructions du générateur 44 sont chiffrées en mettant en oeuvre un 25 autre algorithme de chiffrement par flot que celui utilisé pour chiffrer le flot d'instructions généré par ce générateur 44. Dans une autre variante, les instructions du générateur 44 sont chiffrées en mettant en oeuvre un algorithme de chiffrement par bloc et non pas un algorithme de chiffrement par flot. [001461Variante du module de chiffrement et de déchiffrement : 30 [00147] En variante, la combinaison bit à bit du flot d'instructions généré avec la séquence pseudo-aléatoire est réalisée en mettant en oeuvre une autre opération que l'opération XOR. Par exemple, l'opération utilisée est une opération d'addition entre deux octets modulo 256. [00148] D'autres méthodes de chiffrement par flot peuvent être utilisées à la place de 35 Trivium. Par exemple, l'algorithme AES (Advanced Encryption Standard) en mode CBC (Chiffre Bloc Chain) ou la méthode de Grain Mickey où l'algorithme RC4 peut être utilisé à la place de Trivium. [00149] Les modules 18 et 20 peuvent aussi être remplacés par des modules logiciels. 40 1-001501Variante dans la génération du flot d'instructions : 3060789 30 [00151] L'espace réservé dans la mémoire 4 pour y enregistrer plus tard l'instruction de branchement aval chiffrée peut aussi avoir une taille strictement supérieure à la taille de cette instruction de branchement chiffrée. [00152] En variante, la clé secrète k peut être modifiée entre deux exécutions du code 5 40 ou au cours de la même exécution du code 40. Par exemple, plusieurs clés secrètes k1 à kn sont enregistrées dans la mémoire 22. Chaque clé k, est associée à un identifiant lk,. Ensuite, le microprocesseur est modifié, pour, en réponse à l'exécution d'une instruction Enable_Encrypt(lk,, IV), remplacer la clé secrète actuellement utilisée par les modules 18 et 20 par la nouvelle clé k, et la valeur 10 actuelle IV, du vecteur d'initialisation par la valeur IV. [00153] Dans un autre mode de réalisation, il est possible de désactiver par moment le chiffrement du flot d'instructions généré. Pour cela, le microprocesseur 2 est modifié pour, en réponse à l'exécution d'une instruction Disable_Encrypt, désactiver le chiffrement du flot d'instructions. Par exemple, pour cela, l'instruction 15 Disable_Encrypt est ajoutée automatiquement dans le flot d'instructions juste avant la partie de ce flot d'instructions que l'on ne souhaite pas chiffrer. Ensuite, l'instruction Disable_Encrypt est traitée lors du chiffrement et du déchiffrement de façon similaire à ce qui a été décrite pour l'instruction Init(IV,). [00154] En combinant dans un même flot d'instructions des instructions 20 Enable_Encrypt et Disable_Encrypt, il est possible de chiffrer uniquement certaines parties du flot d'instructions et de laisser en clair d'autres parties de ce flot d'instructions. Typiquement, les fonctions Init(IV,) et Encrypt(m) ne sont alors accessibles que lorsque le chiffrement du flot d'instructions est activé. [00155] En variante, les instructions de branchement inconditionnel vers un bloc de 25 base suivant sont directement codées dans chacune de variantes 48, de sorte que le bloc de contrôle 60 n'a jamais besoin d'ajouter dans le flot d'instructions généré une telle instruction de branchement inconditionnel pour marquer la fin d'un bloc de base. [00156] En variante, l'étape 110 de chiffrement de l'instruction Init(IV,) est omise. Dans ce cas, cette instruction est enregistrée en clair dans la mémoire 4. Lors de 30 l'exécution du flot d'instructions chiffré enregistré dans la mémoire 4, à chaque fois qu'une instruction est chargée, le bloc de contrôle 60 vérifie alors s'il s'agit d'une instruction Init(IV,). Dans l'affirmative, cette instruction est directement envoyée à l'unité arithmétique et logique 10 pour y être exécutée sans, au préalable, être déchiffrée. Dans le cas contraire, l'instruction est déchiffrée avant d'être envoyée à 35 l'unité arithmétique et logique 10. [00157] Dans le procédé de la figure 8, la fonction de rappel peut être paramétrée avec la valeur à utiliser pour le vecteur d'initialisation lors du chiffrement du bloc de base aval. Dans ce cas, une instruction de renouvellement peut être placée juste avant l'instruction de branchement du bloc précédent, comme décrit dans le mode de 40 réalisation de la figure 5. 3060789 31 [001581Avantages des modes de réalisations décrits : [00159] Le chiffrement des instructions du générateur spécifique enregistré dans la mémoire principale rend plus difficile l'obtention d'informations sur le flot d'instructions généré par l'exécution de ce générateur spécifique. En effet, pour obtenir de telles 5 informations, il n'est alors plus possible de les obtenir en désassemblant simplement les instructions de ce générateur spécifique dans la mémoire principale puisque celles-ci sont chiffrées. Cela renforce donc la sécurité. [00160] L'ajout de l'instruction de renouvellement au début de chaque bloc de base permet de chiffrer et déchiffrer un flot d'instructions généré comportant des 10 instructions de branchement indirect ou des appels à des fonctions. [00161] Le fait que l'instruction de renouvellement, qui permet de déterminer la valeur du vecteur d'initialisation nécessaire pour déchiffrer le prochain bloc de base à exécuter, soit chiffrée dans le bloc de base précédent impose de déchiffrer les blocs de base dans l'ordre de leur exécution. Or, l'ordre dans lequel s'exécutent les 15 différents blocs de base n'est connu qu'au cours de l'exécution de la fonction prédéterminée. Dès lors, le flot d'instructions ne peut être déchiffré qu'en même temps qu'il est exécuté, ce qui rend plus difficiles les tentatives d'attaque par désassemblage des instructions de ce flot d'instructions. [00162] Le fait d'utiliser une simple combinaison bit à bit pour chiffrer et déchiffrer le 20 flot d'instructions permet d'accélérer de façon substantielle l'exécution par le microprocesseur des opérations de chiffrement et de déchiffrement sans pour autant compromettre la sécurité de ce chiffrement car la valeur du vecteur d'initialisation est fréquemment renouvelée. [00163] Le fait d'utiliser la fonction XOR pour la combinaison bit à bit renforce la 25 sécurité du chiffrement et en simplifie l'implémentation. [00164] L'utilisation d'une fonction de rappel paramétrée par une valeur du vecteur d'initialisation et par un numéro d'ordre permet de chiffrer par flot une instruction de branchement aval tout en traitant les autres instructions du flot d'instructions dans l'ordre où elles se présentent dans ce flot d'instructions. 30 [00165] L'ajout et l'utilisation d'un bloc de base aval dans le flot d'instructions pour chiffrer une instruction de branchement aval tout en conservant la possibilité de chiffrer les autres instructions dans l'ordre où celles-ci se présentent, permet de simplifier la fonction de rappel à utiliser car celle-ci n'a plus besoin d'être paramétrée, par exemple, par un vecteur d'initialisation et/ou un numéro d'ordre. 35 [00166] L'utilisation des propriétés homomorphiques de l'opération de chiffrement par flot pour construire le cryptogramme d'une instruction de branchement aval permet d'obtenir ce cryptogramme sans jamais envoyer l'instruction de branchement aval au module de chiffrement. 3060789 32 [00167] L'utilisation d'un tirage aléatoire ou pseudo-aléatoire d'une valeur numérique permet de faire varier de façon aléatoire ou pseudo-aléatoire, à chaque exécution, le code exécuté pour réaliser la fonction prédéterminée. [00168] L'utilisation d'une clé secrète commune aux modules de chiffrement et de 5 déchiffrement crée un appariement entre ces deux modules et empêche que le flot d'instructions généré, chiffré et enregistré dans la mémoire principale par le module de chiffrement puisse être exécuté par un autre microprocesseur équipé d'un autre module de déchiffrement paramétré avec une clé secrète différente. [00169] Le fait d'utiliser des modules de chiffrement et de déchiffrement gravés en dur 10 à l'intérieur du microprocesseur renforce la sécurité de l'exécution du code machine polymorphique. REVENDICATIONS1. Procédé d'exécution par un microprocesseur d'un code machine polymorphique d'une fonction prédéterminée, lors duquel le microprocesseur: a) acquiert (86) une valeur numérique apte à varier, d'une exécution à une autre du même code machine polymorphique, puis b) génère (86), en fonction de la valeur numérique acquise, un premier et, en alternance, un second flots d'instructions, ces premier et second flots d'instructions étant chacun aptes à réaliser la fonction prédéterminée lorsqu'ils sont exécutés par le microprocesseur, chacun de ces flots d'instructions étant formé d'une succession de blocs de base, chaque bloc de base débutant à une adresse de branchement et se terminant par une instruction de branchement vers une adresse de branchement d'un autre bloc de base, ces premier et second flots d'instructions se distinguant l'un de l'autre par au moins un opcode d'instructions ou un opérande différent ou une valeur littérale différente ou un nombre d'instructions différent, c) enregistre (86) le flot d'instructions généré dans une mémoire principale, puis d) exécute (88) le flot d'instructions généré qui vient d'être enregistré, caractérisé en ce que : - avant l'étape c) : - pour chaque adresse de branchement à laquelle débute un bloc de base, le microprocesseur ajoute (108 ; 160) automatiquement dans le flot d'instructions généré une instruction de renouvellement apte, lorsqu'elle est exécutée par le microprocesseur, à déclencher, immédiatement après un branchement vers cette adresse de branchement, le renouvellement d'un vecteur d'initialisation d'un module de déchiffrement par flot avec une valeur spécifique associée à cette adresse de branchement, puis - un module de chiffrement par flot, paramétré par un vecteur d'initialisation, chiffre (110, 140) le flot d'instructions au fur et à mesure qu'il est généré, au cours de ce chiffrement chaque bloc de base est chiffré à l'aide de la valeur spécifique du vecteur d'initialisation associée à l'adresse de branchement à laquelle il débute, - lors de l'étape c), seul le flot d'instructions ainsi chiffré est enregistré dans la mémoire principale, - lors de l'étape d), à chaque fois qu'une instruction chiffrée du flot d'instructions est chargée depuis la mémoire principale pour être exécutée, cette instruction est d'abord déchiffrée (152) par le module de déchiffrement, puis transférée, sans passer par la mémoire principale, vers une unité arithmétique et logique du microprocesseur, puis exécutée par cette unité arithmétique et logique, au cours de cette étape d), les instructions de renouvellement ajoutées sont exécutées au fur et à mesure qu'elles sont rencontrées dans le flot d'instructions. 3060789 34 2. Procédé selon la revendication 1, dans lequel, lors de l'étape b), c'est l'exécution, par le microprocesseur, d'un groupe d'instructions du code machine polymorphique, appelé générateur, qui génère le flot d'instructions, les instructions de ce générateur 5 étant enregistrées (74, 84) dans la mémoire principale, uniquement sous forme chiffrée de sorte que l'étape b) comporte le chargement (86) d'une instruction chiffrée du générateur depuis la mémoire principale, puis son déchiffrement par le microprocesseur, suivi de son transfert, sans passer par la mémoire principale, vers une unité arithmétique et logique du microprocesseur et l'exécution de cette 10 instruction par l'unité arithmétique et logique. 3. Procédé selon l'une quelconque des revendications précédentes, dans lequel le microprocesseur ajoute (160) l'instruction de renouvellement au début de chaque bloc de base de sorte que l'exécution de ce bloc de base débute par l'exécution de cette 15 instruction de renouvellement. 4. Procédé selon l'une quelconque des revendications 1 à 2, dans lequel : - l'instruction de renouvellement de la valeur du vecteur d'initialisation du prochain bloc de base à exécuter est ajoutée (108) dans le précédent bloc de base à exécuter 20 immédiatement avant ce prochain bloc de base, et - lors du chiffrement, l'instruction de renouvellement ajoutée dans le précédent bloc de base est chiffrée (110) en utilisant la même valeur du vecteur d'initialisation que celle utilisée pour chiffrer toutes les autres instructions du précédent bloc de base. 25 5. Procédé selon l'une quelconque des revendications précédentes, dans lequel : - lors du chiffrement (110, 140), le flot d'instructions est seulement chiffré en le combinant bit à bit, à l'aide d'une fonction prédéterminée, avec une séquence pseudo-aléatoire générée par un générateur de séquence pseudo-aléatoire initialisé, au début de chaque bloc de base, par la valeur spécifique associée à l'adresse de 30 branchement à laquelle débute ce bloc de base, et - lors du déchiffrement (152), le flot d'instructions est déchiffré en le combinant bit à bit, à l'aide de l'inverse de ladite fonction prédéterminée, avec une séquence pseudoaléatoire générée par un générateur de séquence pseudo-aléatoire identique initialisé, au début de chaque bloc de base, par la valeur spécifique associée à 35 l'adresse de branchement à laquelle débute ce bloc de base. 6. Procédé selon la revendication 5, dans lequel : - lors de l'étape b), l'un des blocs de base du flot d'instructions généré comporte une instruction de branchement aval, c'est-à-dire une instruction de branchement vers 3060 7 89 35 une adresse aval de branchement dont la valeur numérique n'est pas immédiatement déterminable par le microprocesseur car elle dépend d'un nombre d'instructions contenues dans une partie future du flot d'instructions qui n'a pas encore été générée à cet instant, 5 - lors du chiffrement du flot d'instructions au fur et à mesure qu'il est généré, lorsque cette instruction de branchement aval est rencontrée dans le bloc de base en cours de chiffrement, le microprocesseur : - réserve (122) dans la mémoire principale, à l'emplacement où doit être enregistrée l'instruction de branchement aval chiffrée, un espace de même 10 taille ou de taille supérieure à la taille de l'instruction de branchement aval chiffrée, et - associe (124) une fonction de rappel à une étiquette correspondant à cette adresse aval de branchement, cette fonction de rappel étant paramétrée par la valeur spécifique du vecteur d'initialisation associée à l'adresse de 15 branchement à laquelle débute ce bloc de base en cours de chiffrement et par un numéro d'ordre identifiant la position de cette instruction de branchement aval par rapport au début du bloc de base en cours de chiffrement, puis - le chiffrement du flot d'instructions se poursuit sans avoir, à ce stade, chiffré et enregistré dans la mémoire principale, l'instruction de branchement aval, 20 - lorsque ladite partie future du flot d'instructions a été générée, le microprocesseur exécute la fonction de rappel associée à l'étiquette correspondant à cette adresse aval de branchement, l'exécution de cette fonction de rappel par le microprocesseur provoquant : - le remplacement (132) de l'étiquette par la valeur numérique de l'adresse aval 25 de branchement dans l'instruction de branchement aval, - l'initialisation (132) du module de chiffrement avec la valeur du vecteur d'initialisation qui paramètre cette fonction de rappel, - la génération (132) par le module de chiffrement ainsi initialisé d'une séquence pseudo-aléatoire jusqu'à générer la succession de bits de cette séquence 30 pseudo-aléatoire correspondant au numéro d'ordre qui paramètre la fonction de rappel, puis - la combinaison bit à bit (132) de cette succession générée de bits avec l'instruction de branchement aval dans laquelle l'étiquette a été remplacée par la valeur numérique de l'adresse aval de branchement, puis 35 - l'enregistrement (132) de l'instruction de branchement aval ainsi chiffrée dans l'espace réservé à cet effet dans la mémoire principale. 7. Procédé selon l'une quelconque des revendications 1 à 5, dans lequel : - lors de l'étape b), l'un des blocs de base du flot d'instructions comporte une 40 instruction de branchement aval, c'est-à-dire une instruction de branchement vers 3060789 36 une adresse aval de branchement dont la valeur numérique n'est pas immédiatement déterminable par le microprocesseur car elle dépend d'un nombre d'instructions contenues dans une partie future du flot d'instructions qui n'a pas encore été générée à cet instant, 5 - lors du chiffrement du flot d'instructions au fur et à mesure qu'il est généré, lorsque cette instruction de branchement aval est rencontrée dans le bloc de base en cours de chiffrement, le microprocesseur : - insert (172), dans le flot d'instructions, un bloc de base aval situé immédiatement après le bloc de base en cours de chiffrement, la taille de ce 10 bloc de base aval étant connue et ce bloc de base aval se terminant par une copie de l'instruction de branchement aval, - remplace (174) l'instruction de branchement aval, dans le bloc de base en cours de chiffrement, par une instruction de branchement inconditionnelle vers l'adresse de branchement à laquelle débute le bloc de base aval inséré, 15 - chiffre (176) l'instruction de branchement inconditionnelle puis l'enregistre dans la mémoire principale à l'emplacement où aurait due être enregistrée l'instruction de branchement aval chiffrée, - réserve (178) dans la mémoire principale, à l'emplacement où doit être enregistré le bloc de base aval chiffré, un espace au moins de même taille que 20 ce bloc de base aval, - associe (180) une fonction de rappel à une étiquette correspondant à l'adresse aval de branchement, puis - le chiffrement du flot d'instructions se poursuit sans avoir, à ce stade, chiffré et enregistré dans la mémoire principale, le bloc de base aval inséré, 25 - lorsque ladite partie future du flot d'instructions a été générée, le microprocesseur exécute la fonction de rappel associée à l'étiquette correspondant à cette adresse aval de branchement, l'exécution de cette fonction de rappel par le microprocesseur provoquant : - le remplacement (182) de l'étiquette par la valeur numérique de l'adresse aval 30 de branchement dans l'instruction de branchement aval du bloc de base aval inséré, - le chiffrement (182) par le module de chiffrement du bloc de base aval inséré en utilisant pour cela la valeur spécifique du vecteur d'initialisation associée avec l'adresse de branchement à laquelle débute ce bloc de base aval inséré, 35 puis - l'enregistrement (182) du bloc de base aval ainsi chiffré dans l'espace réservé à cet effet dans la mémoire principale. 8. Procédé selon la revendication 5, dans lequel : 3060 7 89 37 - l'opération de chiffrement, notée Encrypt(m), mise en oeuvre par le module de chiffrement est homomorphique par rapport à une opération O, c'est-à-dire que Encrypt(m) O Encrypt(r) = Encrypt (m O r), - lors de l'étape b), l'un des blocs de base du flot d'instructions généré comporte une 5 instruction de branchement aval, c'est-à-dire une instruction de branchement vers une adresse aval de branchement dont la valeur numérique n'est pas immédiatement déterminable par le microprocesseur car elle dépend d'un nombre d'instructions contenues dans une partie future du flot d'instructions qui n'a pas encore été générée à cet instant, 10 - lors du chiffrement du flot d'instructions au fur et à mesure qu'il est généré, lorsque cette instruction de branchement aval est rencontrée dans le bloc de base en cours de chiffrement, le microprocesseur : - remplace (200) cette instruction de branchement aval par un cryptogramme R tel que R = Encrypt(r), où r est un mot connu de même longueur que 15 l'instruction de branchement aval, - enregistre (200) le cryptogramme R dans la mémoire principale à l'emplacement où doit être enregistrée l'instruction de branchement aval chiffrée, - associe (201) une fonction de rappel à une étiquette correspondant à cette 20 adresse aval de branchement, cette fonction de rappel étant paramétrée par la valeur spécifique du vecteur d'initialisation associée à l'adresse de branchement à laquelle débute ce bloc de base en cours de chiffrement, par un numéro d'ordre identifiant la position de cette instruction de branchement aval par rapport au début du bloc de base en cours de chiffrement, et par le 25 mot r, puis - le chiffrement du flot d'instructions se poursuit sans avoir, à ce stade, chiffré et enregistré dans la mémoire principale, l'instruction de branchement aval, - lorsque ladite partie future du flot d'instructions a été générée, le microprocesseur exécute la fonction de rappel associée à l'étiquette correspondant à cette adresse 30 aval de branchement, l'exécution de cette fonction de rappel par le microprocesseur provoquant : - la détermination (202) d'un mot x tel que x O r = i, où i est l'instruction de branchement aval dans laquelle l'étiquette a été remplacée par la valeur numérique de l'adresse aval de branchement et r est le mot qui paramètre la 35 fonction de rappel, - l'initialisation (202) du module de chiffrement avec la valeur du vecteur d'initialisation qui paramètre cette fonction de rappel, - la génération (202) par le module de chiffrement ainsi initialisé d'une séquence pseudo-aléatoire jusqu'à générer la succession de bits de cette séquence 3060789 38 pseudo-aléatoire correspondant au numéro d'ordre qui paramètre la fonction de rappel, puis - la combinaison bit à bit (202) de cette succession générée de bits avec le mot x déterminé pour obtenir un cryptogramme X, puis 5 - le calcul (202) de R O X pour obtenir un cryptogramme de l'instruction de branchement aval, puis - l'enregistrement (202) du cryptogramme de l'instruction de branchement aval ainsi obtenu dans la mémoire principale à la place du mot R. 10 9. Procédé selon l'une quelconque des revendications précédentes, dans lequel l'étape a) comporte, à chaque exécution du code machine polymorphique, le tirage (86) aléatoire ou pseudo-aléatoire de ladite valeur numérique. 10. Procédé selon l'une quelconque des revendications précédentes, dans lequel lors 15 des étapes b) et d), le module de chiffrement et le module de déchiffrement sont chacun paramétrés par une clef secrète de sorte que le flot d'instructions chiffré varie aussi en fonction de la valeur de cette clef secrète, la valeur de cette clef secrète restant inchangée pendant toute l'exécution du code machine polymorphique. 20 11. Procédé selon l'une quelconque des revendications précédentes, dans lequel la fonction prédéterminée est une primitive cryptographique apte à chiffrer ou déchiffrer des données. 12. Code machine polymorphique (40) d'une fonction prédéterminée, ce code 25 machine polymorphique comportant des instructions exécutables par un microprocesseur (2) qui, lorsqu'elles sont exécutées par ce microprocesseur, provoque : a) l'acquisition d'une valeur numérique apte à varier, d'une exécution à une autre du même code machine polymorphique, puis 30 b) la génération, en fonction de la valeur numérique acquise, d'un premier et, en alternance, d'un second flots d'instructions, ces premier et second flots d'instructions étant chacun apte à réaliser la fonction prédéterminée lorsqu'ils sont exécutés par le microprocesseur, chacun de ces flots d'instructions étant formé d'une succession de blocs de base, chaque bloc de base débutant à une adresse de branchement et se 35 terminant par une instruction de branchement vers une adresse de branchement d'un autre bloc de base, ces premier et second flots d'instructions se distinguant l'un de l'autre par au moins un opcode d'instructions ou un opérande différent ou une valeur littérale différente ou un nombre d'instructions différent, c) l'enregistrement du flot d'instructions généré dans une mémoire principale, puis 3060789 39 d) l'exécution du flot d'instructions généré qui vient d'être enregistré, caractérisé en ce que : - avant l'étape c) : - pour chaque adresse de branchement à laquelle débute un bloc de base, le 5 microprocesseur ajoute automatiquement dans le flot d'instructions généré une instruction de renouvellement apte, lorsqu'elle est exécutée par le microprocesseur, à déclencher, immédiatement après le branchement vers cette adresse de branchement, le renouvellement d'un vecteur d'initialisation d'un module de déchiffrement par flot avec une valeur spécifique associée à 10 cette adresse de branchement, puis - un module de chiffrement par flot, paramétré par un vecteur d'initialisation, chiffre le flot d'instructions au fur et à mesure qu'il est généré, au cours de ce chiffrement chaque bloc de base est chiffré à l'aide de la valeur spécifique du vecteur d'initialisation associée à l'adresse de branchement à laquelle il 15 débute, - lors de l'étape c), seul le flot d'instructions ainsi chiffré est enregistré dans la mémoire principale, - lors de l'étape d), à chaque fois qu'une instruction chiffrée du flot d'instructions est chargée depuis la mémoire principale pour être exécutée, cette instruction est d'abord 20 déchiffrée par le module de déchiffrement, puis transférée, sans passer par la mémoire principale, vers une unité arithmétique et logique du microprocesseur, puis exécutée par cette unité arithmétique et logique, au cours de cette étape d), les instructions de renouvellement ajoutées sont exécutées au fur et à mesure qu'elles sont rencontrées dans le flot d'instructions. 25 13. Support (6) d'enregistrement d'informations, caractérisé en ce qu'il comporte un code machine polymorphique exécutable conforme à la revendication 12. 14. Appareil électronique (1) apte à exécuter un code machine polymorphique d'une 30 fonction prédéterminée, cet appareil comportant un microprocesseur (2) programmé pour réaliser les étapes suivantes : a) l'acquisition d'une valeur numérique apte à varier, d'une exécution à une autre du même code machine polymorphique, puis b) la génération, en fonction de la valeur numérique acquise, d'un premier et, en 35 alternance, d'un second flots d'instructions, ces premier et second flots d'instructions étant chacun apte à réaliser la fonction prédéterminée lorsqu'ils sont exécutés par le microprocesseur, chacun de ces flots d'instructions étant formé d'une succession de blocs de base, chaque bloc de base débutant à une adresse de branchement et se terminant par une instruction de branchement vers une adresse de branchement d'un 40 autre bloc de base, ces premier et second flots d'instructions se distinguant l'un de 3060789 40 l'autre par au moins un opcode d'instructions ou un opérande différent ou une valeur littérale différente ou un nombre d'instructions différent, c) l'enregistrement du flot d'instructions généré dans une mémoire principale, puis d) l'exécution du flot d'instructions généré qui vient d'être enregistré, 5 caractérisé en ce que le microprocesseur (2) est également programmé pour réaliser les étapes suivantes : - avant l'étape c) : - pour chaque adresse de branchement à laquelle débute un bloc de base, le microprocesseur ajoute automatiquement dans le flot d'instructions généré 10 une instruction de renouvellement apte, lorsqu'elle est exécutée par le microprocesseur, à déclencher, immédiatement après le branchement vers cette adresse de branchement, le renouvellement d'un vecteur d'initialisation d'un module (20) de déchiffrement par flot avec une valeur spécifique associée à cette adresse de branchement, puis 15 - un module (18) de chiffrement par flot, paramétré par un vecteur d'initialisation, chiffre le flot d'instructions au fur et à mesure qu'il est généré, au cours de ce chiffrement chaque bloc de base est chiffré à l'aide de la valeur spécifique du vecteur d'initialisation associée à l'adresse de branchement à laquelle il débute, 20 lors de l'étape c), seul le flot d'instructions ainsi chiffré est enregistré dans la mémoire principale, - lors de l'étape d), à chaque fois qu'une instruction chiffrée du flot d'instructions est chargée depuis la mémoire principale pour être exécutée, cette instruction est d'abord déchiffrée par le module (20) de déchiffrement, puis transférée, sans passer par la 25 mémoire principale, vers une unité arithmétique et logique (10) du microprocesseur (2), puis exécutée par cette unité arithmétique et logique, au cours de cette étape d), les instructions de renouvellement ajoutées sont exécutées au fur et à mesure qu'elles sont rencontrées dans le flot d'instructions. 30 15. Appareil selon la revendication 14, dans lequel le module de chiffrement (18) est un module de chiffrement matériel réalisé sur le même substrat ou la même puce que l'unité arithmétique et logique (10).