Brevet FR3047100A1 — publié le 20170728

MÉTHODE DE CHIFFREMENT D'UN FLOT D'INSTRUCTIONS ET EXÉCUTION D'UN FLOT D'INSTRUCTIONS AINSI CHIFFRÉ DESCRIPTION DOMAINE TECHNIQUE L'objet de la présente invention concerne le domaine du chiffrement des logiciels et de l'exécution de logiciels ainsi chiffrés. ÉTAT DE LA TECHNIQUE ANTÉRIEURE Les exigences croissantes de sécurité, notamment dans des contextes de virtualisation, conduisent à envisager le chiffrement d'un logiciel avant son exécution par une machine réelle ou virtuelle. Le chiffrement des instructions destinées à être exécutées par un microcontrôleur peut être réalisé de différentes manières : Dans un premier type d'implémentation dit « offline » le logiciel est entièrement chiffré de manière préalable et transmis au microcontrôleur. Le logiciel est déchiffré par le microcontrôleur ou par un processeur dédié avant d'être stocké, en clair, dans une mémoire de masse. Le microcontrôleur exécute ensuite les exécutions du logiciel en clair, lues dans cette mémoire. Dans un second type d'implémentation dit « au boot », le logiciel est stocké sous forme chiffrée dans une mémoire de masse, par exemple une mémoire flash. Lors du boot, le microcontrôleur ou un processeur dédié, déchiffre le logiciel et le stocke en clair dans une RAM. Le microcontrôleur exécute ensuite les instructions en clair lues de la RAM. Dans un troisième type d'implémentation dit « à la volée », le logiciel est chiffré par blocs, chaque bloc étant transmis au microcontrôleur. Celui-ci déchiffre le bloc reçu, à la volée, et le stocke dans une mémoire cache avant de l'exécuter. Toutefois, ce type d'implémentation peut difficilement être retenu dès lors qu'un bloc contient une 3047100 2 instruction de saut conditionnel à une instruction n'appartenant au même bloc, en raison de la perte du contexte de chiffrement. Le document US-B-6345359 décrit une méthode de chiffrement d'un flot d'instructions par masque jetable. Le chiffrement est réalisé instruction par instruction, le 5 masque étant généré à partir d'une clé de chiffrement et de l'adresse à laquelle l'instruction est stockée. Le masque est donc jeté à chaque nouvelle instruction. Le déchiffrement se fait, à la volée, instruction par instruction à partir de la clé de chiffrement et de l'adresse à laquelle l'instruction est stockée. Le fait que le chiffrement se fasse instruction par instruction en utilisant l'adresse de stockage permet au 10 microcontrôleur de synchroniser sa clé, y compris lors d'un saut en cours d'exécution du programme. Toutefois, cette méthode de chiffrement d'un logiciel et d'exécution à la volée suppose que l'on connaisse l'adresse physique de chaque instruction, tant lors du chiffrement que lors du déchiffrement. En particulier, il ne sera pas possible d'exécuter le 15 logiciel s'il a été copié à un autre emplacement mémoire ou simplement s'il a été chargé dans une mémoire tampon. Autrement dit, le chiffrement du logiciel doit être répété à chaque fois qu'il est installé ou copié. Il ne sera pas davantage possible de faire exécuter le flot d'instructions ainsi chiffré par une machine virtuelle. Le but de la présente invention est par conséquent de proposer une méthode de 20 chiffrement d'un flot d'instructions qui permette une exécution à la volée, instruction par instruction, sans qu'il soit nécessaire de connaître les adresses physiques de ces instructions. Un autre but de la présente invention est de proposer une méthode d'exécution d'un flot d'instructions chiffré par une telle méthode de chiffrement. 2 5 EXPOSÉ DE L'INVENTION La présente invention est définie par une méthode de chiffrement d'un flux d'instructions d'un programme au moyen d'un chiffrement par flot utilisant un générateur de séquence pseudo-aléatoire paramétré par une clé secrète (K) et initialisé par un vecteur d'initialisation ( IV ), dans laquelle : 3047100 3 le flux d'instructions est traduit par un compilateur en un code binaire, ledit code binaire étant sommé bit à bit avec la séquence pseudo-aléatoire, pour fournir un flux d'instructions chiffrées ; lorsque le programme comporte une instruction de branchement à une 5 adresse de branchement, on insère dans le programme une instruction d'initialisation correspondante pour initialiser le générateur pseudo-aléatoire avec un vecteur d'initialisation spécifique à l'adresse de branchement, les instructions à partir de l'adresse de branchement étant chiffrées au moyen d'une séquence pseudo-aléatoire générée par le générateur pseudo-aléatoire initialisé par ledit vecteur d'initialisation spécifique. 10 Selon un premier mode de réalisation, l'instruction d'initialisation est insérée juste avant l'instruction de branchement. Avantageusement, l'instruction d'initialisation est insérée en clair dans le flux d'instructions chiffrées. 15 Alternativement, l'instruction d'initialisation est chiffrée avec ladite séquence pseudo-aléatoire avant d'être insérée. Selon un second mode de réalisation, l'instruction d'initialisation est insérée en clair à l'adresse de branchement dans le flux d'instructions chiffrées. L'invention concerne également une méthode d'exécution d'un flux d'instructions 20 d'un programme, chiffré par la méthode de chiffrement ci-dessus, dans laquelle: on génère une séquence pseudo-aléatoire au moyen du générateur de séquence pseudo-aléatoire paramétré par ladite clé secrète et initialisé par ledit vecteur d'initialisation ; - on somme le flux d'instructions chiffrées bit à bit avec la séquence pseudo- 25 aléatoire, chaque instruction chiffrée étant déchiffrée et exécutée avant de passer à la suivante; on détecte chaque instruction d'initialisation dans le flux d'instructions chiffrées et, lorsqu'une telle instruction d'initialisation est détectée, on extrait le vecteur d'initialisation qu'elle contient et on initialise le générateur de séquence pseudo-aléatoire 3047100 4 avec le vecteur d'initialisation ainsi extrait en cas de branchement à l'adresse de branchement. Une instruction d'initialisation est détectée, le cas échéant après déchiffrement, 5 au moyen d'un préfixe spécifique. Dans le cas où une instruction d'initialisation est insérée avant une instruction de branchement à une adresse de branchement, on stocke dans un registre intermédiaire le vecteur d'initialisation extrait de l'instruction d'initialisation lorsque celle-ci est détectée et l'on initialise le générateur pseudo-aléatoire avec le contenu dudit registre lorsque l'on 10 saute à l'adresse de branchement. Selon un premier exemple d'application, le programme comprend au moins une instruction de branchement conditionnel. Selon un second exemple d'application, le programme comprend au moins une instruction de branchement inconditionnel. 15 BRÈVE DESCRIPTION DES DESSINS D'autres caractéristiques et avantages de l'invention apparaîtront à la lecture d'un mode de réalisation préférentiel de l'invention, en faisant référence aux figures jointes parmi lesquelles : Les Fig. 1A et 1B représentent schématiquement le principe d'une méthode de 20 chiffrement et de déchiffrement par flot ; La Fig. 2 représente un exemple d'application d'une méthode de chiffrement par flot d'une séquence d'instructions ; La Fig. 3 représente un exemple d'une séquence d'instructions, comportant une instruction de saut conditionnel et une instruction de saut inconditionnel; 25 La Fig. 4A représente la séquence d'instructions de la Fig. 3, chiffrée par une méthode de chiffrement selon un premier mode de réalisation de l'invention ; La Fig. 4B représente la séquence d'instructions de la Fig. 3, chiffrée par une méthode de chiffrement selon un second mode de réalisation de l'invention ; 3047100 5 La Fig. 5 représente un ordinogramme de la méthode de chiffrement d'un flot d'instructions selon le premier mode de réalisation de l'invention ; La Fig. 6 représente un ordinogramme de la méthode de chiffrement d'un flot d'instructions selon le second mode de réalisation de l'invention ; 5 La Fig. 7 représente un ordinogramme de la méthode d'exécution d'un flot d'instructions chiffrées par la méthode de chiffrement de la Fig. 5 ; La Fig. 8 représente un ordinogramme de la méthode d'exécution d'un flot d'instructions chiffrées par la méthode de chiffrement de la Fig. 6. 10 EXPOSÉ DÉTAILLÉ DE MODES DE RÉALISATION PARTICULIERS Nous considérerons dans la suite un flot d'instructions susceptibles d'être exécutées par un processeur (CPU ou microcontrôleur). Ce flot d'instructions se présente sous la forme d'un fichier binaire généré au moyen d'un compilateur à partir d'un programme source en assembleur ou de niveau supérieur. Chaque instruction est 15 représentée par un code binaire qui obéit à un format d'instruction et présente une taille fixe. Une instruction est généralement définie par une opération à réaliser (opération logique et arithmétique par exemple) et, le cas échéant, un opérande source et un opérande de destination. Les opérandes peuvent être définis par des registres internes ou des emplacements mémoire. 20 Normalement, les instructions sont exécutées séquentiellement par le processeur, le pointeur d'instruction fournissant l'adresse de la prochaine instruction à exécuter étant simplement incrémenté par la taille de l'instruction. Les instructions sont lues par le séquenceur à l'adresse fournie par le pointeur d'instruction et présentées à l'unité arithmétique et logique (ALU) du processeur qui les interprète. 25 Toutefois, en présence d'instructions de contrôle (saut conditionnel ou inconditionnel, boucle, etc.), il est dérogé à la règle d'exécution séquentielle, l'adresse présente dans le pointeur d'instruction étant alors modifiée par l'instruction de contrôle. 3047100 6 Une première idée à la base de l'invention est d'utiliser un chiffrement par flot (stream cipher) pour chiffrer le flot d'instructions, les instructions étant sous forme de code binaire. On rappelle qu'un chiffrement par flot repose sur le principe du code de Vernam 5 ou masque jetable. Chaque bit est chiffré individuellement par addition (opération XOR) bit à bit du message en clair avec le masque en question. En pratique, les méthodes de chiffrement par flot font appel à la génération d'une séquence pseudo-aléatoire à partir d'une combinaison linéaire ou non-linéaire de sorties de registres à décalage, rebouclés sur eux-mêmes et/ou entre eux. La séquence pseudo-aléatoire générée, dénommée aussi flux 10 de clé (keystream) constitue le masque jetable. La plupart des méthodes récentes de chiffrement par flot utilisent d'une part une clé secrète, comme dans n'importe quel cryptosystème symétrique, notée K, et un vecteur d'initialisation /V , prenant une nouvelle valeur à chaque session de chiffrement encore dénommée quelquefois valeur de circonstance ou nonce (number used once). A la 15 différence de la clé de chiffrement, le vecteur d'initialisation est public. Il sert essentiellement à randomiser le flux de clé d'une session de chiffrement à l'autre. La Fig. 1A représente de manière schématique le principe d'une méthode de chiffrement par flot. 20 Le flux binaire en clair (constitué par exemple par le fichier binaire du programme, c'est-à-dire les codes binaires des instructions successives de ce programme), est représenté par M . Un générateur de séquence pseudo-aléatoire, 110, reçoit la clé secrète, K et le vecteur d'initialisation, IV et fournit la séquence pseudo-aléatoire, R . Celle-ci est ajoutée bit à bit en 120 (XOR) au flux binaire en clair. Le flux ainsi chiffré est noté 25 Encrypt(M)KW =M R De manière similaire, la Fig. 1B représente le principe du déchiffrement d'un flux binaire chiffré avec la méthode de chiffrement par flot de la Fig. 1A. Le déchiffrement fait appel à un générateur de séquence pseudo-aléatoire 210, identique à celui ayant servi au chiffrement, 110. Le générateur de séquence pseudo- 3047100 7 aléatoire 210 reçoit la même clé de chiffrement, K et est initialisé par le même vecteur d'initialisation, IV . Le flux binaire chiffré est sommé bit à bit en 220 avec la séquence pseudo aléatoire R pour redonner le flux binaire en clair. Un exemple de méthode de chiffrement par flot est Trivium dont on pourra 5 trouver une description dans l'article de Y. Tian et al. intitulé « On the design of Trivium », publié dans IACR Cryptology ePrint Archive, 2009. D'autres méthodes de chiffrement par flot peuvent alternativement être utilisées, telles que les méthodes Grain, Mickey voire l'algorithme plus ancien RC4. 10 La Fig. 2 représente un exemple de chiffrement par flot d'une séquence d'instructions. Les instructions sous forme de code binaire sont notées ici I1,..., IN et sont de taille S . Le flux binaire à chiffrer est constitué par la séquence M =I,,...,INLa séquence en sortie du générateur pseudo-aléatoire est découpée en mots successifs de taille S, 15 Rp..,RN autrement dit le flux binaire chiffré n'est autre que la série d'instructions chiffrées Ct -R,10 I'i=1,..,N . Les mots successifsR,,..,RNsont obtenus au cours d'une même session de chiffrement, c'est-à-dire pour un même vecteur d'initialisation. Lors du déchiffrement, de manière symétrique, la même séquence pseudo- aléatoire est générée à partir de la clé K et du vecteur d'initialisation IV et découpée en 20 mots successifs Rp..,RN . Ces mots sont respectivement sommés, bit à bit, aux instructions chiffréesC,,...,CNpour redonner les instructions en clair Ip...,IN. Comme indiqué dans la partie introductive, durant le déroulement d'un programme, le pointeur d'instruction peut arriver sur une instruction de contrôle, par exemple sur une instruction de saut inconditionnel (dite aussi de branchement 25 inconditionnel) ou de saut conditionnel (dite aussi de branchement conditionnel). Une telle situation est illustrée dans l'exemple de la Fig. 3. Le programme comprend un premier bloc d'instructions (représentées pour plus de lisibilité en assembleur), B/30 dont les dernières instructions sont BNE rpr3,@ BI31 et JMP @BB2. Autrement dit si les contenus des registres ri et r, sont différents, le pointeur d'instruction saute à l'adresse @ B/31 d'un 3047100 8 second bloc, BB1, et à défaut saute à l'adresse @ BB2, d'un troisième bloc BB2 . On comprend que les blocs BB1 et BB2 ne respectent pas la continuité du séquencement et ne peuvent donc être déchiffrés tels quels. La seconde idée à la base de l'invention consiste à insérer lors du chiffrement du 5 flux d'instructions, une instruction spécifique située juste avant l'instruction de branchement ou bien à l'adresse de branchement, ayant pour argument un vecteur d'initialisation et indiquant au générateur de séquence pseudo-aléatoire de charger le vecteur d'initialisation en question. Il est à noter que les boucles itératives sont considérées comme la répétition d'une 10 séquence d'instructions avec un branchement conditionnel. Elles relèvent également par conséquent de la méthode de chiffrement selon la présente invention. La Fig. 4A représente la séquence d'instructions de la Fig. 3, chiffrée par une méthode de chiffrement selon un premier mode de réalisation de l'invention. 15 Dans ce premier mode de réalisation, l'instruction spécifique de chargement de vecteur d'initialisation est insérée juste avant l'instruction de branchement. On a représenté en grisé les instructions chiffrées par la méthode de chiffrement par flot. Juste avant l'instruction de branchement conditionnel BNE ri,r,,@ BBi a été insérée une instruction d'initialisation IV, for BB1, cette instruction indiquant que le 20 vecteur d'initialisation IV, est à charger dans le générateur de séquence pseudo-aléatoire pour le déchiffrement et l'exécution à la volée du bloc BB1, si les conditions du branchement conditionnel sont remplies. De manière similaire, une instruction d'initialisation /V2 for BB2 a été insérée juste avant l'instruction de branchement inconditionnel, JMP @BB2. L'instruction insérée indique que le vecteur d'initialisation 25 /V2 est à charger dans le générateur de séquence pseudo-aléatoire pour le déchiffrement et l'exécution à la volée du bloc BB2 . Les instructions IV, for BB1 et /V2 for BB2 peuvent être chiffrées comme le reste du bloc B/30 (au moyen de la méthode de chiffrement par flot, avec la clé K et le vecteur 3047100 9 d'initialisation /Vo ). Alternativement, les instructions d'initialisation peuvent figurer en clair dans le bloc comme représenté sur la Fig. 4A. Dans le premier cas, l'instruction d'initialisation doit d'abord être déchiffrée avant de réinitialiser le générateur de séquence pseudo-aléatoire, dans le second cas l'instruction en clair comprend un préfixe de contrôle 5 indiquant qu'elle ne doit pas être déchiffrée mais directement utilisée pour contrôler le générateur pseudo-aléatoire. La Fig. 4B représente la séquence d'instructions de la Fig. 3, chiffrée par une méthode de chiffrement selon un second mode de réalisation de l'invention. 10 Dans ce second mode de réalisation, une instruction d'initialisation figure en tête de chaque bloc d'instructions, à l'adresse de branchement. Ainsi, les instructions /Vo for B/30 , IV, for BB1 et /V2 for BB2 sont respectivement placées en tête des blocs d'instructions BB0, BB1, BB2 " Ces instructions d'initialisation demeurent en clair dans le flux binaire chiffré: elles contiennent de préférence un préfixe de contrôle indiquant 15 qu'elles ne doivent pas être déchiffrées mais au contraire prises en compte pour initialiser le générateur de séquence pseudo-aléatoire. Ainsi, lorsque le pointeur d'instruction arrive sur le début du bloc BB0, le générateur pseudo-aléatoire est initialisé avec le vecteur d'initialisation /Vo, les instructions du bloc sont déchiffrées (à l'aide de la séquence pseudo-aléatoire ainsi générée) et exécutées à la volée par l'ALU du processeur. De la 20 même façon, lorsque le pointeur d'instruction arrive sur le début du bloc BB1 (lorsque les conditions du branchement conditionnel sont remplies) ou sur le début du bloc BB2 (en raison de l'instruction de saut inconditionnel), le générateur de séquence pseudo-aléatoire est (ré)-initialisé avec le vecteur d'initialisation IV,, respectivement /V2 . On s'assure ainsi que la séquence pseudo-aléatoire permettant le déchiffrement est bien celle qui a servi à 25 chiffrer le bloc. La Fig. 5 représente un ordinogramme de la méthode de chiffrement d'un flux d'instructions selon le premier mode de réalisation de l'invention. 3047100 10 Cette méthode de chiffrement est mise en oeuvre par un compilateur, capable par définition de traduire les instructions en assembleur en instructions en langage machine (code binaire). Le compilateur est notamment à même d'identifier les instructions de saut, conditionnel ou non, dans le programme en assembleur, ainsi que les adresses de 5 branchement. Les adresses de branchement sont stockées dans une table T@ et à chaque adresse de branchement est associée dans la table une valeur spécifique de vecteur d'initialisation. Les adresses de branchement sont des adresses relatives (numéros d'instructions) et non des adresses physiques. Les valeurs de vecteur d'initialisation peuvent résulter d'un tirage aléatoire ou de la sortie d'un compteur, incrémenté à chaque 10 nouvelle adresse de branchement. Le flux d'instructions en assembleur est fourni, instruction par instruction, à la méthode de chiffrement par flot. Celle-ci est initialisée en 510 au moyen d'une clé de chiffrement K et d'une valeur /Vo du vecteur d'initialisation du générateur de séquence pseudo-aléatoire. 15 A l'étape 520, on prend en compte une nouvelle instruction. On détermine en 530 à partir de la table T@ si l'adresse de l'instruction courante est une adresse de branchement ou non. Si c'est le cas, on charge en 540 le générateur de séquence pseudo-aléatoire avec la valeur de vecteur d'initialisation correspondant à cette adresse. Dans le cas contraire, on 20 poursuit en 570 sans modifier le vecteur d'initialisation. A l'étape 550, on détermine si l'instruction courante est une instruction de branchement (conditionnel ou non). Si ce n'est pas une instruction de branchement, on passe directement à l'étape 565. 25 En revanche, si l'instruction courante est une instruction de branchement, on recherche en 560 dans la table T@ la valeur de vecteur d'initialisation correspondant à l'adresse de branchement. On note /V, cette valeur. On insère ensuite une instruction d'initialisation du générateur de séquence pseudo-aléatoire à la valeur /V, avant l'instruction courante. 3047100 11 Dans une première variante où on laisse l'instruction d'initialisation en clair, on passe directement à l'étape 570. A défaut, dans une seconde variante représentée ici, on chiffre en 565 l'instruction d'initialisation avec le chiffrement par flot sur la base de la valeur courante du vecteur d'initialisation. 5 A l'étape 570, on chiffre l'instruction courante avec l'algorithme de chiffrement par flot. Pour ce faire, l'instruction est d'abord traduite en code binaire par le compilateur puis le code binaire est chiffré par la séquence pseudo-aléatoire sur la base de la valeur courante du vecteur d'initialisation. A l'étape 580, on détermine si l'on a atteint la fin du programme. Dans la négative, 10 on retourne en 520 pour traiter la nouvelle instruction courante. Dans l'affirmative, la méthode de chiffrement du flot d'instructions se termine en 590. La Fig. 6 représente un ordinogramme de la méthode de chiffrement d'un flot d'instructions selon le second mode de réalisation de l'invention. 15 Comme dans le premier mode de réalisation, la méthode de chiffrement est mise en oeuvre par un compilateur. Celui-ci connaît les adresses de branchement des différents blocs du programme. Ces adresses de branchement sont répertoriées dans une table T @ . On suppose que l'on a généré pour chaque adresse de branchement un vecteur d'initialisation correspondant et que ce vecteur d'initialisation est stocké dans la table en 20 relation avec l'adresse de branchement correspondante. Le flux d'instructions en assembleur est fourni, instruction par instruction, à la méthode de chiffrement par flot. A l'étape 610 on initialise le générateur de séquence pseudo-aléatoire au moyen de la clé de chiffrement K et de valeur /Vo du vecteur d'initialisation associée au premier 25 bloc. A l'étape 620, on prend en compte une nouvelle instruction. On détermine en 630, à partir de la table T @ , si l'adresse de l'instruction courante est une adresse de branchement ou non. Si ce n'est pas une adresse de branchement, on passe directement à l'étape 670. 3047100 12 En revanche, si l'instruction courante est une adresse de branchement, on recherche en 640 dans la table T @ la valeur d'initialisation /V, correspondant à cette adresse de branchement. En 650, une instruction d'initialisation du générateur de séquence pseudo- 5 aléatoire à la valeur /V, est insérée en clair à l'adresse de branchement. En 660, on met à jour le vecteur d'initialisation du générateur de séquence pseudo-aléatoire avec la nouvelle valeur /V, . A l'étape 670, on chiffre l'instruction courante avec l'algorithme de chiffrement par flot. Pour ce faire, l'instruction est traduite en code binaire par le compilateur puis le 10 code binaire est chiffré par la séquence pseudo-aléatoire de l'algorithme de chiffrement par flot. A l'étape 680, on détermine si l'on a atteint la fin du programme. Dans la négative, on retourne en 620 pour traiter la nouvelle instruction courante. Dans l'affirmative, la méthode de chiffrement du flot d'instructions se termine en 690. 15 La Fig. 7 représente un ordinogramme de la méthode d'exécution d'un flot d'instructions chiffrées par la méthode de chiffrement de la Fig. 5. En 710, on initialise le générateur de séquence pseudo-aléatoire au moyen de la clé secrète K ayant servi au chiffrement et du vecteur d'initialisation initial /Vo . 20 En 720, on recherche (opération FETCH) une nouvelle instruction dans la mémoire. En 730, on déchiffre l'instruction au moyen de la séquence pseudo-aléatoire et l'on détermine en 740 si l'instruction ainsi déchiffrée est une instruction d'initialisation du générateur de séquence pseudo-aléatoire. Dans l'affirmative on extrait la nouvelle valeur du vecteur d'initialisation et on la stocke dans un registre, en 745, puis on retourne à l'étape 25 720. Dans la négative, on poursuit en 750. Alternativement, on détermine si l'instruction est en clair (cas de la première variante) et, dans ce cas, on extrait directement la nouvelle valeur du vecteur d'initialisation, on la stocke dans le registre en question avant de retourner à l'étape 720. 3047100 13 En 750, l'ALU exécute l'instruction précédemment déchiffrée. On vérifie en 760 si l'instruction est une instruction de branchement inconditionnel ou bien une instruction de branchement conditionnel dont la condition est satisfaite. Si c'est le cas, on charge en 770 la valeur du registre comme nouveau vecteur d'initialisation du générateur de séquence 5 pseudo-aléatoire. A défaut, on continue en 780. En 780, on vérifie si on a atteint une instruction de fin. Dans l'affirmative, l'exécution s'arrête en 790. Sinon, l'exécution se poursuit par la recherche d'une nouvelle instruction en 720. 10 La Fig. 8 représente un ordinogramme de la méthode d'exécution d'un flot d'instructions chiffrées par la méthode de chiffrement de la Fig. 6. En 810, on initialise le générateur de séquence pseudo-aléatoire au moyen de la clé secrète K ayant servi au chiffrement et du vecteur d'initialisation initial /Vo . En 820, on recherche (opération FETCH) une nouvelle instruction dans la mémoire. 15 A l'étape 830, on détermine si l'instruction est une instruction (en clair) d'initialisation du générateur de séquence pseudo-aléatoire. Dans l'affirmative, en 835, on extrait la nouvelle valeur du vecteur d'initialisation et on la charge dans le générateur de séquence pseudo-aléatoire. On poursuit ensuite à l'étape 860. 20 Dans la négative, on déchiffre en 840 l'instruction courante au moyen de la séquence pseudo-aléatoire. VALU exécute en 850 l'instruction précédemment déchiffrée. En 860, on vérifie si on a atteint une instruction de fin. Dans l'affirmative, l'exécution s'arrête en 870. Sinon, l'exécution se poursuit par la recherche d'une nouvelle 25 instruction en 820. L'homme du métier comprendra que, quel que soit le mode de réalisation envisagé, un branchement conditionnel ou inconditionnel est associé à une valeur du vecteur d'initialisation lors du chiffrement du flux d'instructions. Cette valeur sert à 30 initialiser le générateur de séquence pseudo-aléatoire pour le chiffrement du bloc 3047100 14 d'instructions correspondant à l'adresse de branchement. Lors de l'exécution du flux d'instructions, le vecteur d'initialisation correspondant à ce bloc est utilisé pour son déchiffrement. Ainsi, il n'est pas nécessaire de faire référence à une adresse physique lors du chiffrement ou du déchiffrement d'une instruction du programme. 5 REVENDICATIONS1. Méthode de chiffrement d'un flux d'instructions d'un programme au moyen d'un chiffrement par flot utilisant un générateur de séquence pseudo-aléatoire paramétré par une clé secrète (K) et initialisé par un vecteur d'initialisation ( IV ) , caractérisé en ce que : le flux d'instructions est traduit par un compilateur en un code binaire, ledit code binaire étant sommé bit à bit avec la séquence pseudo-aléatoire, pour fournir un flux d'instructions chiffrées ; lorsque le programme comporte une instruction de branchement à une adresse de branchement, on insère dans le programme une instruction d'initialisation correspondante pour initialiser le générateur pseudo-aléatoire avec un vecteur d'initialisation spécifique à l'adresse de branchement, les instructions à partir de l'adresse de branchement étant chiffrées au moyen d'une séquence pseudo-aléatoire générée par le générateur pseudo-aléatoire initialisé par ledit vecteur d'initialisation spécifique. 2. Méthode de chiffrement d'un flux d'instructions selon la revendication 1, caractérisée en ce que l'instruction d'initialisation est insérée juste avant l'instruction de branchement. 3. Méthode de chiffrement d'un flux d'instructions selon la revendication 2, caractérisée en ce que l'instruction d'initialisation est insérée en clair dans le flux d'instructions chiffrées. 4. Méthode de chiffrement d'un flux d'instructions selon la revendication 2, caractérisée en ce que l'instruction d'initialisation est chiffrée avec ladite séquence pseudoaléatoire avant d'être insérée. 3047100 16 5. Méthode de chiffrement d'un flux d'instructions selon la revendication 1, caractérisée en ce que l'instruction d'initialisation est insérée en clair à l'adresse de branchement dans le flux d'instructions chiffrées. 5 6. Méthode d'exécution d'un flux d'instructions d'un programme, chiffré par la méthode de chiffrement selon la revendication 1, caractérisé en ce que: on génère une séquence pseudo-aléatoire au moyen du générateur de séquence pseudo-aléatoire paramétré par ladite clé secrète et initialisé par ledit vecteur d'initialisation ; 10 - on somme le flux d'instructions chiffrées bit à bit avec la séquence pseudo- aléatoire, chaque instruction chiffrée étant déchiffrée et exécutée avant de passer à la suivante; on détecte chaque instruction d'initialisation dans le flux d'instructions chiffrées et, lorsqu'une telle instruction d'initialisation est détectée, on extrait le vecteur 15 d'initialisation qu'elle contient et on initialise le générateur de séquence pseudo-aléatoire avec le vecteur d'initialisation ainsi extrait en cas de branchement à l'adresse de branchement. 7. Méthode d'exécution d'un flux d'instructions selon la revendication 6, 20 caractérisée en ce qu'une instruction d'initialisation est détectée, le cas échéant après déchiffrement, au moyen d'un préfixe spécifique. 8. Méthode d'exécution d'un flux d'instructions selon la revendication 6, caractérisée en ce que, dans le cas où une instruction d'initialisation est insérée avant une 25 instruction de branchement à une adresse de branchement, on stocke dans un registre intermédiaire le vecteur d'initialisation extrait de l'instruction d'initialisation lorsque celle-ci est détectée et l'on initialise le générateur pseudo-aléatoire avec le contenu dudit registre lorsque l'on saute à l'adresse de branchement. 3047100 17 9. Méthode d'exécution d'un flux d'instructions selon la revendication 6 à 8, caractérisée en ce que le programme comprend au moins une instruction de branchement conditionnel. 5 10. Méthode d'exécution d'un flux d'instructions selon la revendication 6 à 8, caractérisée en ce que le programme comprend au moins une instruction de branchement inconditionnel.