FR 2824401 A1 20021108 FR 0106024 A 20010504 1 2824401 DISPOSITIF ET PROCEDE POUR LA SIGNATURE, LE MARQUAGE ET L'AUTH ENTI FICATION DE PROGRAM MES D'ORDINATEU R. La présente invention appartient au domaine des dispositifs et procédés pour prévenir et/ou 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 programme l'ord re d'exécution de blocs d udit p rog ram me. 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ément repérables de manière automatique 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 en 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 2824401 A ces fins, I'invention divulgue un produit/programme 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 égal em ent u n prod uit/prog ramme d'ordinateu r d u type ci-dessus dont la méthode secrète de transcodage produit une signature sémantique du o logiciel. Selon une variante de l'invention, le produit/programme d'ordinateur du t, vpe ci-dessus comprend un module pour insérer les instructions transcodées dans le logiciel. L'invention divulgue également un procédé pour traiter ies instructions d'un logiciel en code source comprenant une étape pour choisir en fonction de critères prédéfinis les instructions dudit programme 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'invention sera mieux comprise et ses différentes caractéristiques et avantages ressortiront de la description qui suit et d'exemples de 26 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 2824401 - 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 produitlprogramme d'ordinateur et un procédé pour reconna^'tre 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 difficlies la copie et l'utilisation frauduleuse des 1 0 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 lobjet 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 conna^'t pas la cl é secrète qu i a en gendré le motif sous-jacent. U n 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 2824401 À 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 données caractéristique (résumé), obtenu à 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' " obfuscation >> 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. 2 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 28244o1 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 dépendent de 1'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é dun logiciel dépend de la politique de sécurité mise en vigueur par le propriétaire du logiciel. Il s'agit 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.); 6 2824401 - I'intégrité du logiciel: éviter ia 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 Partie de Confiance à Valeur Ajoutée). Les méthodes de tatou age logiciel s' inspi rant 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 d'information ne modifie pas le sens: nos capteurs sensoriels sont imparfaits. Ce n'est pas le cas du code inforrnatique. Il ne supporte que les compress ions sans perte d' information. Une modification, au ssi i nfime 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 instruction s de saut et de retou r sont par exemple repérables de manière automatique. En ce qui concerne l'ajout de structures de graphes, ces structures sont également facilement identifiables dans les codes non complètement compilés. Elles alourdissent 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 l'automate qui 7 28244o1 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. Il s'agit de dispositifs de protection de logiciels (leur utilisation dépend généralement d'un dispositif matériel: carte à puce, "dongle") ou de dissuasion dutilisation frauduleuse de logIciels (é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 no uve l l es tech nologi es et l' acc roissem ent 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 Dvnamic Embeddings (1998). 8 28244o1 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éalisation préféré, le dispositif proposé s'applique de manière spécifiique 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, VHDL, 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 procédés de tatouages d' images (modifications impe rceptibles de la présentation sur écran ou papier). Le dispositif est également applicable aux parties qui comportent des opérations (programmes >, 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 2824401 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_uds 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 Januar, v 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 rep rése ntatif d u type de prog ram mes à p rotége r. Bien que d'autres solutions puissent être envisagées, il est actuellement prété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 2824401 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 et/ou sensibles du programme. En général elles concernent la partie algorithmique 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 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 interp rétation des instructions du program me, et affectera aux variables associées d'autres valeurs que celles qu'auraient prises les variables 1 1 2824401 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'algorithme 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 auprè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 2 2824401 doit étre adaptée à la typologie des instructions et des méthodes 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 programme initial. Les instructions ajoutées doivent 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, 2s 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 prog ramme à 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 13 2824401 repris par une instruction du programme initial. (allocation dynamique de valeur) 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éseau. 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 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 3 modulaire. Le module (320) a, dans ce cas, pour fonction principale de conserver la table des secrets attribués à des classes d'utilisateurs 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 t,vpe 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.2kdans 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 modifié est dégradé de manière irréversible tout 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 2824401 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. Elle 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érnent contenue sur une carte à microprocesseur qui sera connectée à 1'ordinateur comportant 1'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. Deux exemples donnés en annexes 2 et 3 permettent d'illustrer 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 connues de l'homme du métier. 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 16 2824401 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 lo 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. 7 2824401 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 lo 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 initialisation entre le début de la méthode et notre position actuelle. 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) = cj + 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(v')=v'+1 *nj (1 entier aléatoire petit) 1.2.9 insérer l'instruction v'=Q(vj) 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 Un+2 = Un+ + Un relations u0 = 0 l UI=1 18 282440 Programme initial public class Fibonacci public Fibonacci() public static void main(String[] args) int n=lnteger.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 3012. 9 2824401 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 (enhéer) + 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 co nsiste en l' insertion de deux 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 o prog ram me sont inconnues. Cela nous permet d'éviter 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. 2824401 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 /t à dire modulo 5421, n->50) for (int i=1;i 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=17; int a=O; int j=(-34*n*n-500*n+833) % 10000; o int b=1; int k=(2*n-n*n-9) % 10000; for (int i=1;i 22 2824401 * Analyse Sémantique Statique: approximation du point fixe | Débu Tin- -17i | État(l) | Iia---ôl | État(ll) | lo; - -34xn -500xn +833[10000]i Etat(111) lir-b--. | Etat(l9) | - EtatCV: | 1[== 1! A| ÉtatCVl) | - js (i 23 2824401 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 B,, = 0 (V) k 1(,= 0 (V1) i 1",= 0 (Vll) C,,==00 (IX) a x = 0 (X) j Jy = 0 (Xl) b By'= 0 (Xll) k Kx'' = 0 (X111) i 1x,,= 0 (XIV) b By = 0 (XV) b B,, = 0 Écriture de l'interdépendance des états Nl ={17} All ={O} Jn ={j=-34xn2 -500xn+833;ne N.} Bv = {1} Kv = {k = 2xn nxn -9;ne N} Iv = {1}U (Iv" +1) lvo =lv n];SupT Cvlll ={c=a+b;as (A/ UA,X) Abé (B'v UBX,)} Ax = B'v UBx Jx ={Jx5-28; j (Jx UJ/n)} Bx, = cVm Kx = {kxk + 20 f k (Kv U. Kxn)} l I n [ f +[ BX V ={b =b+k+ j;be (Bv UBx,)Ak (Kv UKxn)A ié (Jln U Jx)} BXV = lb = b-1 -kx j + (1-k)x(1- j},bé BXRV A k (Kv U. KX,)A j (J U JX)} 24 2824401 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 0 1 2 3 4 d'itératio n 0 {17} {17} {17} {17} ^', 0 { } { } 10} {o} J. 0 0 {2507} {2507} {2507} ," 0 {1} {1} {1} {1} Kv 0 0 {9736} {9736} {9736} 1,, 0 {1} {1} (1;2) (1;2) 1,,, 0 0 {1} {1} (1;2) C,,l, 0 0 {1} (1;2) (1;2) Y 0 0 {1} {1} {1} Jx 0 0 0 {2507} {2507} Bx, 0 0 0 {1} (1;2) Kx" 0 0 0 {9897} (82;9930) Ix' 0 0 0 0 0 By, 0 0 0 {2244} (2244;2405) BYV 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} {O} {O} 35. J,l, {2507} {2507} {2507} {2507} {2507} B,v {1} {1} {1} {1} {1} Kv {9736} {9736} {9736} {9736} {9736} 1", (1;3) (1;3) (1;4) (1;4) (1;17) 1 (1;2) (1;3) (1;3) tl;4) (1;16) vl (1;3) (1;4) (1;5) (1;7) (0;9999) (1;2) () (1;3) (1;4) (0;9999) x {2507} {2507} {2507} {2507} {2507} Byl (1;2) (1;3) (1,4) (1;5) (1;9999) K (2;9997) (2,9997) (2;9997) (2;9997) (2;9997) x,, 0 0 {17} B. (0;9999) (0;9999) (0;9999) (0,9999) (0;9999) YV (O;9999) (0;9999) (0;9999) (0;9999) (0;9999) On retrouve notre première marque: la variable J garde toujours la valeur 2507. 2824401 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=1; int k=(2*n-n*n-9) % 5421; for (int i=l;i 26 2824401 Début 1,n - 50! | État (1) | l!a = 10.'- | État (Il) | 1.-.-.-.--.-.----.-.---, I;J - -34xn2 -SOOxn+833L5421]i État (111) ,rb-. ,. 1 lik = 2xn-n2 -9[5421] ' - État CV) | r[1==li I 30. si(i at (IX),._._. État (Xl) ll k=k2+201[5421]| 1 À, Etat (Xll) | -----1 jZ = +15421]j 27 2824401 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 Bv = 0 (\/) k Kv = 0 (Vl) i, 1"= 0 (Vll) i 1,"= 0 (V111) c CV[II = 0 (IX) a A": = 0 (X) j Jy= 0 (Xl) b B,, = 0 (Xll) k Kxt'= 0 (X111) i 1x,,, = 0 (XIV) b B,, = 0 (XV) b B,, = 0 Écriture de l'interdépendance des états N ={50} Arr ={01 J, = {j=-34xn: -SOOxn+833;ne N} Bv =1} Kv ={k=2xn-nxn-9;ne N.} IVr ={1}U(IVI! +1) 1 [ N, Cv' ={c=a+b; ac (A" UA,X)Ab (B.V UBX,)} A x = Bv U. Bx' Jx = fJ x 5 - 28; i (Jx U J")} BX! = CVZr Kn ={kxk+201;k (Kv UKx)} lxm =lv n[inf n;+[ BXJV = {b = b + k + j;be (Bv U BX!)A k (Kv U Kxn)A j (J U Jx)} BXV =b=b-l-kx j+(l-k)x(l- jj, be Bxv Ak (Kv UKxn)A j (Jm U Jx)} 28 2824401 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 1501 {501 {50} {5o} A, 0 {0} {0} {0} {0} J 111 0 0 {4674} {4674} 14674} Bv 0 {1} {1} {1} {1} Kv 0 0 {3012} {3012} {3012} 0 {1} {1} (1;2) (1;2) lvl 0 0 {1} {1} (1;2) Cvll 0 0 {1} (1;2) (1;2) A {1} {1} {1} Y 0 0 0 {1658} (0;5420) By' 0 0 0 {1} (1;2) Kyll 0 0 0 {30121 {30121 ly,ll 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} {O} {O} {o} {O} {O} {46741 {46741 {46i4} {4674} {4674} ",. , B,v {1} {1} {1} {1} {1} Kv {3012} {3012} {3012} {3012} {3012} 1 [l,3) [i;3) (1;4) (1;4) (1;50) v, (1,2i (1;3) (1;3) (1;4) (1;49) cv,l (1;3) (1;4) (1;5) (1;7) (o;5421) {1,2) L1;2) (];3) (1;4) (0;5421) ,Y (0,5420) (0,5420) (0;5420) (0;5420) (0;5420) Byl (1;2) (1;3) (1;4) (1;5) (0;5420) Kyl, {3012} {3012} {3012} {3012} {3012} 1y'1, 0 0 0 0 {50) B,,v (O;5420) (0;5420) (0;5420) (0;5420) (0, 5420) Bv (0;5420) (0;5420) (0;5420) (0;5420) (0;5420) Nous retrouvons notre deuxième m"rque: 3012. 29 2824401 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+l]) v=table2[i]; table2[i]=table2[i+l]; table2[i+l]=v; flag=false; } } return(table2); }} 2824401 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 2824401 Signature de Ia m Alhode La signature da is mAthode consists en l'analyse s11que sAmanque de la methods 8118 dd1010n da ppridiAs Analyze du progre m m e les ppMdiAs so ratrouven1 par Analyso Stlqua, Ed la methods appmmaDon du point fog par Versions. 32 2824401 Le graphe d'exécution du programme conjugué est le suivant: | Début | r |. tabl.é -_5;2.,4,1 3]. | | fag false i | État(ll) | I r j | État (Ill) | 1. jsi(flag=- false) j irsinon - - - -,- - -, | État (V) |r l,-oi[Fin l r - ,sinon État (Vl).. _. _. J | |si( table[i + 1]) I,sinon, .'jW =Wxli-(i+ll. , _._..J État (IX) _._. jrW'- nn(i+;'j i li flag - fase !---1 33 282440 Écriture de l'interdépendance des états TABLEI = {|5;2;4;1;3i FLAG,' = {false} fIm ={ } FWIV ={ } IVIII = {O} lw',v = {O} FLAGV = FLAGn {false} l5 IV7 ={ }U(lVm 331) va = Iv7 n}; longuer(tablen X iTABLEVrn = {table (TABLEIl U TABLEV,) tel que 3i Ivn tel que table(i) table(i + 1)} | IVIII = {i E Iv" tel que 3table (TABLEn U TABLEv,n) tel que table(i) table(i + l)} Wrx = J f () f x O - > {xx|i-(t + 1; i Ivn} W'x = {min(i + 1; i), i Iv'} FLAGX, = {false} Itérations 2 FLAGv 0 {false} {false} Iv' 0 { } { ;1} lv' 0 {O} {O;1} TABLEv'l 0 {1} 15;2;4;1;3)} W'x 0 {O} {O} FLAGXl 0 {false} {false} Itérations 5- POINT FIXE F LAGV {fa Ise} {fa Ise} {fa Ise} Iv, {0;1;2} {0;1;2;3} {0;1;2;3;4} lv, {O;l;2} {o;1;2;3} {O;1;2; 3} TABLEV,l, {5;2;4;1;3)} {(5;2;4;1;3)} {(5;2;4;1;3)} 11' {O;2} {O;2} {O;2} Wlx {1} {1} {1} wx {O;2} {0;2} {0;2} FLAGx, {false} {false} {false} 34 2824401 Signature: On note la signature de notre méthode de tri belles: En considérant la table de transcodage secrète, on note que: - - 2824401 REVENDICATIONS 1. Produit/programme 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 (110, 130, 150) dudit logiciel en entrée du programme de transcodage et un module (320) de choix parmi plusieurs d'une méthode secrète de transcodage (220) appliquée aux dites instructions. 2. Produit/programme 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). lo 3. Produit/programme 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. Produit/programme d'ordinateur selon l'une des revendications précédentes, caractérisé en ce que ledit logiciel (10) est écrit en langage de programmation. 5. Produit/programme 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. Produit/programme 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. Produit/programme 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. Produit/programme 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 36 2824401 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. 10. Produitlprogramme 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. 11. ProduiVprogramme d'ordinateur selon l'une des revendications précédentes, caractérisé en ce qu' il comprend en outre un lo module (330) pour insérer les instructions transcodées inverses (110",130",150") dans le logiciel (10). 12. ProduiVprogramme 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 polynomiales de degré 1 ou de degré 2 créés à partir d'un coefficient aléatoire et des valeurs de nombres entiers secrets. 14. Procédé pour traiter les instructions d'un logiciel (10), caractérisé en ce qu'il comprend une étape pour choisir en fonction de critères prédefinis les instructions (110, 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. 15. Procédé selon la revendication 14, caractérisé en ce que la méthode secrète de transcodage produit une signature sémantique du logiciel (10). 37 2824401 16. 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 (220). 17. Procédé selon l'une des revendications 14 ou suivantes, caractérisé en ce que ledit logiciel (10) est écrit en langage de programmation. 18. 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, lo Java Script ou Java bytecode. 19. Procédé selon l'une des revendications 14 ou suivantes, caractérisé en ce que le logiciel (10) est écrit en langage du t,vpe Very High Definition Language, Verilog ou Assembleur. 20. 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. 21. Procédé selon l'une des revendications 14 ou suivantes, caractérisé en ce que les instructions auxquelles un p rog ram me 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. 22. Procédé selon l'une des revendications 20 ou 21, caractérisé 2s 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. 23. 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. 24. Procédé selon l'une des revendications 14 ou suivantes, caractérisé en ce qu' il comprend en outre une étape pour insérer les instructions transcodées inverses (1 10",130",150") dans le logiciel (10). 38 2824401 25. 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 logiciel (10). 26. 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'instructions lo d'initialisation de variables et d'instructions de calcul des dites variables, les dites instructions comportant l'application auxdites variables de fonctions polynômiales de degré 1 ou de deg ré 2 créées à parti r d' u n coefficient aléatoire et de vaieurs de nombres entiers secrets. 27. Produit/programme 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). 28. Produit/programme 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 reconna^'tre la signature. 29. Produit/programme 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. 30. 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 reconna^'tre la signature du logiciel (10). 31. Procédé selon la revendication 30, caractérisé en ce qu'il comporte une étape d'analyse statique sémantique pour reconna^'tre la signature. 39 28244o1 32. Procédé Solon l'une des revendications 30 ou 31, caractérisé en ce qu'il cornporte une étape de calcul du point fine des valeurs de tout ou