FR 2824402 A1 20021108 FR 0110459 A 20010803 partie des variables. 1,28244o2 La présente invention appartient au domaine des dispositifs et procédés pour prévenir eVou auditer une utilisation d'un programme d'ordinateur non autorisée par son auteur, son éditeur ou son distributeur. Relèvent de la prévention les dispositifs et méthodes qui vérifient que la personne ou l'automate qui cherche à utiliser le programme d'une certaine manière dispose des droits nécessaires. De nombreux dispositifs et méthodes de cette catégorie ont été prévus à cet effet. En particulier le brevet US 6,108,420 divulgue un procédé et un dispositif pour produire une empreinte cryptographique comportant les données de la licence attribuée à un utilisateur ou une classe d'utilisateurs puis pour chiffrer cette empreinte attachée au programme à protéger. L'inconvénient de ces dispositifs et méthodes est qu'ils supposent la coopération de l'utilisateur qui ne doit pas communiquer les données de sa licence à d'autres utilisateurs ni supprimer la partie du programme, aisément repérable dans un code source car non fonctionnelle, qui comporte ces données d'identification. Relèvent de l'audit les dispositifs et méthodes qui modifient le programme de manière caractéristique de l'exemplaire du programme, de manière non aisément décelable par l'utilisateur, sans en altérer les fonctionnalités. En particulier, le brevet US 5,559,884 divulgue une méthode et un dispositif pour modifier de manière caractéristique de l'exemplaire du p rog ram me l'o rd re d'exécutio n de blocs d u d it p rog ram m e. L'inconvénient des dispositifs et méthodes de ce type est qu'ils supposent l'insertion dans les dits blocs d'instructions d'appel et de retour qui sont aisé me nt repérab les de man iè re automatiq u e et affectent les performances du programme à protéger. La présente invention a pour but de remédier aux inconvénients de ce deuxième type èn divulguant un dispositif et une méthode pour calculer une signature du logiciel à protéger, caractéristique dudit programme, résistant aux méthodes de repérage sans affecter les performances du programme à protéger et permettant de marquer le logiciel de manière secrète, les détenteurs du secret pouvant identifier la marque et la signature. 2 2824402 À A ces fins, I'invention divulgue un produiVprogramme d'ordinateur pour traiter les instructions d'un programme d'ordinateur en code source, caractérisé en ce qu'il comprend un module pour choisir en fonction de critères prédéfinis les instructions dudit logiciel auxquelles un programme de transcodage sera appliqué et un module pour choisir parmi plusieurs la méthode secrète de transcodage à appliquer aux dites instructions. Parmi les modes de réalisation préférés, I' invention divulgue également un produiVprogramme d'ordinateur du type ci-dessus dont la méthode secrète de transcodage produit une signature sémantique du 1 0 logiciel. Selon une variante de l'invention, le produiVprogramme d'ordinateur du type ci-dessus comprend un module pour insérer les instructions transcodées dans le logiciel. L'invention divulgue également un procédé pour traiter les instructions d'un logiciel en code source comprenant une étape pour choisir en fonction de critères prédéfinis les instructions dudit program me auxquelles un programme de transcodage est appliqué et une étape pour choisir parmi plusieurs la méthode secrète de transcodage à appliquer aux dites instructions ainsi qu'un mode de réalisation préféré du procédé o la méthode secrète de transcodage produit par une signature sémantique du logiciel ainsi qu'une variante de l'invention o le procédé comprend en outre À une étape pour insérer les instructions transcodées dans le logiciel. L' inve ntion sera m ieux comp rise et ses d iffé rentes caractéristiq u es et avantages ressortiront de la description qui suit et d'exemples de réalisation, et de ses figures annéxées dont: - la figure 1 montre un schéma de principe du dispositif et du procédé pour choisir la méthode de transcodage et instructions transcodées dans le programme; - la figure 2 montre le schéma du dispositif et du procédé dans une de ses variantes de réalisation; - la figure 3 montre le schéma de principe du dispositif et du procédé pour décoder un programme modifié selon le principe de la figure 1; 3 2824402 - la figure 4 montre le schéma du dispositif et du procédé pour décoder un programme modifié selon le dispositif et le procédé de la figure 2. L'invention divulgue enfin un produit/programme d'ordinateur et un procédé pour reconnatre la signature du logiciel. Dans les revendications, la description et les dessins, les expressions ci-dessous sont utilisées avec la signification indiquée: À Un procédé de protection/prévention de logiciel, est un ensemble de techniques qui rendent plus difficiles la copie et l'utilisation frauduleuse des o logiciels. À La compilation d'un programme est sa traduction dans un autre langage. À Un programme informatique est un programme interprétable ou compilable en un programme interprétable. À Un programme est écrit dans un certain langage de programmation appelé langage informatique du programme. À L'interprétation d'un programme est la traduction de la suite de mots le composant en une suite d'actions. À L'étiquetage d'un document ou d'un code consiste à inclure des marques visibles ou invisibles, séparées du contenu de l'objet, qui identifient par des champs l'objet logiciel (désignation, nom de l'auteur, nom du destinataire, termes de la licence d'utilisation) et un dernier champ de signature numérique qui lie complètement l'étiquette au contenu de l'objet et du même coup garantit l'intégrité de l'objet. À Le tatouage consiste à insérer des marques visibles ou invisibles incrustées dans le corps de l'objet. Ces marques réparties dans le corps de l'objet sont sinon indécelables du moins indélébiles pour qui ne connat pas la clé secrète qui a engendré le motif sousjacent. Un tatouage est de l'information cachée dans des données numériques et qui n'en modifient pas le sens. À Tatouer un code consiste à le transformer en un code équivalent sans modifier sa sémantique, en ajoutant de l'information cachée et récupérable grâce à un secret appelé clef. 4 2824402 À Deux codes logiciels sont sémantiquement équivalents s'ils ont le même comportement observable, c'est à dire par exemple, si pour toute entrée possible, les sorties du programme sont les mêmes. À Un procédé de signature consiste à joindre à un objet un segment de don nées caractéristique (résumé), obten u à l'aide d' une méthode secrète. À Une technique de lessivage est une tentative d'effacement de la marque sans changer la sémantique. À Un programme, écrit dans un langage particulier (par exemple Java), représente une suite d'instructions opérant sur l'état du système informatique. À L'état du système à un instant t est constitué par la valeur des variables du programme et des variables systèmes (files d'attente de flux entrée/sortie). À On appelle état du système associé, un ensemble de variables composé des variables existantes ou/et d'autres variables supplémentaires. À Une sémantique est un modèle mathématique définissant l'ensemble des comportements possibles d'un programme à l'exécution à un certain niveau d'observation. À L" > est la transformation d'un programme en un programme sémantiquement équivalent sous une forme difficile à comprendre par un informaticien. À L' Analyse Statique Sémantique est la détermination automatique de propriétés sémantiques des programmes. Pour assurer la sécurité d'un document numérique quelconque (image, son, texte, programme, etc.), on peut utiliser les techniques classiques de cryptologie (signatures électroniques, etc). On adjoint au contenu à sécuriser, les règles de sécurité (par exemple les données relatives à la licence du logiciel, mais ces règles peuvent être plus personnalisées et plus complexes) relatives au document pour l'utilisateur autorisé. Ces règles sont écrites dans un autre document numérique (en général à part, comme par exemple un entête, une étiquette, etc). Le document est protégé (ou non) par des méthodes de cryptographie (chiffrement du contenu, par exemple). L'étiquette est protégée 2824402 par les techniques cryptographiques. Le tout est en général soudé par des mécanismes cryptographiques (signature électronique, par exemple). L'inconvénient de ces dispositifs ou méthodes est qu'ils supposent, dans la chaîne de confiance de distribution, une coopération de tous les acteurs. Aucun ne doit divulguer le contenu de l'étiquette ou modifier ou supprimer l'étiquette, si celle-ci est à l'extérieur ou à l'intérieur du programme. Personne ne doit usurper l'identité d'un utilisateur licite. Les données d'identification d'un programme, même si celles-ci 0 dépendent de l'heure, du lieu et du contexte peuvent être déviées de leur contexte propre. Ces méthodes sont universelles et fonctionnent quelle que soit la nature du document (texte, signal, image ou programme,...). Elles ont un défaut majeur. Elles garantissent un contenu "bit à bit": elles ne font pas la différence entre des modifications infimes ou profondes. - elles ne font pas la différence entre une modification qui altère le contenu sémantique ou esthétique du document original et une modification qui change le "sens''de ce document. Les techniques cryptographiques traditionnelles se contentent de broyer tout contenu en une "farine" numérique. La méthode de broyage n'est pas dépendante de la nature, du format, de la syntaxe, ni de la sémantique de l'image ou du texte. La sécurité d'un logiciel dépend de la politique de sécurité mise en vigueur par le propriétaire du logiciel. Il sagit en général de garantir: - la disponibilité du logiciel: éviter la copie par des pirates (pour une revente ou une utilisation illicite); éviter l'utilisation non autorisée à partir d'un support physique original (CDROM); - la confidentialité du logiciel: éviter la compréhension du logiciel (confidentialité des algorithmes du logiciel source, afin de ne pas divulguer le secret du contenu du programme, la connaissance des algorithmes permettant une compréhension, une réécriture similaire, une modification, etc.); I'intégrité du logiciel: éviter la modification du logiciel, soit en ne changeant pas le contenu sémantique, mais en changeant seulement la syntaxe (en modifiant le nom des variables, en rajoutant des instructions inutiles, etc comme dans les "obfuscateurs" pour les programmes Java par exemple), soit en changeant son contenu (ajout d'un virus, ajout ou retrait d'un "patch", modification classique, emprunt d'un morceau,...); I'authentification pour garantir l'origine et le contenu du logiciel (sceau à une certaine date): pour assurer l'antériorité d'un tatouage par rapport à un autre, on a recours à une infrastructure de sécurité (Tierce lo Partie de Confiance à Valeur Ajoutée). Les méthodes de tatouage logiciel s'inspirant des méthodes de tatouage d'autres types d'objets (images et sons) sont vouées à l'échec. En effet, un code informatique, par nature, est complètement différent des objets audio, vidéo et des images. Pour ces derniers, une légère perte 1 5 d'information ne modifie pas le sens: nos capteurs sensoriels sont imparfaits. Ce n'est pas le cas du code informatique. Il ne supporte que les compressions sans perte d'information. Une modification, aussi infime soit- elle, peut le rendre non fonctionnel. Seules les modifications qui prennent en compte la sémantique sont valides, par exemple les opérations d'optimisation de code machine effectuées par les compilateurs ou l'obfuscation. L'inconvénient des méthodes et dispositifs de tatouage de logiciel est qu'ils considèrent le code en tant qu'objet syntaxique et n'exploitent pas sa sémantique. Pour cette raison, il est facile de retrouver la marque de tatouage par analyse syntaxique du programme, et d'enlever la marque par transformation syntaxique. De plus les méthodes générales de tatouage de logiciel développées jusqu'à présent induisent des modifications du programme facilement repérables. L'insertion des instructions de saut et de retour sont par exemple repérables de manière automatique. En ce qui concerne l'ajout de structures de graphes, ces structures sont également facilement id entifiables dans les codes non comp lèteme nt compil és. E lles alo u rd isse nt aussi le fonctionnement du programme de façon significative. Pour la sécurité des logiciels, relèvent de la prévention les dispositifs et méthodes qui vérifient que la personne ou 1'automate qui 7 2824402 cherche à utiliser le programme d'une certaine manière dispose des droits nécessaires. De nombreux dispositifs et méthodes de cette catéporie ont été prévus à cet effet. Il s'agit de dispositifs de protection de logiciels (leur utilisation dépend généralement d'un dispositif matériel: carte à puce, " dong le ") ou de d iss u as ion d' util isation fraud u leu se de log icie ls (étiquette, bannière, marque à l'extérieur ou à l'intérieur d'un programme source, instructions en langage machine dans le programme exécutable pour identifier un contexte d'utilisation). Avec l'avancée des nouvelles technologies et l'accroissement du nombre d'utilisateurs d'lnternet, la protection de la propriété intellectuelle devient une priorité pour les producteurs et les vendeurs de logiciels. De nombreux dispositifs et méthodes de protection ont été prévus à cet effet. On notera la famille des dispositifs qui fonctionnent avec un matériel spécialisé. Parmi les méthodes de protection logicielles, on distingue le tatouage de logiciel et l'obfuscation. Les méthodes de tatouage qui en font partie se répartissent en deux familles: À Ies méthodes dites dynamiques, qui prennent en compte la dimension temporelle de l'exécution du programme. La marque insérée peut être obtenue: - en lisant la sortie du programme pour une entrée donnée. - en lisant le contenu d'une variable pendant l'exécution, pour une entrée donnée. - en notant l'ordre d'exécution des blocs d'instructions. En particulier, le brevet 5,559,884 divulgue une méthode et un dispositif pour modifier de manière caractéristique l'ordre d'exécution de blocs dudit programme, par insertion d'instructions d'appel et de retour. À Ies méthodes dites syntaxiques statiques, grâce auxquelles on insère et on lit la marque sans l'exécution du programme. La marque peut être obtenue: - en étudiant l'ordre des instructions - en examinant les données utilisées par le programme (texte, photos, sons) Un descriptif de l'ensemble des méthodes existantes est présenté dans l'article de Coolberg et Thomborson, Software Watermarkinq: Models and Dynamic Embeddings (1998). L'invention appartient à une troisième catégorie, celle des dispositifs et méthodes statiques sémantiques. Dans cette catégorie, on peut trouver des signatures qui auront un sens arbitraire mais qui resteront néanmoins cachées car le logiciel comporte lui-méme une part importante de texte non structuré. Mais dans son mode de réaiisation préféré, le dispositif proposé s'applique de manière spéciflique aux programmes logiciels qui ont une sémantique donnée, c'est à dire les programmes écrits dans un langage de programmation ( et contrôler l'origine, le contenu ou la destination. Le dispositif dans son mode de réalisation préféré dépend de la sémantique du langage. Ainsi, les tatoueurs Java, VHDE, etc sont différents. Ils peuvent avoir des parties similaires (pour la sémantique de leurs opérations arithmétiques) mais parfois spécifiques (Les pointeurs en langage C). Le dispositif est applicable aux langages à balises pour les parties qui contiennent des programmes ( ). Pour XML, les autres parties relèvent des p rocédés de tatouages d' images (modifications im pe rceptib les de la présentation sur écran ou papier). Le dispositif est également applicable aux parties qui comportent des opérations (programmes > pour " >, " ,, etc). Dans son mode de réalisation préféré, I'invention s'appuie sur les principes de l'analyse sémantique. L'analyse sémantique a été appliquée avec succès à la certification des programmes à exigence draconienne de fiabilité. (référence 1: Abstract Interpretation: a unified lattice model for static analysis of programs by construction or approximations of fixpoints, P.Cousot & R. Cousot January 17-19, 1977 référence 2: P.Lacan, J.N. Monffort, Le Vinh Quy Ribal, A. Deutsch, and F. Gouthin. The software reliability verification process: The Ariane 5 example. In Proceedings DA/A 98 - Data Systems in 9.2824402 Aerospace, Athènes, Grèce. ESA Publications, SP-422,25-28 mai 1998). Pour prouver qu'un programme s'exécute sans défaillance en contexte opérationnel, il faut en théorie étudier toutes les exécutions possibles dudit programme. Les travaux ci-dessus, ont montré que l'on pouvait élargir à I'ensemble de toutes les exécutions possibles la preuve du bon fonctionnement. On considère qu'un programme est construit à partir d'un ensemble de n_uds liés entre eux. Les instructions relient les n_ubs entre eux et provoquent ainsi des transitions d'états matérialisées par un changement d'une ou plusieurs variables ou/et un changement de n_ud. Lorsque l'on fait une analyse sémantique d'un programme par interprétation abstraite, on calcule par itération [cf. "" Abstract Interpretation: A unified lattice model for static analysis of programs by construction or approximation of fixpoints, P.Cousot & R.Cousot Jaouary 17-19, 1977], pour chaque variable et pour chaque n_ud, un sur- ensemble de l'ensemble des valeurs que pourra prendre une variable à un n_ud donné. Trouver ces sur-ensembles revient à résoudre une équation de point-fixe, dont on obtient une approximation par itération. Les exemples montreront des méthodes d'itération dans des cas précis. Le problème que l'inventeur se propose de résoudre relève de la même approche: si les instructions ajoutées au programme à protéger appartiennent à un sous-ensemble des invariants dudit programme, alors les dites instructions s'exécuteront sans erreur et ne modifieront pas les fonctionnalités dudit programme. Il existe plusieurs sous-ensembles pertinents. Il est judicieux de choisir un sous-ensemble particulièrement représentatif du type de programmes à protoger. Bien que d'autres solutions puissent être envisagées, il est actuellement préféré que la sélection des instructions à transcoder soit effectuée selon des critères prédéfinis incluant la sélection de sous ensemble d'invariants du programme tels que définis ci-dessus. Le module (310) de la figure 1 permet d'effectuer cette sélection des instructions à transcoder à partir de la définition des caractéristiques des dites instructions (opérations sur des entiers, opérations sur les flottants, initialisation de variables, boucle conditionnelle, branchement...) en application de critères au moins partiellement prédéfinis. Le paramétrage du module (310) du compilateur (30) permet alors la sélection automatique des 1 0 2824402 instructions à transcoder. L'intervention de l'opérateur sera également possible pour sélectionner une partie autonome du programme à signer sémantiquement. En java par exemple, un programme est assimilé à plusieurs classes composées de plusieurs méthodes, elles-mêmes pouvant faire appel à des méthodes d'autres classes et d'autres packages. C'est pour cette raison que dans ce cas particulier nous préférerons signer la plus petite entité autonome d'un programme java: la méthode. Les parties du programme à signer doIvent être les parties innovantes eVou sensibles du programme. En général elles concernent la partie algoritUmique du programme. Il s'agit ensuite de choisir parmi plusieurs la méthode de transcodage en application de critères au moins partiellement prédéfinis. Ce choix dépendra du caractère sensible des informations à protéger. Le transcodage sera donc plus ou moins complexe, étant entendu qu'il devra respecter la sémantique des instructions à transcoder, c'est-à-dire utiliser le même vocabulaire et la même grammaire. Le module (320) contient les méthodes de transcodage possibles pour chaque langage. Une méthode de transcodage peut avoir un degré de sophistication correspondant au niveau de protection souhaité. Pour un niveau donné de protection, un nombre alloué de paramètres possibles seront attribuables à des utilisateurs ou des classes d'utilisateurs. Dans cette liste, chaque méthode de transcodage comporte un secret à préserver. En effet, sa connaissance permettra le décodage et donc l'enlèvement des instructions supplémentaires, ce qui supprimera toute 2s preuve d'une copie éventuelle ultérieure non autorisée. Une table de transcodage est une application qui, à toute opération effectuée sur l'état du système, associe une autre opération effectuée sur l'état du système associé. Créer une sémantique secrète revient donc à créer une analyse statique correspondante, ce qui consiste à définir les variables associées, et la relation entre les actions opérant sur l'état du système et celles opérant sur les variables associées. On peut par exemple garder les même variables que celles utilisées par le programme. Notre table de transcodage donnera une autre interprétation des instructions du programme, et affectera aux variables associées d'autres valeurs que celles qu'auraient prises les variables initiales. On peut également considérer une et une seule variable associée V, quelles que soient les variables initiales. La suite des instructions du programme sera alors interprétée en une suite d'actions sur la variable V. L'invention prend en compte toutes les actions opérant sur l'état du système d'environnement du programme informatique: une telle action peut affecter la pile d'exécution, modifier le contenu d'une variable système, appeler une fonction, ordonner la lecture d'une autre variable, effectuer une opération logique ou mathématique, créer un objet, envoyer ou recevoir un flux l/O, lire un élément d'un tableau... Utiliser une table de transcodage secrète renforce les dispositifs de signature et de tatouage. Sans ce secret, il est très difficile de trouver la même signature (selon l'argument classique en crypto: on ne peut pas raisonnablement essayer toutes les combinaisons possibles) de même qu'il est quasiment impossible de retrouver une marque. La signature sémantique proposée caractérise l'algoritUme développé en tant que tel. et permet de trouver les programmes qui ont une sémantique équivalente. La marque de tatouage est obtenue par analyse statique (après transcodage) du programme, qui constitue la clef de notre secret. Il y a peu de bruit ajouté, et la marque est donc plus résistante. La table de transcodage secrète rend plus difficile la détection de la marque. A ce stade, il est possible de déposer la signature du logiciel (10) telle que produite en sortie du module (320) chez une Tierce Partie de Confiance (TPC). Elle n'a donc pas à être insérée dans le logiciel (10). L'authentification du logiciel s'effectuera alors augrès de la TPC par comparaison de la signature produite avec le logiciel à analyser avec celle qui a été déposée. Dans ce cas, le logiciel n'est pas protégé contre la copie mais les modifications qu'il a éventuellement subies sont détectables. Dans une variante de l'invention, la signature est insérée dans le logiciel (10) sous forme de marque. Le module (330) réalise d'une part le transcodage des instructions classées avec la méthode choisie et d'autre part l'insertion des instructions transcodées dans le programme à protéger. L'algorithme principal du module (330) a pour but d'optimiser le placement des instructions transcodées. Elle 1 2 2824402 doit être adaptée à la typo log ie des instructions et des méth odes de transcodage. Les compilateurs contiennent normalement des outils d'optimisation de code et de vérification de la propagation des constantes. L'insertion des instructions transcodées dans le programme à protéger devra donc respecter un certain nombre de règles minimales de robustesse: il faut s'assurer que les variables contenant les marques de tatouage aient une influence sur les sorties du programme. En d'autres termes, pour éviter la suppression pure et simple par un optimiseur, il faut s'assurer que le contenu de la variable sera repris par une instruction du programme initial. Il faut également dissimuler les constantes. Il faut pour cela éviter les initialisations de variable v par une valeur constante K, suivies par une instruction du type w=f(v), au début du programme, car il est alors facile pour un optimiseur de calculer directement w. On pourrait par contre privilégier les boucles: dans une boucle, il est naturel d'initialiser une variable (souvent à 1),et de I'incrémenter à chaque exécution de boucle. Supposons que dans la boucle, i prenne des valeurs de a à b. On pourrait insérer l'instruction w=f(i) dans la boucle et calculer f de telle sorte que w prenne la valeur de la clef pour une valeur de i comprise entre a et b. Une fois les propriétés sémantiques du programme conjugué déterminées, on calcule par la table de transcodage inverse, les instructions à ajouter au p rog ram me initial. Les instructions ajoutées doive nt s'exécuter sans erreur et ne pas modifier les fonctionnalités dudit programme. Ces transformations seront iso-sémantiques: pour toute entrée identique, les programmes initiaux et tatoués produiront la même sortie. Mais par contre les environnements internes d'exécution ne seront pas identiques. La marque est donc un ensemble de propriétés sémantiques du programme transcodé. Notre dispositif de tatouage consiste donc à calculer les instructions à ajouter dans le programme initial qui permettront d'obtenir ces nouvelles propriétés dans l'espace caché. L'insertion des instructions transcodées dans le programme à protéger devra respecter un certain nombre de règles minimales de robustesse: il faut s'assurer que les variables et les opérations contenant les marques de tatouage donnent l'impression qu'ils aient une influence sur les sorties du programme. Par exemple, pour éviter la suppression pure et simple par un optimiseur, il faut s'assurer que le contenu de la variable sera 3.2824402 repris par une instruction du programme initial. (allocation dynamique devaleur) Il est important de noter que l'observation des valeurs prises par les variables lors de l'exécution ne permet pas de retrouver la marque. D'une part il faut conna^tre la table secrète pour établir notre programme conjugué. D'autre part, le calcul de propriétés sémantiques ne pourra se faire dans la plupart des cas que par analyse statique, et non pas par une exécution pas à pas. La figure 2 expose un exemple de réalisation. o La méthode (310) de la figure 2 sera donc appliquée à chaque méthode du programme (ou au moins à celles qui ont un contenu algorithmique que l'on souhaite protéger). La sélection des instructions à transcoder tient compte de la dynamique d'exécution du code Java: I'allocation des objets s'effectue "sur le tas", c'est-à-dire en fonction du contexte d'utilisation des ressources des processeurs, de la mémoire et des entrées/sorties et, le cas échéant, des autres membres du réssau. Les instructions portant sur les objets ne sont donc pas recommandées pour le tatouage puisque celui-ci doit être indépendant du contexte. Le tatouage doit donc porter sur des valeurs scalaires ou des références à des objets qui sont les seuis opérandes à allouer sur la pile du programme. Le critère prédéterminé peut comprendre le choix comme instructions à transcoder des opérations sur les entiers, les flottants ou les valeurs booléennes. Pour les programmes standards on choisira les 2 opérations sur les entiers. Pour les programmes de conception assistée sur ordinateur, de simulation ou de modelage en trois dimensions o les opérations sur scalaires flottants dominent, on choisira plutôt ces opérations. Le module (310) de la figure 2 est alors uniquement utilisé pour sélectionner les instructions (110), (130), (150) des méthodes du programme (10) qui comportent des opérations sur les entiers. Un transcodage qui respecte la sémantique de l'instruction consiste alors à effectuer la même opération modulo à un entier quelconque Nk inférieur à 232. Une alternative consiste à effectuer une opération différente choisie dans une table de permutation, encore en algèbre modulaire. Le module (320) a, dans ce cas, pour fonction principale de 1 4.2824402 conserve r la table des secrets attribués à des classes d' utilisateu rs donnés pour des programmes donnés. Le module (330) pour calculer et insérer les instructions transcodées est une suite d'instructions du compilateur (30) du type décrit ci après. On veut insérer p marques dans chaque méthode sélectionnée. Soient p nombres n, n2,....,np et p valeurs de marques c, Cp On répétera la suite des macro-instructions de l'annexe 1 pour chaque méthode à tatouer. Il est bien entendu possible de répéter plusieurs fois le processus avec des valeurs différentes de marques. Il est également possible d'améliorer la robustesse du tatouage en utilisant différentes techniques de l'algèbre modulaire. La technique la plus forte pour lier le tatouage au programme est de faire interférer les variables de tatouage avec la méthode originale. Il faut pour cela pouvoir utiliser des propriétés de la variable de tatouage qui soient transposables en arithmétique signée sur 32 bits. C'est possible lorsque la clef K est une puissance de 2. En effet, supposons que K = 2k. Alors on a: X = v + a. 2k dans Z Nous savons, toujours dans Z. que, pour tout j que soit la valeur de x, on a toujours x% 4 = 2. Si on a par exemple une constante explicite 1 dans le programme original, on peut la remplacer par x% 4-1. Si maintenant on a rajouté une dynamique à x, on a une variable qui prend en apparence des valeurs stochastiques mais dont on utilise un invariant caché. Le programme ainsi mod ifié est dég radé de man ière i rréve rsib le to ut en conservant sa sémantique originale. Un pirate qui chercherait à éliminer la variable de tatouage x rendrait alors le programme inutilisable. Il faut une étude poussée 5.2824402 du comportement de x pour pouvoir retrouver l'information ainsi dissimulée. Notons que cette technique de dissimulation de constantes peut se faire simplement de manière automatique et aléatoire. La méthode générique de la lecture du tatouage est présentée sur la figure 3. Elie suppose la connaissance d'une partie au moins des paramètres de tatouage. Il est ainsi possible d'affecter à plusieurs niveaux d'une chane de distribution de logiciel (acheteur, grossiste, distributeur, détaillant) des marques qui leur seront propres. Dans l'exemple de réalisation de la figure 4, la connaissance du ou des nombres secrets Nk permet de retrouver par une exécution pas à pas du programme dans le compilateur les variables qui comportent une congruence modulo Nk à un instant donné puis de tracer cette variable jusqu'à son initialisation. La table des secrets peut être aisément contenue sur une carte à microprocesseur qui sera connectée à l'ordinateur comportant l'interpréteur. L'utilisateur habilité n'a à conna^'tre qu'une clé publique qui activera le programme de lecture des secrets correspondant à son identification d'utilisateur. Les clés privées qui définissent la table des secrets n'ont donc pas à étre divulguées. De ux exe mples do n nés en annexes 2 et 3 permettent d' il l ustre r l'application de l'analyse statique sémantique à l'authentification de la signature du logiciel avec deux cas simples de calcul des points fixes des variables cachées. Ces dispositifs et procédés peuvent être mis en _uvre sans difficulté sur des ordinateurs de commerce. En fonction de la complexité du logiciel et de la signature, les temps d'exécution seront plus ou moins longs, notamment pour le calcul des variables cachées par la méthode du point fixe. Pour limiter ces temps de calcul, on appliquera les méthodes d'élargissement et de rétrécissement con n ues de l' h o m me d u métie r. On peut tatouer autant de fois que l'on veut un logiciel (superposition de tatouages), contrairement aux tatouages de sons ou d'images qui subissent une certaine saturation du canal subliminal (selon le 1 6 2824402 modèle de perception choisi). On n'altèrera pas le logiciel, on le surchargera, les ressources mémoire et temporelles seront affectées. On peut utiliser pour chacun de ces tatouages des sémantiques secrètes différentes, si bien que la chane de confiance peut avoir des secrets différents. Bien entendu, ce dispositif et ce procédé de tatouage peuvent être combinés avec des dispositifs et procédés de l'art antérieur pour rendre le programme inutilisable à un utilisateur non autorisé (prévention) pour tracer la dissémination éventuelle dudit programme par un utilisateur autorisé à des utilisateurs non autorisés (audit). Il suffira pour cela de ne pas communiquer aux utilisateurs autorisés les clés leur permettant de retrouver le tatouage. Il est également possible d'utiliser le dispositif et le procédé pour authentifier de manière automatique les codes que l'on va autoriser à pénétrer sur un réseau ou sur un poste donné. Le tatouage est assimilable à un certificat d'authentification dont le poste de surveillance du réseau ou du poste disposera de la clé de lecture. L'Annexe 4 présente un glossaire. L'Annexe 5 présente un mode de réalisation de l'invention avec un découpage en modules plus fin. L'Annexe 6 et l'Annexe 7 présentent de nouveaux exemples de réalisations (exemples 3 et 4). 17.2824402 ANNEXES ANNEXE 1 1.1 Décomposition de la méthode en 2 blocs A et B de taille équivalente. 1.2 Pour i variant de 1 à p faire 1.2.a trouver une position aléatoire dans le bloc A 1.2.b faire la liste des variables ayant une valeur déterminée à ce niveau d'exécution - 2 cas: cas 1: il n'y en a pas Créer une variable w initialisée à une valeur x. Insérer cette in itial isation e ntre le dé but de la méthode et notre position actu el le. cas 2: il y en a au moins une Sélectionner une de ces variables w, soit x sa valeur à notre position actuelle d'exécution. 1.2.c créer un polynôme P quelconque de degré 2 vérifiant P(x) = c; + k*nj (k entier aléatoire petit) 1.2.d insérer l'instruction d'initialisation suivante: int vi=P(w) 1.2.e trouver une position aléatoire dans le bloc B 1.2.f créer un polynôme Q quelconque de degré 2 vérifiant Q(vj)=vj+1*nj (1 entier aléatoire petit) 1.2.g insérer l'instruction vi=Q(vi) ANNEXE 2 Exemple 1 La méthode tatouée est la méthode principale de la classe Fibonacci, qui calcule la valeur du nième terme de la suite de Fibonacci, définie par les tUn+2 = Un+ + Un relations u0 = 0 l UI=1 . 2824402 Programme initial public class Fibonacci public Fibonacci() 3 public static void main(String[] args) { int n=l nteger.parseint(args[0]); int a=O; int b=1; for (int i=1;i nous utilisons deux tables de transcodage. La première permettra d'insérer la valeur cachée 2507, la seconde 30 12. 19 2824402 Nos deux tables associent à chaque opération algébrique sur des entiers 1' opération algébrique identique modulo un nombre N. A tout retour de valeur entière consécutif à l'appel d'une méthode de type int, on associe l'initialisation à une valeur V. Pour la première table, N vaut 10000 et V 17. Pour la seconde, N vaut 5421 et V vaut 50. 1. Table de transcodage pour 2507 Instruction initiale Instruction transcodée v (entier)= a (entier) + b (entier) v = a + b modulo 10 000 v (entier)= a (entier) * b (entier) v = a * b modulo 10 000 v (entier) est le retour (entier) de l'appel à une v= 17 fonction lo 2. Table de transcodage pour 3012 Instruction initiale Instruction transcodée v (entier)= a (entier) + b (entier) v = a + b modulo 5421 v (entier)= a (entier) * b (entier) v = a * b modulo 5421 v (entier) est le retour (entier) de l'appel à une v = 50 fonction Tatouage de la méthode Le tatouage de notre méthode consiste en l' i nse rtion de de ux variables j et k, prenant respectivement les valeurs 2507 et 3012 dans notre espace secret. Le tatouage consiste en deux étapes: - Initialisation de j et k en fonction de n en début de programme. Cette initialisation nous permet de calculer la valeur de j et k dans notre espace conjugué, par contre les valeurs de j et k au cours de l'exécution du p rog ram me sont incon n ues. Cela nous pe rmet d' évite r la transformation de ces instructions par un optimiseur. - Ajout d'instructions dans l'algorithme assurant l'invariance de j et k dans notre espace secret. Ces instructions sont des calcuis de j et k à l'aide de polynômes de degré 2. *20.2824402 Ancrage de la marque La marque est ancrée en fin de méthode. En effet, les valeurs de j et k sont apparemment utilisées pour le calcul du résultat b. Ceci est un leurre, car la suite des opérations effectuées sur b laissent in fine cette variable invariante. Programme tatoué public class Fibonacci public Fibonacci() public static void main(String[] args) int n=lnteger.parseint(args[0]); int a=O; int j=-34*n*n-500*n+833; Il j vaut 2507 dans l'espace conjugué n 1 Il (c'est à dire modulo 10000, n->17) int b=1; int k=2*n-n*n-9; Il k vaut 3012 dans l'espace conjugué n 2 (c'est 11 à dire modulo 5421, n->50) for (int i=l;i 21. 2824402 Analyse de la marque La marque se retrouve par Analyse Statique, et la méthode d'approximation du point fixe par itérations. Le programme conjugué dans l'espace n 1 est le suivant: public static void main(String[] args) int n=1 7; int a=O; int j=(-34*n*n-500*n+833) % 10000; lo int b=1; int k=(2*n-n*n-9) % 10000; for (int i=1;i 22 2824402 | Analyse Sémantique Statique: approximation du point fise | | Début | |In -- 17! | État(l) | lla- | État(ll) | n +833[i0000]ji I État(111) 1 151 b -.1i | État(lM) | ||k - 2xn-n: - 9[10000; | ÉtatCV: i 1 r== _' À| ÉtatC'l) | si(i 23. 2824402 ANALYSE STATIQUE SEMANTIQUE Pour chaque état, on étudie l'ensemble des valeurs possibles prises par les variables. On ne considèrera que les variables qui ont changé de valeur par rapport à tous les états précédents possibles. Etat Variable Valeur initiale étudiée/ Intervalle (1) n N.= 0 (Il) a A,, = 0 (111) i J.,, = 0 (IV) b Biv = 0 (V) k Kv = 0 (Vl) j lvI= 0 (Vll) j lvIl = 0 (V111) c Cv,, = 0 (IX) a A1x = 0 (X) j Jy = 0 (Xl) b Bx' = 0 (X11) k Kx1t = 0 (X111) i Iy,'= 0 (XIV) b BYIV = 0 (XV) b B,, = 0 Écriture de l'interdépendance des états N! ={17} AN ={O} JlI! =lj=-34Xn2- SOOXn+833;nE N.: Bv ={} KV ={k=2xn-nxn-9;ne N.} IV! ={1}U(IVI! +) Iv = iv, n:-oo;supn N, Cvw = {c = a +b;a (A" UA,X)AbE (B[V UBXI)} AIX = BIV UBX] JX = {J xS -28; ié (JX U Jm)} BX! = CVIII KXII ={kxk+201;ke (KV UKX")} [=N, + 24. 2824402 ANALYSE STATIQUE SEMANTIQUE Pour chaque état, on étudie l'ensemble des valeurs possibles prises par les variables. On ne considèrera que les variables qui ont changé de valeur par rapport à tous les états précédents possibles. On approximera ces ensembles par des intervalles Numéro 4 d'itératio n N. 0 {17} {17} {17} {17} A" 0 {0} {01 {01 {o} Jl,l 0 0 {2507} {25071 {2507} Bv 0 {1} {1} {1} {1} Kv 0 0 {9736} {9736) {9736) I\r 0 {1} {1} (1:2) (1;2) 1, 0 0 {1} {1} (1;2) Cv,, 0 0 {1} (1;2) (1;2) Ay 0 0 {1} {1} {1) Jx 0 0 0 {2507} {25071 Byl 0 0 0 {1} (1;2) Kyl, 0 0 0 {9897} (82;993 Iyl,l 0 0 0 0 0 By, 0 0 0 {2244} (2244;2405) B," 0 0 0 0 (0;9999) Numéro 35 d'itératio POINT FIXE n N, {17} {17} {17} {17} {17} A,, {o} {o} {o} {0} {o} J.,, {2507} {2507} {2507} {2507} {2507} B", {1} {1} {1} {1} {1} Kv {9736} {9736} {9736} {9736} {9736} Iv (1:3) (1:3) (1:4) (1:4) (1:17) 1, (1;2) (1;3) (1:3) (1;4) (1:16) Cv,,, (1:3) (1:4) (1;5) (1;7) (0;9999) Ax (1;2) (1;2) (1;3) (1;4) (0;9999) Jy {2507} {2507} {2507} {2507} {2507} Byl (1;2) (1;3) (1;4) (1;5) (1; 9999) KXII (2;9997) (2:9997) (2;9997) (2;9997) (2;9997) Iy,l 0 0 0 0 {17} BY[V (0;9999) (0;9999) (0;9999) (0;9999) (0;9999) Bxv (0;9999) (0;9999) (0;9999) (0:9999) (0:9999) On retrouve notre première marque: la variable J garde toujours la valeur 2507. 25.2824402 Le programme conjugué dans l'espace n 2 est le suivant: public static void main(String[] args) int n=50; int a=0; int j=(-34*n*n-500*n+833) % 5421; int b=l; int k=(2*n-n*n-9) % 5421; for (int i=l;i 26. 2824402 | Début | !n=soi r L. |L.a-.-Oi | État (Il) | lo, --34xn2-SOOxn+833[5421j État (111) 1 L.b-. 1i État (IV) , jk = 2xn-n2 -9[5421] État 41 1 [1== _. lo| État (Vl) | 1 A:- -l j st(t ... ..,, tat (V111) 1 Etat ()(IV) | |a -. b.1 r | Ib - b_ i - k x + (1- k?X (i - J) [5421]| | État (XV) | j - jx5 - 28[5421]i. r ja.Éichage(b)i | État(X) | L Fin [5 ik - k2 + 2015421 i État (Xll) r 1 ii =+1lS421]j 27 2824402 ANALYSE STATIQUE SEMANTIQUE Pour chaque état, on étudie l'ensemble des valeurs possibles prises par les variables. On ne considèrera que les variables qui ont changé de valeur par rapport à tous les états précédents possibles. Etat Variable Valeur initiale étudiée/ Intervalle (1) n N.= 0 (Il) a A"= 0 (111) i Jl,l = 0 (IV) b B, = 0 (V) k K = 0 (Vl) 1= 0 (V11) i 1"" = 0 (V111) c CVIII = 0 (IX) a Aly = 0 (Xl) b By, -- 00 (Xll) k Kyll = 0 (X111) i 11,, = 0 (XIV) b B",= 0 (XV) b B, = 0 Écriture de l';nterdépendance des états N. = {50} A" = {O} J", = {j = -34 x n2 - 500 X n + 833; n N.} Bv = {1} Kv = {k = 2 x n - n x n - 9; n N.} IV! = {1}U (IVI! + 1) ] [ r N, Cv ={c=a+b;ac (An UAx)Abe (B'v UBX,)} Ax = B,v U Bx JX = X S - 28; j (JX U J",)} Bx, = Cv,,, Kx,, ={kxk+201;k (Kv UKX")} Ixm =Iv 0[nf n;+[ BXIV ={b=b+k+ j;bfE (Bv UBX,)Ak (Kv UKx")A j (J"! UJX)} BXV ={b=b-l-kxi+(l-k) x(l-i);bé Bx,v Ak (KV UKX")^ j (JIH U JX)} 28 2824402 ANALYSE STATIQUE SEMANTIQUE Pour chaque état, on étudie l'ensemble des valeurs possibles prises par les variables. On ne considèrera que les variables qui ont changé de valeur par rapport à tous les états précédents possibles. On approximera ces ensembles par des intervalles Numéro 4 d'itération N. 0 {50} {50} {50} {50} A" 0 {o} {0} {0} {0} J.,, 0 0 {4674} {4674} {4674} B,v 0 {1} {1T {11 {11 KV 0 0 {3012} {3012}. {3012} Iv 0 {11 {1} (1;2) (1;2) 1," 0 0 {1} {1} (1;2) Cv,,, 0 0 {1} (1;2) (1;2) Ay 0 0 {11 {1} {1} Jx 0 0 0 {1658} (0;5420) Bx, 0 0 0 {1} (1;2) KX,, 0 0 0 {3012} {3012} Iy'' 0 0 0 0 0 BYV 0 0 0 {2266} (0;4671) BYV 0 0 0 0 (0;5420) Numéro 105 d'itération POINT FIXE N. {50} {50} {50} {50} {5o} A, {0} {0} {0} {0} {o} J.,, {4674} {4674} {4674} {4674} {4674} B,v {1} {1} {1} {1} {1} KV {3012} {3012} {3012} {3012} {3012} Iv, (1;3) (1;3) (1;4) (1;4) (1;50) Iv,, (1;2) (1;3) (1;3) (1;4) - (1;49) C,", (1;3) (1;4) (1;5) (1;7) (0;5421) A,x (1;2) (1;2) (1;3) (1;4) (0;5421) Jy (0;5420) (0;54201 (0;54201 (0; 5420) (0;5420) Bx, (1;2) (1;3) (1;4) (1;5) (3;5420) Kx' {30 1 2} {30 12} {30 12} {30 12} {30 12} Ixl', 0 0 0 0 r501 Bxv (0;5420) (o;5420) (0;5420) (0;5420) (0,5420) BYV (0;5420) (0;5420) (0;5420) (0;5420) (0;5420) Nous retrouvons notre deuxième marque: 3012. 29. 2824402 ANNEXE 3 Exemple 2 La méthode dont on extrait la signature sémantique est une méthode de tri bulles. Programme initial public class Bulle public static void main(String[] args) { int[] table=new int[args.length]; for (int i=O; i print(table); print(tri(table)); public static void print(int[] table) { System.out. println("'); for (int i=O;i table2[i+1]) v=table2[i]; table2[i]=table2[i+1]; table2[i+1]=v; flag=false; }} } return(table2); }} 30. 2824402 Choix-d'une table de correspondance sémantique Nous souhaitons obtenir une propriété sémantique après transcodage. Pour cela nous utilisons une table de transcodage. Pour les variables de notre espace conjugué, nous ajouterons aux variables de notre espace initial deux nouvelles variables W et W' de type entier qui sont initialisées avec la valeur 0. Ensuite nous tâchons de repérer les transpositions effectuées sur les tableaux du programme, et nous remplacerons ces opérations effectuées sur le tableau par des opérations sur la variable W. Une analyse statique sur 0 W montrera qu'elle garde une valeur constante égale à 1 dans toutes les situations. Table de transcodage Instruction initiale Instruction transcodée Début de programme W vaut O W' vaut O Séquence: Séquence: à l'indice P> - Si W=0 Alors W=1 - W'=min(P,Q) T est un tableau, paramètre d'entrée T est le tableau (5; 2; 4; 1; 3) 31. 2824402 Signature de la méthode La signature de la méthode consists en l'analyse statique sémantique de la méthode et la détection de propriétés Analyse du programme les propriétés se retrouvent par Analyse Statique, et la méthode d'approximation du point fine par itérations. 32. 2824402 Le graphe d'exécution du programme conjugué est le suivant: | Début | 1; itablé = [5,2;4;1;3]i | État (1) | | flag - false 1 0 | État (Il) | |-IZ-O;V-OI | État (111) | 1 rw ô w 0 _, jsi(flag = false)! Lsinon, | État (V) | 1 | i; -.ô [41 25., r - -! _ À._._.3 ,. 1 j,sZ(Z. If sz(table[z] > table[c + ii) i r i- | État (Veil) | ,jW = W x|z-(z+l)! Etat (IX) I r- - - (- - I | État(X) | 1 j flag - fal-se i _ ! 33. 2824402 | Écriture de l'interdépendance des état:s | TABLE, = f5;2;4;1;3t FLAG" =:false} t1",={0} tWv={O} lVu = {O} lW''v = {O} FLAGV = FLAG" r {false} Iv = {O}u (Ivm 1) Iv = Iv n};longueur(table" X iTABLEV,,, = {table (TABLEH U TABLEV,,/) tel que 3i E Iv,, tel que table(i) table(i + 1)} IVIH ={ie Iv" telque3tablers (TABLE" UTABLEv",)telquetable(i)-table(i+l)} Wx = ( UUwf () vi f x O {X x li - (t + l); i Iv} W'x = {min(i + l; i}, i Ivm} FLAGX, = {false} Itérations 2 FLAGV 0 {false} {false} 1" 0 {O} {0; 1} v 0 { } {O;1} TABLEVIll 0 {t5;2;4; 1;3)} {(5;2;4; 1;3)} IVIII 0 {O} {O} WlX 0 {1} {1} W' 0 {0} {01 FLAGyl 0 {false} {false} Itérations 5- POINT FIXE FLAGV {false} {false} {false} {0;1;2} {0;1;2;3} {0;1;2;3;4} lvl {0; 1;2} {0; 1;2;3} {0; 1;2;3} TABLEVl,l {(5;2;4;1;3)} {(5;2;4;1,3)} {(5;2;4;1;3)} lvil {0;2} {0;2} {0;2} Wlx {1} {1} {1) w 34 2824402 Signature: On note la signature de notre méthode de tri bulles: En considérant la table de transcodage secrète, on note que: - ' - 2824402 ANNEXE 4 Glossaire - Un procédé de protection-prévention de logiciel ou matériel est un ensemble de techniques qui rendent plus difficiles la copie et l'utilisation frauduleuse des logiciels ou circuits électroniques. - Un programme est écrit dans un certain langage de programmation appelé langage informatique du programme. lo - L'interprétation d'un programme est la traduction de la suite de mots le composant en une suite d'actions appelée exécution du programme. - La compilation d'un programme source, écrit dans un langage de haut niveau, est sa traduction dans un autre langage ou matérialisation en un automate, en général langage machine ou circuit électronique. - Un programme informatique logiciel est un programme interprétable ou compilable en un programme interprétable. - Un programme informatique matériel est un programme réalisable par un circuit électronique et spécifié par un langage de description de circuit. - U n é léme nt d' u n program me inform atiq u e est u ne parti e no n nécessairement connexe du texte du programme correspondant à une ou plusieurs instructions, éventuellement composées (comme une commande de choix conditionnel ou par cas, une boucle, etc.), une déclaration ou description d'une ou plusieurs structures de données comprenar-,t éventuellement les ou des opérations agissant sur ces structures de données, une ou plusieurs procédures ou méthodes, un ou plusieurs modules, etc. - Une sémantique d'un programme logiciel ou matériel est un modèle mathématique définissant l'ensemble des comportements possibles d'un programme à 1'exécution à un certain niveau d'observation. - L'analyse statique sémantique est la détermination automatique de propriétés sémantiques des programmes. - Deux programmes logiciels sont sémantiquement équivalents (ou fonctionnellement équivalents) s'ils ont le méme comportement observable c'est-à-dire qu'ils s'exécutent de manière fonctionnellement 36 2824402 équivalente, (par exemple, si pour toute entrée possible, les sorties du programme sont les mêmes). - Une sémantique abstraite d'un programme logiciel ou matériel est un modèle mathématique définissant une sur-approximation ou une sous approximation de l'ensemble des comportements possibles d'un programme à l'exécution. - Une sémantique abstraite est secrète si sa spécification pour un program me logiciel ou matériel nécessite la connaissance d'un secret. - Une signature est une information caractéristique (étiquette, lo vignette ou résumé) associée à un objet (ici, un programme logiciel ou matériel). Cette information peut dépendre d'une propriété intrinsèque ou extrinsèque de l'objet. Ces propriétés peuvent authentifier la forme et fond du contenu de l'objet (le codage, le format, la syntaxe, I'esthétique, la sémantique) ou sa traçabilité (I'histoire et/ou le devenir de cet objet). - Une signature secrète est une signature obtenue à l'aide d'une méthode faisant appel à un secret. - Une signature sémantique est une signature spécifiée en fonction de la sémantique de l'objet (ici, du programme écrit dans un langage de programmation, avec une sémantique définie). - Un authentifiant est une preuve secrète de la détention d'une information ou d'un droit (par exemple désignation de l'objet, nom de l'auteur, nom du destinataire, termes de la licence d'utilisation, etc.). - Une marque est une composante d'un objet qui permet de l'identifier et qui, dans le contexte de l'invention, permet de retrouver une signature de l'objet. - L'étiquetage d'un objet ou d'un programme consiste à fabriquer une étiquette qui est en général séparée du contenu de l'objet ou incrustée dans l'objet à un endroit facilement repérable. - À la différence, le tatouage consiste à incruster une (ou des) marque(s) dans le corps de l'objet. Cette marque répartie dans le corps de l'objet est en général sinon indécelable du moins indélébile. L'objet greffé avec cette marque s'appelle l'objet tatoué. - L' obfuscation est la transformation d'un programme en un programme sémantiquement équivalent sous une forme difficile à comprendre par un informaticien mais utilisable par un utilisateur. À la 37. 2824402 différence du tatouage, I'obfuscation rend un programme confidentiel (grâce à la difficulté de le comprendre) mais ne permet pas l'authentification [cf. Obfuscation techniques for enhancing software security, New Zealand Patent Application #328057, WO 99/01815, PCT/US98/12017, 9 June 1997]. - Le lessivage de marque est une tentative d'effacement ou de modification de la marque ou bien une surcharge du programme pour noyer la marque, sans changer la sémantique du programme. - Un tatouage de programme est robuste s'il résiste à une optimisation de compilation, une obfuscation, un étiquetage et à un autre tatouage, toutes ces opérations étant appliquées ultérieurement. 38 2824402 ANNEXE 5 Descrintion analvtinue des modules et arrière-plan théorinue Un procédé A de sémantique abstraite L'inventeur utilise les principes et techniques de l'analyse statique sémantique des programmes par interprétation abstraite, cf. [P. Cousot & R. Cousot, >, Conférence internationale "" Principles of programming languages, POPL'77 >>, p. 238- 252, ACM Press, Janvier 1977] et [P. Cousot & R. Cousot, ', Conférence internationale >, p. 269-282, ACM Press, Janvier 1979]. Le p rocédé/mod u le A défin it une i nfi n ité de sé mantiques abstraites secrètes dépendantes: - d'un domaine abstrait D(K) paramétré par une clé secrète K (qui, à une injection près, peut être considérée comme un nombre N = b(K), cette injection b pouvant elle-même constituer un secret); d'une clé secrète K particulière qui définit le domaine abstrait D(K) utilisé dans la sémantique abstraite secrète SAS. Cette sémantique abstraite secrète SAS est constituée du domaine abstrait secret D(N) et des opérations abstraites correspondantes pour les constructions et primitives de la famille de langages de programmation considérés, obtenues en utilisant les principes de l'interprétation abstraite. Tout domaine abstrait D(K) obtenu par une abstraction, au sens de la théorie de l'interprétation abstraite, cf. [P. Cousot & R. Cousot, >, Conférence internationale domaines abstraits D(K), paramétrés par une clé K, qui sont utilisables. Cependant, les domaines abstraits publiés dans la littérature scientifique ne conviennent pas, en ce sens qu'ils ne sont pas paramétrés par une clé K (même choisie de manière isomorphe aux entiers ou aux ordinaux). Fait partie de l'invention, la transformation d'un domaine abstrait quelconque utilisable pour l'analyse sémantique statique classique dont la concrétisation fournit une information sur des valeurs entières (à un codage injectif près) en un domaine abstrait D(N) paramétré par un entier N constituant la clé secrète K = N (audit codage près). Le procédé consiste à abstraire (au sens de l'interprétation abstraite) des opérations concrètes en une opération abstraite considérant l'opération concrète réalisée modulo N. Cette abstraction est ensuite étendue aux éléments de contrôle du programme selon les principes de l'analyse statique sémantique par interprétation abstraite, en utilisant éventuellement les techniques d'é largissement et de rétrécisse ment con nues de l' homme de métier. Des exemples de transformation de tels domaines D en domaines D(N) sont décrits ci-dessous: Pour un programme P écrit en langage algorithmique (avec des additions, des multiplications, des boucles, des branchements,.. .) et dont I'auteur veut sécuriser le contenu algorithmique sensible, on peut définir, pour le module A, un domaine abstrait D(K) pour les variables entières ou à virgule fixe ou flottante, voire les réels correspondant à la propagation des constantes, aux puissances, aux intervalles, aux octogones, aux invariants d'égalité ou d'inégalité linéaires, etc. modulo une valeur entière positive N constituant la clé secrète K = N; Pour un programme P écrit en langage de programmation avec des données symboliques (avec des pointeurs, des listes, des tableaux,...) , et dont l'auteur veut sécuriser le déroulement sensible de manipulation de variables et de tableaux, on peut utiliser un domaine abstrait symbolique (par exemple un automate ou des domaines d'arbres) paramétré par des entiers (par exemple compteurs de boucles dans l'automate ou une mesure de la taille des données symboliques) en réutilisant le domaine abstrait précédent D(N) pour analyser les paramètres entiers, modulo une valeur entière positive N constituant la clé secrète K, à nouveau à une injection (pouvant être secrète) près. Il existe d'une part une infinité de domaines abstraits Di possibles et d'autre part une infinité d'instances Di(K) de chaque domaine particulier en fonction de la clé secrète K. Contrairement à la cryptologie classique, si le module A est secret, o il n'est pas envisageable de le casser par la force brute. En effet il n'existe pas d'énumération possible de tous les domaines abstraits paramétrés utilisables. Pour un domaine abstrait secret donné Di(N), des clés différentes conduisent à des sémantiques abstraites secrètes SAS différentes, comme c'est le cas pour les exemples ci-dessus. Quand le domaine abstrait secret a été divulgué ou est public, le secret de la clé doit être géré comme en cryptographie classique pour limiter les attaques à la force brute (comme dans le cas de la cryptologie classique basée sur les problèmes NP-complets ou les mécanismes de chiffrement à clé secrète). La sémantique abstraite secrète SAS doit être invariante pour les transformations des primitives et constructions de la famille de langages logiciels ou matériels considérés, qui laissent leur sémantique standard invariante, comme c'est le cas pour les exemples ci-dessus. Ceci est important pour éviter les attaques d'obfuscation qui consistent à transformer un programme P en un programme syntaxiquement différent mais sémantiquement équivalent, par exemple, I'expression mathématique (a = 2b) étant changée en (a = b + b). (Voir Figure 5) Un Module DA de sémantique abstraite Parmi les modes préférés de réalisation du procédé ci-dessus, I'invention divulgue également un dispositif (pouvant être réalisé par un produit/programme d'ordinateur) incluant: 41.2824402 Un module DA basé sur un domaine abstrait D'(K) paramétré par une clé secrète K choisie parmi un très grand nombre possible, permettant d'engendrer un programme implantant la sémantique abstraite secrète SAS de la famille de langages de programmation logiciel ou matériel considérés; (Voir Figure 5A) Un procédé S de signature Le procédé/module S utilise une sémantique abstraite secrète lo SAS pour les constructions et primitives de la famille de langages de programmation considérés, pour faire l'analyse statique sémantique du programme original P logiciel ou matériel, le résultat de cette analyse fournissant la signature sémantique secrète SSS du programme P. Pour ce faire, le module S construit une représentation du système d'équations de point-fixe dont la solution approchée définit la sémantique abstraite SASP dudit programme logiciel ou matériel P. Cette sémantique abstraite SASP du programme logiciel ou matériel P est définie selon les principes de l'analyse statique par interprétation abstraite de la sémantique concrète du programme en fonction de la sémantique abstraite secrète SAS pour les constructions et primitives de la famille de langages de programmation considérés. Cette sémantique abstraite SASP est calculée par élimination, ou par itération avec accélération de la convergence. La signature sémantique secrète SSS du programme P est une fonction injective SSS = i(SASP) de la sémantique abstraite secrète SASP. Cette fonction injective i peut elle-même constituer un secret. La signature sémantique secrète SSS d'un programme logiciel ou matériel P. calculée selon le module S ou par le dispositif DS permet de vérifier si un programme logiciel ou matériel P' a une signature sémantique équivalente. À ce stade, il est possible de déposer la signature SSS du programme logiciel ou matériel P telle que produite selon le module S ou en sortie du dispositif DS chez une Tierce Partie de Confiance (TPC). Elle n'a donc pas à être insérée dans le programme logiciel ou matériel P. L'authentification du programme logiciel ou matériel P s'effectuera alors auprès de la TPC par comparaison de la signature produite SSS' du 42 2824402 programme logiciel ou matériel P' à analyser avec celle (SSS) qui a été déposée. Dans ce cas, le programme logiciel ou matériel P n'est pas protégé contre la copie P', mais deux cas se présentent: SSS' est différent de SSS: les modifications que P a subies sont détectables, puisque dans le cas de modifications sémantiques (par exemple, ajout d'un virus, modification d'un algorithme), la signature est différente; SSS' est égal à SSS: le programme logiciel ou matériel P' est une copie de P ou si le programme logiciel ou matériel P a été obfusqué lo (manuoilement ou automatiquement) pour devenir P', la signature SSS' de P' sera égale à celle SSS de P. ce qui prouvera, avec une probabilité extrêmement faible d'erreur, que le programme logiciel ou matériel P a été piraté, ce piratage étant masqué par un maquillage d'édition. (Voir Figure 6) Un module DS de signature Un module DS permettant de calculer la signature SSS d'un programme logiciel ou matériel P selon la sémantique abstraite secrète SAS obtenue en utilisant le module précédent DA. (Voir Figure 6A) Un procédé M de marquage Pour l'invention, une marque m est un élément de programme logiciel ou matériel qui peut être insérée dans un programme logiciel ou matériel par le procédé décrit dans le module B ci-dessous. Soit Pm le programme logiciel ou matériel le plus simple possible dans lequel la marque m peut être inséré. Pour toute sémantique abstraite secrète SAS, ce programme Pm a une signature sémantique secrète, calculable par le module S. dite signature sémantique secrète de ladite marque m et notée SSS(m). Une > m est un triplet constitué d'un " >, d'une > et d'une >, I'une des deux dernières pouvant éventuellement être vide. 43 2824402 - Soit Pm un programme logiciel ou matériel de la famille de langages considérée, le plus simple possible, qui déclare si nécessaire I" ' 'X', exécute la > 'la', puis exécute une ou plusieurs voire un nombre infini de fois la >'lf'. Le procédé M de marquage est paramétré par une sémantique abstraite secrète SAS (par exemple, produite par le module A à partir d'un domaine abstrait Di(K) en fonction d'une clé secrète K) et une signature lo sémantique secrète SSS; En utilisant une bijection 13 qui peut être secrète, le module M calcule une valeur abstraite 's' du domaine abstrait Di(K) en fonction de la signature sémantique secrète SSS, selon le codage de la sémantique abstraite secrète SAS. Cette valeur abstraite 's' est choisie de sorte qu'il existe de très nombreuses valeurs concrètes 'x' dont l'abstraction selon les principes de l'interprétation abstraite ou celle du singleton '{x}' est la valeur abstraite 's'. Par exemple cette valeur 'x' peut être celle d'une variable dans le cas d'une analyse non-relationnelle ou d'un vecteur de variables pour une analyse relationnelle ou la valeur de tout objet analogue à un vecteur de variables; Le procédé M choisit, selon les principes de l'interprétation abstraite, I'une quelconque des valeurs concrètes 'a' dont l'abstraction ou celle du singleton '{a}' est la valeur abstraite s; Le procédé M choisit ensuite, selon les principes de l'interprétation abstraite, une opération concrète 'f' dont l'abstraction fonctionnelle laisse invariante la valeur abstraite 's' mais pas les valeurs concrètes correspondantes (c'est-à-dire que si 'x' est une valeur concrète dont l'abstraction selon les principes de l'interprétation abstraite ou celle du singleton '{x}' est la valeur abstraite 's' alors 'f(x)' est en général différent de 'x' tan dis q u e l'abstraction selon les p rincipes de l' i nterp rétation abstraite de f(x)' ou celle du singleton '{f(x)}' est égale à 's'); Le procédé M choisit ensuite un > 'X' qui peut être une variable existante du programme qui est inutile ou n'est pas vivante dans les éléments du programme P à tatouer, une nouvelle variable auxiliaire, un champ inutile ou supplémentaire d'une structure de données 44.2824402 allouée dynamiquement, etc. dont les valeurs sont prises en compte dans l'analyse statique sémantique utilisée pour déterminer la sémantique abstraite secrète du programme; Le procédé M détermine ensuite une "" marque d'initialisation '> 'la' qui est constituée d' une ou plusieu rs primitives ou constructions de la famil le de langages considérés s'interprétant comme une affectation de la valeur concrète 'a' définie cidessus à l'emplacement de marque 'X'; Le procédé M détermine ensu ite une > ' If' comprenant une ou plusieurs primitives ou constructions de la famille de langages considérés s'interprétant comme une affectation de la valeur de f(X)' à l'emplacement de marque 'X'. Selon la famille de langages considérés, ces primitives ou constructions seront des affectations, des passages de paramètre, des unifications, etc. La marque m est choisie telle que, selon les principes de I'interprétation abstraite, I'analyse sémantique statique du programme Pm, selon la sémantique abstraite secrète et conformément aux directives du module S. détermine de façon reconnaissable par le détenteur du secret SAS, la valeur abstraite 's' définie ci-dessus et telle que la signature sémantique secrète du programme Pm, comme définie ci-dessus, est celle SSS(m) de la marque. En utilisant des domaines abstraits qui sont des produits cartésiens ou des p rod u its rédu its de domai n es abstraits él ém entai res, i l est toujours possible de considérer les marques qui sont des ensembles finis de marques élémentaires. (Voir Figure 7) Un Module DM de marquage Parmi les modes préférés de réalisation du procédé M ci-dessus, I'invention divulgue également un dispositif DM (pouvant être réalisé par un produit/programme d'ordinateur) qui, à partir du programme implantant la sémantique abstraite secrète SAS et des données représentant la sémantique secrète SSS du programme P. calcule le texte de la marque m. (Voir Figure 7A) 2824402 Un procédé B de camouflage Le procédé/module B de camouflage prend en paramètre le programme logiciel ou matériel original P. une sélection des éléments du programme P à tatouer et une marque m. Le module B fournit le programme tatoué PT qui est une fusion du programme original P et de la marque m. Cette fusion est faite sans altérer la sémantique abstraite secrète de la marque, ni la fonctionnalité. du programme original, ce qui permet de retrouver la signature sémantique secrète SSS(m) de la marque m à partir de o la signature sémantique secrète SSS(PT) du programme tatoué PT. Il est important de noter que, dans le mode de réalisation préféré de l'invention, I'observation des valeurs prises par les variables lors de l'exécution du programme logiciel ou matériel tatoué PT ne permet pas de retrouver la marque. D'une part, il faut conna^'tre la sémantique abstraite secrète pour établir le programme tatoué PT. D'autre part, le calcul de propriétés sémantiques de ce programme logiciel ou matériel tatoué PT ne pourra se faire, dans les cas de domaines abstraits D(K) non triviaux, que par analyse sémantique statique, et non pas par une exécution pas à pas. L'insertion des instructions dans le programme logiciel ou matériel à protéger P devra respecter un certain nombre de règles minimales de robustesse. Par exemple, pour éviter la suppression pure et simple par un optimiseur utilisant les techniques d'extraction marques de tatouage. La marque m créée par le module M, la sélection des éléments à tatouer dans un programme logiciel ou matériel P telle qu'elle est choisie par le module PS et utilisée par le module B doivent satisfaire aux critères énoncés ci-après. Les 'If' doivent être incluses dans les parties du programme logiciel ou matériel contenant des primitives ou constructions de répétition (itérations, récursivités, etc.). Les " > 'la' sont utilisées pour faire les initialisations requises par la sémantique de la famiile de langages considérés. De plus, si nécessaire, pour la famille de langages considérée, d'éventuelles déclarations doivent être ajoutées au programme tatoué PT si la nature des 1" ' 'X' le nécessite. Finalement, le module de camouflage B ajoute des primitives ou constructions au p rog ram me tatoué PT re n dant actives les valeu rs éventuellement utilisées dans les " emplacements de marque >, 'X'. Une solution possible consiste à utiliser les valeurs éventuellement utilisées dans les " emplacements de marque '> dans le calcul de variables actives du programme matériel ou logiciel tatoué PT, ou encore à affecter les valeurs des " em placements de marq ue >> 'X' à des variables dyn am iques d u programme tatoué PT, plus généralement en s'assurant que la durée de vie dynam ique des > 'X' est cel le du p rog ram me tatoué PT. À nouveau ces transformations du programme P en le programme tatoué PT doivent être faites sans altérer la sémantique abstraite secrète de la marque, ni la fonctionnalité du programme original, de façon que, selon les principes de l'analyse statique par interprétation abstraite, cela permette de retrouver la signature sémantique secrète SSS(m) de la marque m à partir de la signature sémantique secrète SSS(PT) du programme tatoué PT. (Voir Figure 8) Un Module DB de camouflage Parmi les modes préférés de réalisation du procédé B ci-dessus, I'invention divulgue également un dispositif DB (pouvant être réalisé par un produit/programme d'ordinateur) qui, à partir du texte du programme logiciel ou matériel P. de données de sélection des éléments à tatouer dans P et du texte de la marque m, produit le texte du programme logiciel ou matériel PT dont la sémantique est fonctionnellement équivalente à celle de P et qui dissimule la marque m. (Voir Figure 8A) Un procédé PS de politique de sécurité Le procédé PS de sélection du domaine abstrait de tatouage et des éléments à tatouer dans le programme logiciel ou matériel P dépend de la politique de sécurité à appliquer à ce programme P: o A l'image des techniques stéganographiques, la marque peut être répartie dans le programme à des endroits différents et éloignés en choisissant par exemple des analyses sémantiques statiques par interprétation abstraite basoes sur des domaines abstraits permettant d'ignorer les structures de contrôle dans le calcul de la signature sémantique secrète de sorte que la répartition aléatoire des marques est sans effet sur cette analyse; cette stratégie est par exemple applicable lorsque la marque se rt à authe ntifier tout u n program me P. relativement i mportant en tail le. Une autre politique de sécurité consiste à tatouer les parties innovantes et/ou sensibles du programme P. En général les éléments sélectionnés pour le tatouage concernent la partie algorithmique du programme (opérations algébriques ou manipulations de variables en mémoire vive). Selon la famille de langages de programmation considérés et la méthodologie de programmation utilisée, cette partie algorithmique peut être: - Des éléments significatifs du programme qui sont sémantiquement autonomes. En Java_ par exemple, un programme est assimilé à plusieurs classes composées de plusieurs méthodes, elles mêmes pouvant faire appel à des méthodes d'autres classes et d'autres packages. Une politique de sécurité pour Javam peut donc consister à tatouer les méthodes qui sont les plus petites entités autonomes significatives du programme. Un autre choix serait de tatouer des Beans_. - Des éléments répartis dans le programme constituant un en semble sémantiq uement cohé rent com me par exem ple u n type abstrait algébrique qui serait implémenté par des structures de données et des procébures et fonctions réparties dans tout le programme; Dans ce cas les éléments à tatouer peuvent être sélectionnés automatiquement sur des critères syntaxiques (procédures, modules, etc.) ou sém antiq u es (par u ne analys e statiq ue de dépe n dance) o u man uell ement par intervention d'un opérateur. Plusieurs politiques de sécurité différentes peuvent être mise en ceuvre sur le même programme P en répétant des tatouages successifs du même programme logiciel ou matériel original pour des acteurs différents. Il est ainsi possible d'affecter à plusieurs niveaux d'une chaîne de distribution de matériel ou de logiciel (acheteur, grossiste, distributeur, détaillant) des 0 marques qui leur seront propres. On peut ainsi tatouer autant de fois que l'on veut un programme logiciel ou matériel (par superposition de tatouages), contrairement aux tatouages de sons ou d'images qui subissent une certaine saturation du canal subliminal (selon le modèle de perception choisi). On naltérera pas le programme logiciel ou matériel, on le surchargera, les ressources mémoire et temporelles en seront seules affectées. On peut utiliser pour chacun de ces tatouages des sémantiques secrètes différentes, si bien que la chaîne de confiance peut avoir des secrets différents. Bien entendu, ce dispositif et ce procédé de tatouage peuvent être combinés avec des dispositifs et procédés de l'art antérieur pour rendre le programme matériel ou logiciel inutilisable à un utilisateur non autorisé (prévention) pour tracer la dissémination éventuelle dudit programme par un utilisateur autorisé à des utilisateurs non autorisés (audit). Il suffira pour cela de ne pas communiquer aux utilisateurs autorisés les clés leur permettant de retrouver le tatouage. Il est également possible d'utiliser le dispositif et le procédé pour authentifier de manière automatique les programmes logiciels ou matériels que l'on va autoriser à transiter sur un réseau ou à être hébergés sur un poste informatique donné. Le tatouage est assimilable à un certificat d'authentification dont le poste de surveillance du réseau ou du poste * informatique disposera de la clé de lecture. (Voir Figure 9) 49. 2824402 - Un Module DPS de politique de sécurité Parmi les modes préférés de réalisation du procédé PS ci-dessus, I'invention divulgue également un dispositif DPS (pouvant être réalisé par un produiVprogramme d'ordinateur) qui, à partir du texte du programme logiciel ou matériel P et d'une famille de domaines abstraits D,..., Dm, choisit un domaine abstrait D et sélectionne les éléments du programme P à tatouer. (Voir Figure 9A) o Un procédé T de tatouage Le procédé T de tatouage utilise un module C de chiffrement, qui implante une fonction bijective pour calculer une signature sémantique secrète SSS en fonction d'un authentifiant Auth, en utilisant éventuellement la sémantique abstraite secrète SAS. À partir de cette signature sémantique secrète SSS et de ladite sémantique abstraite secrète SAS, le module de marquage M décrit ci-dessus produit une marque m. Le module T utilise encore le module B décrit ci-dessus qui, à partir de ladite marque m, du programme logiciel ou matériel P et de la sélection des éléments à tatouer dans P fournit le programme logiciel ou matériel tatoué PT. (Voir Figure 10) Un Module DT de tatouage Parmi les modes préférés de réalisation du procédé T de tatouage ci-dessus, I'invention divulgue également un dispositif DT (pouvant étre réalisé par un produiVprogramme d'ordinateur) pour dissimuler un authentifiant Auth dans le texte d'un programme original P logiciel ou matériel grâce à un programme implantant une sémantique abstraite secrète SAS et des données de sélection des éléments de P à tatouer. (Voir Figure 1 OA) Un procédé G général Le procédé général G sert à tatouer un programme P. Pour ce faire, le module PS décrit ci-dessus est utilisé pour choisir automatiquement À 2824402 ou interactivement le domaine abstrait paramétré qui sera ultérieurement utilisé pour réaliser l'analyse statique par interprétation abstraite par le module Au d'authentification ainsi que pour sélectionner automatiquement ou interactivement les éléments du programme logiciel ou matériel à tatouer P. Ensuite, le module A décrit ci-dessus est utilisé pour calculer la sémantique abstraite secrète SAS à partir du domaine abstrait paramétré précédemment sélectionné et d'une cié secrète, en général choisie en interaction avec un opérateur mais qui peut également l'être automatiquement, voire aléatoirement. Enfin, le module T décrit cidessus utilise le programme P. la lo sémantique abstraite secrète SAS, un authentifiant Auth et la sélection des éléments à tatouer dans P pour produire le programme logiciel ou matériel tatoué PT. Des variantes consistent à fixer une fois pour tout le domaine abstrait qui est utilisé par le module G et à choisir la clé secrète K en utilisant une méthode cryptographique standard. Application à la compIlation authentifiante La compilation conserve la sémantique concrète des programmes logiciels ou matériels à un morphisme près. Par conséquent la compilation conserve également la sémantiqueabstraite secrète du programme logiciel ou matériel objet Po, qui est la même que celle du programme source P. à ce même morphisme près. De ce fait, la compilation d'un programme matériel ou logiciel tatoué source PT par un compilateur correct ne lessive pas le tatouage dans le programme matériel ou logiciel objet PTo. Connaissant l'ordinateur cible, on conna^'t la sémantique concrète du code objet et donc celle du programme matériel ou logIciel objet PTo. En adaptant les dispositifs DA et DS, se lon les principes de la théorie de l' interp rétation abstraite, à la sémantique concrète du langage machine de l'ordinateur ou du système informatique objet en utilisant ledit morphisme de compilation, on obtient des dispositifs DAo et DSo conformes aux modules A et S pour la sémantique concrète du code objet et tels que la composition de DA puis DS pour PT donne la même sémantique secrète SSS (audit morphisme près) que la composition de DAo et DSo pour PTo. Par conséquent, le dispositif DAu utilisant le dispositif DSo calcule une représentation de la signature sémantique secrète SSS du programme PTo, qui est également celle du 51. 2824402 programme PT et peut donc être utilisoe par le dispositif DAu pour retrouver l'authentifiant du programme PT. Une des applications de ce brevet est un module Ca de compilation authentifiante compilant un programme tout en y insérant un tatouage selon les principes du module G. Dans son mode de réalisation préféré, un compilateur authentifiant Dca intègre le dispositif DG de la figure 7 bis dans un compilateur pour un langage informatique matériel ou logiciel qui est utilisable en option pour tatouer le code objet. Comme expliqué ci- dessus, le d ispositif DAu perm et de retrouve r l' authe ntifi ant d u p rog ram me lo objet tatoué. (Voir Figure 11) Le Module DG général Parmi les modes préférés de réalisation du procédé G de tatouage ci-dessus, I'invention divulgue également un dispositif DG (pouvant être réalisé par un produit/programme d'ordinateur) pour dissimuler un authentifiant Auth dans le texte d'un programme original P logiciel ou matériel (en fonction du choix un domaine abstrait paramétré par une clé secrète). (Voir Figure 11A) Un procédé Au d'authentification Le procédé Au d'authentification prend en paramètres, le programme logiciel ou matériel marqué PT et la sémantique abstraite secrète SAS. Il calcule l'authentification originale Auth. Ce module A est composé de deux sousmodules: le module S. décrit ci-dessus, qui à partir du programme logiciel tatoué PT et de la sémantique secrète extrait la signature sémantique secrète SSS(PT) et par conséquent celle SSS(m) de la marque m cachée dans PT; un module F de déchiffrement et d'extraction, qui est l'inverse du module C de chiffrement utilisé dans le module T de tatouage, prend en paramètre la signature sémantique secrète SSS(PT) pour extraire l'authentifiant original Auth de P. Le module de déchiffrement F peut également constituer un secret, tout comme le module C. (Voir Figure 12) U n Mod u le DAu d 'authentificati on Parmi les modes préférés de réalisation du procédé o d'authentification Au ci-dessus, I'invention divulgue également un dispositif d'authentification DAu (pouvant être réalisé par un produit/programme d'ordinateur utilisant le dispositif DS ci-dessus et un dispositif de déchiffrement DF) pour l'authentification d'un programme tatoué PT en calculant son authentifiant Auth. (Voir Figure 12A) Présentation des figures supplémentaires La figure 5 montre un schéma de principe du procédé A pour engendrer la sémantique abstraite secrète SAS à partir d'un domaine abstrait Di(K) dépendant d'une clé secrète K; 6 La figure 6 montre un schéma de principe du procédé S pour calculer la signature SSS selon la sémantique secrète SAS d'un programme logiciel ou matériel P; Les figures 5A et 6A montrent le schéma des dispositifs DA et DS co rrespo ndant aux procédés A et S dan s u ne de le u rs variantes de réalisation; 7 La figure 7 (respectivement 7A) montre le schéma de principe du procédé M (respectivement du dispositif DM dans une de ses variantes de réalisation) pour produire une marque connaissant une sémantique abstraite secrète SAS (résultant par exemple de l'application du principe du procédé de la figure 1) et une signature sémantique secrète SSS; 8 La figure 8 (respectivement 8A) montre le schéma de principe du procédé B (respectivement du dispositif DB dans une de ses variantes de réalisation) pour tatouer un programme logiciel ou matériel P en insérant une marque m dans une sélection d'éléments à tatouer dudit P; 9 La figure 9 (respectivement 9A) montre le schéma de principe du procédé PS (respectivement du dispositif DPS dans une de ses variantes de réalisation) qui, étant donné un programme logiciel ou matériel P. choisit un domaine abstrait D parmi une famille de domaines abstraits possibles et sélectionne des éléments de P à tatouer; o 10 La figure 10 (respectivement 10A) montre le schéma de principe du procédé T (respectivement du dispositif DT dans une de ses variantes de réalisation) pour insérer une marque m caractéristique d'un authentifiant Auth dans une sélection d'éléments d'un programme logiciel ou matériel P original en utilisant une sémantique abstraite secrète SAS; 11 La figure 11 (respectivement 11A) montre le schéma de principe du procédé T (respectivement du dispositif DT dans une de ses variantes de réalisation) pour choisir un domaine abstrait paramétré par une clé, une clé secrète particulière et un authentifiant pour tatouer un program me logiciel ou matériel P par transfo rmation en u n p rog ram me tatoué fonctionnellement équivalent PT; 12 La figure 12 (respectivement 12A) montre le schéma de principe du procédé Au (respectivement du dispositif DAu dans une de ses variantes de réalisation) pour authentifier un programme tatoué PT. ANNEXE 6 Exemple 3 Considérons un programme original P à tatouer très simple par le dispositif DG de la figure 11A, qui est le suivant: public class Fibonacci public Fibonacci() public static void main(String[] args) { int n=l nteger.parseint(args[0]); int a=O; int b=1; for (int i=1;i méthodes à tatouer, comme la méthode main. Un exemple très simple de tatouage de méthodes Javam consiste à utiliser une sémantique collectrice qui est l'ensemble des descendants des états d'entrée de la méthode (d'autres alternatives étant la sémantique des ascendants des états de sortie ou des combinaisons comme l'intersection de ces sémantiques collectrices). Dans cet exemple, la sémantique abstraite secrète SAS est I'abstraction de la sémantique collectrice d'une méthode qui ne retient que 2824402 les variables locales entières et fait complètement abstraction des autres variables, du graphe de flot de contrôle, des éléments extérieurs et du contexte de la méthode. De ce fait l'analyse statique est insensible aux transformations du programme (par exemple à des fins d'obfuscation ou de brouillage) modifiant le graphe de flot de contrôle et des transformations par équivalence des expressions arithmétiques. Par simplicité pour cet exemple de sémantique abstraite secrète SAS, seules les opérations arithmétiques de base +, - et * sont con s i dérées (y comp ris toutes les autres opé ration s arithmétiques permettant de réécrire des expressions arithmétiques lo comprenant ces opérations de base sous une forme arithmétiquement équivalente, comme le moins unaire, etc.). La sémantique concrète est choisie sur l'anneau (Z,+, *) des entiers mathématiques (et non comme des entiers modulo 232 comme en Java_, les équivalences arithmétiques mentionnées ci-dessus devant tenir compte de ce fait). Dans cet exemple, la sémantique abstraite secrète SAS utilise un domaine de hauteur finie pour les variables locales entières, ce qui la rend insensible aux stratégies d'itération chaotique utilisées et évite, toujours dans l'optique d'une plus grande simplicité de l'exemple, I'utilisation d'opérateurs d'élargissement et de rétrécissement. Dans cet exemple, la clé secrète K est le produit K1*K2* *Kn d'entiers naturels strictement positifs et premiers entre eux. Dans l'exemple considéré ci-dessous, n=2, K1=10000 et K2=5421. Le domaine abstrait D(K), utilisé pour calculer la sémantique abstraite secrète SAS par interprétation abstraite de la sémantique collectrice, est celui de la propagation des constantes modulo K. D'après le lemme chinois, Z/KZ = Z/K1*...*KnZ est isomorphe à l'anneau produit Z/K1Z x... x Z/KnZ Étant donné la signature sémantique secrète SSS du programme tatoué PT dans Z /KZ = Z/K1* *KnZ, on considère son image (s1,..., sn) dans Z/K1Z x... x Z/KnZ dont les composantes sont données par la projection canonique sur l'anneau Z/KiZ, i = 1,...,n. Dans l'exemple considéré, on suppose que le dispositif DC de la figure 6 bis calcule la signature sémantique secrète (2507, 3012) à parti r de l'authentifiant du p rog ram me. La sémantique statiq u e secrète est alors obtenue par n analyses statiques, pour toutes les variables entières locales à la méthode des domaines abstraits Z/Ki Z. i = l,...,n, correspondant à la propagation des constantes modulo Ki. Le dispositif DA de la figure 5A co n s iste donc en u n p rog ram me d'analyses statiq ues s uccessives pa r propagation des constantes modulo (K1,..., Kn). Dans cet exemple, le dispositif DM de la figure 7A utilise la sémantique abstraite secrète SAS et la signature sémantique secrète SSS définies cidessus pour produire une marque m dont le texte est le suivant: int ; int ; +227492; = * ; +155014; *1323; +153; * ; +9109; int ; int ; ±35539; = * ; = +11445; *658; +971; * ; +4623; Dans un cas simplifié o Ki n'est pas trop grand et pour une signature sémantique secrète s donnée dans Z/KiZ, le texte de la marque m créé par le dispositif DM de la figure 7A peut consister en une seule marque d'initialisation qui peut être une affectation: est toujours constante dans u ne an alyse stati qu e par propagation des co nstantes m od u lo Ki et égale à s. Cette valeur n'appara^t pas en clair dans la marque et est d'autant plus difficile à trouver que la clé secrète Ki est inconnue. Une instanciation plus sophistiquée du dispositif DM de la figure 7A permet de choisir cette marque d'initialisation comme étant un polynôme Q (en la variable ) de la forme: ak k +... + a1 + a o ak,..., a1 sont des valeurs aléatoires et la valeur a est donnée l 5 par a - s - akvk- ak 1v k-1 - - a1v mod Ki o la valeur initiale v est choisie quelconque de manière aléatoire. Dans ce cas, la marque d'initialisation est constituée par les affectations: k+. ..+a1 +a; de sorte que l'on a toujours: = s mod Ki L'utilisation d'une seule marque d'initialisation a l'inconvénient de laisser la valeur de constante et donc aisément repérable par une analyse statique propageant les constantes. Pour l'éviter, un dispositif DM plus sophistiqué ajoutera une marque d'induction permettant de donner une dynamique à la variable de marque de façon qu'elle prenne des valeurs stochastiques dans Z mais reste constante dans Z/KiZ On utilise pour cela un polynôme Q' qui possède la propriété de stabilité, c'est-à-dire: Q'(s)_ s mod Ki Le polynome Q' est engendré comme expliqué ci-dessus et la marque d'induction est constituée par l'instruction: k ++a'1 + a'; ou tout équivalent, par exemple en utilisant le principe de calcul de Horner. Le dispositif DB de la figure 8A peut placer cette marque d'induction dans une boucle ou dans un appel récursif de la méthode à tatouer dans P car son exécution ne modifie pas la valeur de dans l'anneau Z/KiZ choisi pour calculer la sémantique statique secrète s. Par contre la valeur observée dans le domaine d'interprétation des entiers Java sera totalement stochastique. Dans l'exemple du tatouage du programme P ci-dessus, la marque définie cidessus utilise deux variables locales et . La marque d'initialisation est le segment de code initial constitué par un polynôme Q calculant la valeur initiale de . La marque d'induction est constituée par un polynome Q' possébant la propriété de stabilité pour s dans l'anneau Z/KiZ considéré. On utilise des polynômes du second degré par commodité. Les valeurs des coefficients du polynôme du second degré assurant l'initialisation sont aléatoires. Ce polynome est donné comme suit dans Z/KiZ: Q(x) = (x - 1)(x - s) = x2 + coeff1.x + coeff2. Un nombre aléatoire de périodes du modulo Ki est ajouté ou retranché aux coefficients afin de ne pas dévoiler la clef s. La valeur initiale de est donc: = Q ( 1) = s dans Z/KiZ La marque initiale consiste à calculer ce polynôme Q en utilisant le principe de calcul de Horner. La marque d'induction est constituée par un polynôme Q' (également du second degré, là aussi par commodité) satisfaisant la propriété de stabilité: Q'(s) = s dans Z/KiZ Le polynôme Q' s'écrit: Q' (x) = ax2 + bx + c Les coefficients a et b sont tirés au sort, tandis que c est choisi de manière à assurer la propriété de stabilité pour la clef secrète comme expliqué ci-dessus. La marque d'induction est constituée par l'instruction d'affectation: = Q' ( ); o le polynôme est calculé par la méthode de Horner. Le programme tatoué PT correspondant au programme P incluant la marque m ci-dessus est le suivant: public class FibonacciTatoue { public FibonacciTatoue() {} public static void main(String[] args) int n=lnteger. parseint(args[0]); int a=O; int b=1; int d=1; int e=35538; intf=l; int g=227493; e=d*e; d=e+11445; g=f*g; f=g+155014; for (int i=1;i branche d'appel récursif de la méthode. Dans l'exemple considéré de dispositif DB de la figure 8A, une transformation supplémentaire du programme est ensuite nécessaire pour lier le tatouage au programme original (pour résister par exemple au détatouage par > automatique), comme par exemple): public class FibonacciTatoue { public FibonacciTatoue() {} public static void main(String[] args) { int n=l nteger.parseint(args[0]); int a=O; int b=1; int d=1; int e=35538; int f=1; int g=227493; e=d*e; d=e+11445; g=f*g; f=g+ 155014; for (int i=1;i rendrait le programme erroné donc inutilisable. Dans un exemple plus réaliste, le dispositif DB de la figure 8A doit s'assurer que la transformation du programme original n'introduit pas d'erreurs à l'exécution pouvant modifier la sémantique du programme original. On utilisera pour cela les techniques classiques de l'interprétation abstraite. Dans un exemple plus réaliste, le dispositif DB de la figure 8A utilisera des méthodes plus sophistiquées pour lier la marque m au programme original P dans le programme tatoué PT. Dans le cadre de l'exemple considéré ci-dessus, il faut pour cela pouvoir utiliser des propriétés invariantes secrètes de la variable de tatouage qui soient transposables en aritUmétique signée sur 32 bits. C'est possible très simplement lorsque, par exemple, la clef Ki est une puissance de 2. En effet, supposons que Ki =2k. Alors on a: x = s +a.2 k dans Z Nous avons, toujours dans Z. que, pour tout j inférieur ou égal à 1. K. xo/o2i =S%2j o x % y désigne l'opération qui renvoie le reste de la division euclidienne de x par y.On remarque que cette propriété reste trivialement vraie dans Z/232z qui est le domaine des entiers Java_. Les propriétés arithmétiques du tatouage peuvent être utilisées pour modifier des calcuis de la méthode. Par exemple, supposons que Ki = 216 et que s =18. Alors quelle 0 que soit la valeur de x, I'invariant x % 4=2 est toujours satisfait. De ce fait, une constante explicite 2 dans le programme original P. peut être remplacée par x % 4 dans le programme tatoué PT. Les autres constantes ou valeurs de variables du programme tatoué PT peuvent également être aisément calculées en fonction de cette valeur. Par exemple l dans P sera simplement remplacé par (x % 4)-1 dans PT. Ceci conclut la description du dispositif de tatouage DT sur l'exemple considéré par enchanement des dispositifs DC, DM et DB comme indiqué à la figure 1 OA et du dispositif DG par enchanement des dispositifs DPS, DA et DT comme indiqué à la figure 11A. Dans cet exemple, le dispositif DS de la figure 6A calcule la sémantique statique secrète s = (s1,...,sn) en faisant n analyses statiques successives du programme tatoué selon l'interprétation abstraite définie ci dessus consistant en une analyse en avant, pouvant ignorer le flot de contrôle ou non, avec propagation des constantes modulo les clés restées secrètes K1,..., Kn. À partir de cette sémantique statique secrète s = (s1,...,sn), ie dispositif DF calcule l'authentifiant original du programme P comme indiqué à la figure 8 bis. Si le domaine D(K) utilisé dans l'exemple ci-dessus est public (mais pas la clé K), alors la sémantique statique secrète s peut être découverte par la force brute, du moins pour de très petits programmes comportant peu de variables entières. Dans un exemple plus réaliste on utilisera donc, non pas des clés s1,..., sn codées sur 32 bits, mais une ou plusieurs clés s de 512 bits utilisant, par exemple, un codage arithmétique de velour dG sur 16 vats da 32 ou 8 da G4 ou udUsant 10uta sutre technique de coinage fnformatlque da grands onward. Cacl conclut la description du disposltlf DAu de la figure 12A pour Lexemple conslddrd. ANNEXE 7 Exemple 4 Un quatrième exemple est le programme de tri suivant: private static void bubbleSort (double [] data, int size) { int indexl, index2; double temp; boolean exchanged; o for (index1 = size; index1 ≥ 2; index1--) { exchanged = false; for (index2 = 1; index2 ≤ index1 - 1; index2++) { if (data [index2] > data [index2 + 1]) { temp = data [index2]; data [index2] = data [index2 + 1]; data [index2 + 1] = temp; exchanged = true; if (!exchanged) break; A nouveau n=2, K1=10000 et K2=5421. La méthode bubbleSort est tatouée deux fois, une première fois par la même signature sémantique secrète (2507, 3012) que ci-dessus et la deuxième fois par la signature secrète (9876, 2345). Le deuxième tatouage aurait aussi bien pu être réalisé pour des valeurs différentes de K1 et K2. Après compilation, tatouage, obfuscation et décompilation, on obtient la classe bubbleSort comme suit: private static void bubbleSort (double [] rO, int iO) { int i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11; double dO; i1 = 1; i2 = i1; i3 = i2; i4 = i3; i5 = i2 - 35539; i6 = i1 - 62508; i7 = i3 - 129877; i6 = i1 * i6; i5 = i2 * i5; i1 = i6 - 144986; 0 i8 = i4 + 84390; i7 = i3 * i7; i2 = i5 - 75291; i8 = i4 * i8; i3 = i7 + 169752; i4 = i8 + 10111; for (ig = iO;i9 > = 2;i9--) { i1 0 = 0; for (i11 = 1;i11 rO [i11 + 1]) { i6 = i1 * 620; i6 = i6 + 1151; d 0 = rO [i11]; i6 = i6 * i1; i1 = i6 + 6570; rO [i11] = rO [i11 + 1]; i8 = i4 * 936; i5 = i2 * 620; i5 = i5 + 1151; i5 = i5 * i2; i8 = i8 + 1057; i2 = i5 + 2961; rO [i11 + 1] = d O; i7 = i3 * 1231; i7 = i7 + 1699; if ((i2 - 2961) = = i5) i10= 1; i8 = i8 * i4; i7= i7 * i3; i3 = i7 + 2696; i4 = i8 + 1389; if (i10 == 0) break; REVENDICATIONS 1. ProduiVprogramme d'ordinateur pour traiter les instructions d'un logiciel (10), caractérisé en ce qu'il comprend un module (310) de choix en fonction de critères prédéfinis des instructions (1 10, 130, 150) dudit logiciel en entrée du program me de transcodage et u n moduie (320) de choix parmi plusieurs d'une méthode secrète de transcodage (220) appliquée aux dites instructions. 2. ProduiVprogramme d'ordinateur selon la revendication 1, caractérisé en ce que la méthode secrète de transcodage (220) a pour sortie une signature sémantique du logiciel (10). 0 3. ProduiVprogramme d'ordinateur selon l'une des revendications précédentes, caractérisé en ce que la signature sémantique du logiciel (10) est constituée par tout ou partie de l'ensemble des propriétés du logiciel (10) transcodé par la méthode secrète (220). 4. ProduiVprogramme d'ordinateur selon l'une des revendications précédentes, caractérisé en ce que ledit logiciel (10) est écrit en langage de programmation. S. ProduiVprogramme d'ordinateur selon l'une des revendications précédentes, caractérisé en ce que le logiciel (10) est écrit en langage du type Java, Java Script ou Java bytecode. 6. ProduiVprogramme d'ordinateur selon l'une des revendications précédentes, caractérisé en ce que le logiciel (10) est écrit en langage du type Very High Definition Language, Verilog ou Assembleur. 7. ProduiVprogramme d'ordinateur selon l'une des revendications précédentes, caractérisé en ce que les instructions auxquelles un programme de transcodage sera appliqué sont choisies parmi celles comportant des opérations algébriques ou des allocations sur des variables à valeurs entières. 8. ProduiVprogramme d'ordinateur selon l'une des revendications précédentes, caractérisé en ce que les instructions auxquelles un programme de transcodage sera appliqué sont choisies parmi celles comportant des opérations algébriques ou des allocations sur des références à valeurs entières. 9. Produit/programme d'ordinateur selon la revendication 7 ou la revendication 8, caractérisé en ce que la méthode secrète de transcodage est détermince par le choix de nombres entiers secrets comme opérateurs de congruence appliqués aux opérations algébriques ou aux allocations sur des variables ou des références à valeurs entières. 10. Produit/programme d'ordinateur selon la revendication 8, caractérisé en ce que la méthode secrète de transcodage est déterminée par le choix secret d'une ou plusieurs variables à valeurs entières en association aux références. lo 11. Produit/programme d'ordinateur selon l'une des revendications précédentes, caractérisé en ce qu' il comprend en outre un module (330) pour insérer les instructions transcodées inverses (1 10",130",150") dans le logiciel (10). 12. Produit/programme d'ordinateur selon la revendication 11, caractérisé en ce que les instructions transcodées inverses sont insérées à des positions choisies en fonction de critères prédéfinis dans le logiciel (10) sous forme d'instructions de calcul desdites variables, lesdites instructions comportant l'application auxdites variables d'opérations qui laissent invariante la signature sémantique du logiciel (10). 13. Produit/programme d'ordinateur selon la revendication 12, caractérisé en ce que les instructions transcodées inverses sont insérées à des positions choisies en fonction de critères prédéfinis dans le logiciel (10) sous forme d'instructions d'initialisation de variables et d'instructions de calcul des dites variables, les dites instructions comportant l'application auxdites variables de fonctions par des polynômiales de degré 1 ou de degré 2 créés à partir d'un coefficient aléatoire et des valeurs de nombres entiers secrets. 14. Produit/programme d'ordinateur selon l'une des revendications 11 à 13, caractérisé en ce que le module (330) comprend un sous-module de chiffrement (330 A) pour calculer une signature sémantique secrète (SSS) en fonction d'un authentifiant (Auth), un sous-module (330 B) pour déterminer une marque (m) à partir de la méthode secrète de transcodage (220) et de ladite signature sémantique secrète (SSS), et un sous-module de camouflage (330 C) pour produire le programme tatoué (40) à partir du texte du programme (10), de la marque (m) et des instructions choisiespourletatouage(110, 130, 150). 15. Procédé pour traiter les instructions d'un logiciel t10), caractérisé en ce qu'il comprend une étape pour choisir en fonction de critères prédefinis les instructions (1 10, 130, 150) dudit programme (10) auxquelles un programme de transcodage est appliqué et une étape pour choisir parmi plusieurs la méthode secrète de transcodage (220) à appliquer aux dites instructions. 16. Procédé selon la revendication 14, caractérisé en ce que lO la méthode secrète de transcodage produit une signature sémantique du logiciel (10). 17. Procédé selon la revendication 14, caractérisé en ce que la signature sémantique du logiciel (10) est constituée par tout ou partie de l'ensemble des propriétés du logiciel (10) transcodé par la méthode secrète 1 5 (220). 18. Procédé selon l'une des revendications 14 ou suivantes, caractérisé en ce que ledit logiciel (10) est écrit en langage de programmation. 19. Procédé selon l'une des revendications 14 ou suivantes, caractérisé en ce que ledit logiciel (10) est écrit en langage du type Java, Java Script ou Java bytecode. 20. Procédé selon l'une des revendications 14 ou suivantes, caractérisé en ce que le logiciel (10) est écrit en langage du type Very High Definition Language, Verilog ou Assembleur. 21. Procédé selon l'une des revendications 14 ou suivantes, caractérisé en ce que les instructions auxquelles un programme de transcodage sera appliqué sont choisies parmi celles comportant des opérations algébriques ou des allocations sur des variables à valeurs entières. 22. Procédé selon l'une des revendications 14 ou suivantes, caractérisé en ce que les instructions auxquelles un programme de transcodage sera appliqué sont choisies parmi celles comportant des opérations algébriques ou des allocations sur des références à valeurs entières. 23. Procédé selon l'une des revendications 20 ou 21, caractérisé en ce que la méthode secrète de transcodage est déterminée par le choix de nombres entiers secrets comme opérateurs de congruence appliqués aux opérations algébriques ou aux allocations sur des variables ou des références à valeurs entières. 24. Procédé selon la revendication 21, caractérisé en ce que la méthode secrète de transcodage est déterminée par le choix secret d'une ou plusieurs variables à valeurs entières en association aux références. 25. Procédé selon l'une des revendications 14 ou suivantes, lo caractérisé en ce qu' il comprend en outre une étape pour insérer les instructions transcodées inverses (110",130",150") dans le logiciel (10). 26. Procédé selon la revendication 24, caractérisé en ce que les instructions transcodées inverses sont insérées à des positions choisies en fonction de critères prédéfinis dans le logiciel (10) sous forme d'instructions de calcul desdites variables, lesdites instructions comportant l'application auxdites variables d'opérations qui laissent invariante la signature sémantique du iogiciel (10). 27. Procédé selon la revendication 25, caractérisé en ce que les instructions transcodées inverses sont insérées à des positions choisies en fonction de critères prédéfinis dans le logiciel (10) sous forme d' i nstructions d' in itial isation de variables et d' instructions de calcu l des dites variables, les dites instructions comportant l'application auxdites variables de fonctions polynômiales de degré 1 ou de degré 2 créées à partir d'un coefficient aléatoire et de valeurs de nombres entiers secrets. 28. ProduiVprogramme d'ordinateur pour traiter les instructions d'un logiciel (40), caractérisé en ce qu'il comprend un module (50) permettant à un utilisateur connaissant le/les paramètres de la méthode secrète (220) selon l'une des revendications précédentes de reconna^tre la signature du logiciel (10). 29. ProduiVprogramme d'ordinateur selon la revendication précédente, caractérisé en ce que le module (50) comporte un programme d'analyse statique sémantique pour reconnatre la signature. 30. ProduiVprogramme d'ordinateur selon la revendication 27 ou la revendication 28, caractérisé en ce que le module (50) comporte un programme de calcul du point fixe des valeurs de tout ou partie des variables. 31. Procédé pour traiter les instructions d'un programme d'ordinateur en code source (40), caractérisé en ce qu'il permet à un utilisateur connaissant le/les paramètres de la méthode secrète (220) selon l'une des revendications précédentes de reconnatre la signature du logiciel (10). 32. Procédé selon la revendication 30, caractérisé en ce qu'il comporte une étape d'analyse statique sémantique pour reconnatre la o signature. 33. Procédé selon l'une des revendications 30 ou 31, caractérisé en ce qu'il comporte une étape de calcul du point fixe des valeurs