Brevet FR2815493A1 — publié le 20020419

Procédé pour mettre en oeuvre une technique renforçant la sécurité 0 des signatures à clé publique à base de polynômes multivariables 1. Introduction Les signatures électroniques prennent une importance croissante dans le monde moderne. Elles sont utiles au commerce électronique sur internet, aux cartes bancaires, et plus généralement à chaque fois que l'on souhaite s'assurer qu'une personne a bien accepté les termes d'un message, ou a généré elle-même ce message. On utilise pour cela de plus en plus une technique cryptographique dite de signature à clé publique : c'est-à-dire une technique qui permette de vérifier de telles signatures sans avoir le moindre secret, alors qu'il faut au contraire un secret pour pouvoir signer de nouveaux messages. Actuellement l'algorithme de signature à clé publique le plus utilisé est le RSA (cf [RSA]). Mais générer une signature RSA, dans une petite carte à puce par exemple, utilise beaucoup de RAM (plus de 200 octets en général) et nécessite de faire beaucoup de calculs. La communauté cryptographique a donc cherché depuis quelques années si l'on pouvait trouver des algorithmes plus rapides. Plusieurs familles d'algorithmes plus rapides ont en effet été proposé ces dernières années. L'une de ces familles est basée sur des Polynômes Multivariables : la signature x d'un message M est alors constituée de n éléments xl,... Xn d'un petit corps fini K, n étant ici un entier naturel compris entre 8 et 200, et par petit corps fini on entend que le nombre d'éléments de K est compris entre 2 et 2 puissance 128. Dans certains de ces algorithmes la vérification de la validité entre un message M et sa signature x = (xi,... Xn) se fait ainsi : on calcule tout d'abord y = Hash (M), où Hash est une fonction publique, puis on vérifie que les m équations suivantes sont toutes satisfaites : Yi=fi (XI,..., Xn), 1 im, (1) où les fi sont des fonctions quadratiques publiques à coefficients dans K. Ces équations (ou, ce qui revient au mêmes ces fonction fi) constituent ce que l'on nomme la clé publique de cet algorithme de signature. Nous verrons ci-dessous des exemples concrets de tels algorithmes. Ces algorithmes sont en général très performants mais justifier leur sécurité est souvent un problème délicat. Il existe cependant plusieurs idées pour renforcer la sécurité d'un tel schéma. L'une d'elles consiste à ne pas publier toutes les équations de la forme (1) pour lesquelles (éventuellement grâce à un secret) on sait en général (c'est-à-dire avec une probabilité non négligeable) trouver un x à partir des valeurs yi, 1 (nommée en général perturbation - ) a été décrite dans [Cou Gou Pat] ou [Gou Kip Pat] par exemple. Mais si une telle idée est utilisée il faut alors faire très attention à la façon dont les signatures seront générées, c'est l'objet de la présente invention. 2. La génération de nombres aléatoires ou pseudo-aléatoires Nous allons avoir besoin de générer des nombres qui se présentent comme des nombres aléatoires c'est-à-dire des nombres qu'un intervenant extérieur qui ne connaît pas la façon dont ils ont été généré ne sera pas capable de distinguer de nombres réellement aléatoires. Pour cela, on peut utiliser ce que l'on nomme un générateur physique de nombres aléatoires, c'est-à-dire un moyen physique pour générer ces nombres, par exemple en tirant une pièce plusieurs fois à pile ou face, en mesurant les émissions de radiations d'un barreau irradié, ou en utilisant des dispositifs physiques comme une roulette de casino ou des dispositifs classiques à base de lampes. Mais, le plus souvent, on utilise ce que l'on nomme un générateur de nombres pseudo aléatoires c'est-à-dire un programme informatique qui génère des nombres à partir d'une petite valeur K' (que l'on nomme la clé , ou la graine du générateur). La propriété que l'on souhaite parfois obtenir est la suivante : les personnes qui ne connaissent pas la clé K'ne doivent pas être capables de distinguer les valeurs générées de valeurs réellement aléatoires, et ceci même si elles connaissent l'algorithme utilisé pour générer ces valeurs à partir de K'. 3. L'algorithme C*avec une seule branche Une propriété mathématique (Cet algorithme est aussi décrit dans [Ima Mat 1], [Ima Mat 2], ou [Pat 3]). Soit K un corps fini de caractéristique 2, et notons q le nombre d'éléments de K. Soit L une extension de degré n de K. (Soit comme K = Fq, L = Fqn). Alors la fonction f de L dans L définie par b = f (a) = al + q est une bijection si et seulement si 1 + qo est premier avec q"-l. Lorsqu'elle est bijective cette fonction monôme f admet également pour inverse une fonction monôme qui est a = fl (b) = bh, où h est l'inverse de 1 + qe modulo qn-l. Si B est une base de L (comme espace vectoriel sur K), alors l'expression de f dans la base B est de la forme : f (al,..., an) = (pi (al,... an),..., pn (al,., an)) où pi,... pn sont n polynômes de degré 2 en n variables. La raison pour cela est que les 9 fonctions x x et x xq sont toutes les deux des fonctions linéaires (ayant des écritures sous la forme de polynômes de degré 1 dans la base B), et ainsi la fonction 9 f (a) = a. aq est une fonction dont les composantes dans la base B sont décrites par des polynômes en n variables de degré 2. Les polynômes pl,... pn sont calculés en choisissant une représentation de L. Une telle représentation est typiquement donnée par le choix d'un polynôme irréductible i (X) de degré n sur K, de telle sorte que l'on puisse identifier L avec K [X]/i (X). Description de l'Algorithme C* avec une seule branche Notons x = (xl,..., Xn) le message à chiffrer (ou la signature d'un message) et y = (yl,..., Yn) le message chiffré (ou le hash d'un message à signer). Chaque variable xi et yj appartient à K, où K est un petit corps fini de caractéristique 2. (Typiquement mais pas nécessairement K = F2 ou F256). Il existe deux façons de calculer y à partir de x : l'une avec la clé secrète, et l'autre uniquement à partir de la clé publique. Décrivons tout d'abord comment y peut être calculé à partir de x avec la clé secrète. Calcul de y àpartir de x avec la clé secrète Etape 1 : On calcule a = s (x), où s est une transformation affine, bijective, et secrète. Par affine on veut dire que chaque composante al,..., an de a peut être exprimée sous la forme d'un polynôme (secret) de degré 1 en les variables xl,..., Xn. 9 Etape 2 : On calcule b = pa) = al + q où q est comme d'habitude le cardinal de K, et où 0 est un entier que l'on peut prendre sans nuire à la généralité entre 1 et n/2. (Comme il y a très peu de choix possible pour 0 on peut considérer que 0 est secret ou que 0 est public). La transformation b = al se fait en considérant a et b comme des éléments du corps Fqn. On choisit 0 pour que cette transformation soit bijective, c'est-à-dire tel que 1 + qo soit premier avec q -l. Notons que cette étape 2 est une transformation quadratique de Kn vers Kn. (Voir la propriété mathématique décrite ci-dessus). Etape 3 : On calcule y = t (b), où t est une transformation affine, bijective, et secrète. Calcul de y à partir de x avec la clé publique On a donc y = t (f (s (x) )). Or la composition g = t o f o s est une fonction de degré 2 de Kn vers Kn (car f est de degré 2 et t et s sont de degré 1). Cette fonction g est rendue publique : c'est la clé publique. (Par contre s et t sont maintenues secrètes : c'est la clé secrète). À partir de la clé publique g on peut calculer immédiatement y à partir de x. On a donc bien un schéma à clé publique. Calcul de x à partir de y avec la clé secrète Avec la clé secrète, il est facile d'inverser chacune des fonctions t, f, puis s successivement. Par contre il semble impossible de calculer a à partir de y sans la connaissance de la clé secrète. Mais en fait, cet algorithme a été cassé (voir l'article [Pat 1] qui décrit comment casser cet algorithme). Cependant, nous allons voir des variantes de cete algorithme qui, elles, ne sont pas cassées. 4. Description des Algorithmes C*-et C*-- (Ces algorithmes ont été décrits dans [Cou Gou Pat]). C*- C*-est simplement un algorithme C* avec une seule branche dont quelques unes des équations de la clé publique de C* ont été maintenues secrètes. C*-En fait, dans l'article [Cou Gou Pat], il est montré que pour assurer la sécurité d'un tel algorithme il faut que le nombre r d'équations ainsi maintenues secrètes soit tel que qr 264. Lorsque c'est le cas, je nomme C*-un tel algorithme. (Nous écrivons deux fois le symbole - pour insister sur le fait qu'il ne suffit pas d'enlever une ou deux équations, il faut vraiment que r soit suffisamment grand pour que qr > 264). Actuellement cet algorithme C*--n'est pas cassé. Il est donc peut-être solide. Cependant, pour la sécurité, il est très important de bien mettre en oeuvre la façon dont cet algorithme sera utilisé. Voici comment procéder, selon la présente invention : Génération d'une signature C*--selon la présente invention Ici n désigne toujours le nombre de variables xi, r le nombre d'équations enlevées comme décrit ci-dessus, et m=n-r. Étape 1 : on calcule (y1, ..., ym) = Hash (M), où M est le message à signer, et Hash une fonction publique. Étape 2 (c'est ici qu'intervient la présente invention) : on génère aléatoirement r valeurs ym+h..., ym+r appartenant à K, de telle sorte que ce tirage aléatoire est imprévisible (c'est-à-dire que l'attaquant ne peut pas prévoir ces valeurs à partir des données publiques et des valeurs yi,..., Ym dont il dispose) pour qui ne connaît que la clé publique et pas de secrets. Ceci peut se faire par exemple en utilisant un générateur physique de nombres aléatoires, ou en utilisant un générateur de nombres pseudoaléatoires avec une clé secrète K', cette clé K'n'étant pas révélée. Par contre, il ne faut pas utiliser une technique publique de génération de nombres pseudo-aléatoires, qui permettrait à quelqu'un connaissant la clé publique et le message M de recalculer ym+i, ---, Ym+r. Étape 3 : on calcule x = (xi,..., Xn) satisfaisant les équations Yi = fi (xi,..., Xn), 1 im de la façon habituelle pour un algorithme C*. 5. L'algorithme HFE de base (Cet algorithme a été décrit dans [Pat 2]). Idée de base L'idée de l'algorithme HFE que nous nommons de base , ou HFE (sans autres précision), est la suivante : au lieu de prendre une transformation monôme b = a 1 + qo comme dans l'algorithme C*, on va prendre une transformation polynôme b = f (a), où f est un polynôme ayant plusieurs monômes (pour éviter les attaques de C*), de petit degré d (pour pouvoir calculer f dans les deux sens), et dont l'expression des composantes dans Kr somit n équations de degré 2 (pour avoir une clé publique de degré 2). f est donc un polynôme de la forme : & =./ ( = 2 '+ //, + et tous les monômes en a dans cette expression sont de degré : 9 d. Remarque Ici, contrairement à C*, le petit corps fini K n'est pas nécessairement de caractéristique 2, et la fonction f n'est pas nécessairement bijective. Note On suppose ici connus quelques résultats de Mathématiques sur les corps finis. En particulier le fait qu'une équation polynomiale f (a) = b à une seule variable sur un corps fini K (ici a est la variable et b une constante de K) peut être résolue avec un algorithme dont la complexité est à la fois polynomiale en le degré d de f et polynomiale en le nombre de bits qu'il faut pour représenter un élément de K (par exemple l'algorithme de Berlekamp). 6. Les perturbations-, +, V et F Les perturbations que nous notons-, +, V et F sont quatre perturbations très générales que l'on peut introduire dans presque tous les algorithmes multivariables directs pour essayer d'en renforcer la sécurité (ou pour essayer de réparer des algorithmes). En signature,-et V sont des perturbations qui ne dégradent pas significativement les performances, au contraire de + et F qui doivent être utilisés avec modération car + et F dégradent les performances en signature. Au contraire en chiffrement + et F sont des perturbations qui ne dégradent pas significativement les performances, au contraire de-et V qui doivent être utilisés avec modération car-et V dégradent les performances en chiffrement. D'une certaine façon, comme nous allons le voir-et + sont des opérations symétriques l'une de l'autre, de même que V et F. La perturbation - La perturbation-consiste à ne pas publier certaines des équations qui faisaient initialement partie de la clé publique. Remarque Il est possible, si on le souhaite, de distinguer deux formes de cette pertubation suivant que les équations que l'on enlève sont tirées aléatoirement, ou suivant qu'au contraire certaines de ces équations sont soigneusement choisies à partir de la connaissance de la clé secrète. La perturbation + La perturbation + consiste à mélanger les équations qui constituaient initialement la clé publique avec des équations quadratiques réellement aléatoires. Ce mélange se fait au moyen d'une transformation affine bijective secrète. La perturbation V La perturbation V consiste à introduire des variables supplémentaires au système d'équations. (Ces variables sont souvent appelées variables de vinaigre , et les variables initiales sont alors appelées variables d'huile ). Les variables initiales et les variables supplémentaires n'apparaissent pas sous forme séparées dans les équations de la clé publique : elles ont été mélangées au moyen d'une transformation affine bijective secrète. Lors du calcul en clé secrète, on connaît la séparation de ces variables. On tire alors aléatoirement des valeurs pour les variables supplémentaires, et on résout le système comme d'habitude sur les variables habituelles. La perturbation F La perturbation F consiste à fixer la valeur de certaines variables dans ce qui constituait initialement la clé publique. La nouvelle clé publique ainsi obtenue masque ainsi parfois des symétries importantes, des propriétés algébriques, ou des informations sur la clé secrète, qui pouvaient exister sur la clé publique initiale. Cas de HFE Toutes ces perturbations s'appliquent de façon naturelle en particulier à l'algorithme HFE de base. On peut également appliquer plusieurs de ces transformations. On obtient ainsi les algorithmes que nous notons HFE-, HFEv, HFEv-, HFEF, HFE+F, HFE-+VF etc. (Certaines de ces variantes sont aussi décrites dans [Gou Kip Pat]). En signature les variantes HFE-, HFEv et HFEv-sont celles qui ont les meilleures performances. Comme nous nous intéressons ici plus particulièrement aux signatures, c'est donc ces variantes qui seront les plus utiles. En chiffrement, par contre, les variantes HFE+, HFEF et HFEF+ ont les meilleures performances. Dans HFEv (ou HFEv-) la fonction f est donc de la forme : & = = 2'' + 2-/'+ où les yj sont comme précédemment des constantes de Fqn, mais où leu, sont désormais des vecteurs dont les composantes sont constituées de transformations aléatoires de degré 1 en les variables supplémentaires (appelées aussi variables de vinaigre ), et où 8 est un vecteur dont les composantes sont constituées de transformations quadratiques en les variables supplémentaires. On pourrait croire que HFEv- par exemple, dans la mesure où sa description mathématique est un peu plus complexe que celle du HFE de base, est un peu plus difficile à mettre en oeuvre. En fait les calculs en clé secrète de HFEv-sont sensiblement plus simples que ceux de HFE de base. En effet, avec les connaissances actuelles en cryptanalyse sur ces schémas, il suffit de prendre un degré d du polynôme monovariable caché f plus petit avec HFEv- qu'avec le HFE de base pour éviter toutes les attaques connues. Cependant, lorsque HFE-ou HFEv-est utilisé, il est très important de bien mettre en oeuvre la façon dont cet algorithme est utilisé afin que la perturbation - renforce effectivement la sécurité. Voici comment procéder, selon la présente invention : Génération d'une signature HFE- ou HFEv- selon la présente invention Ici n désigne le nombre de variables xi, r le nombre d'équations enlevées, et m le nombre d'd'équations restant dans la clé publique. Étape 1 : on calcule (yl,..., ym) = Hash (M), où M est le message à signer, et Hash une fonction publique. Étape 2 (c'est ici qu'intervient la présente invention) : on génère aléatoirement r valeurs ym+i,..., ym+r appartenant à K, de telle sorte que ce tirage aléatoire est imprévisible (c'est-à-dire que l'attaquant ne peut pas prévoir ces valeurs à partir des données publiques et des valeurs y1, ..., ym dont il dispose) pour qui ne connaît que la clé publique et pas de secrets. Ceci peut se faire par exemple en utilisant un générateur physique de nombres aléatoires, ou en utilisant un générateur de nombres pseudoaléatoires avec une clé secrète K', cette clé K'n'étant pas révélée. Par contre, il ne faut pas utiliser une technique publique de génération de nombres pseudo-aléatoires, qui permettrait à quelqu'un connaissant la clé publique et le message M de recalculer Ym+l, .., Ym+r. Étape 3 : on calcule x = (xi,..., Xn) satisfaisant les équations yi =fi (xl,..., Xn), 1 im+r de la façon habituelle pour un algorithme HFE ou HFEv. 7. Les algorithmes triangulaires T± (Cette famille d'algorithmes est aussi décrite dans [Gou Pat], [Moh 1], [Moh 2], et [Cou Gou]). Nous décrivons ici la famille d'algorithmes T± (n, u, r, K), où n, u et r désignent des nombres entiers naturels tels que r On considère d'abord une fonction qt de Kn dans K"r, telle que (y,..., yn+u-r) = (xi, ..., an) est défini par le système d'équations suivant : Yi =Xi + gl (Xn-r+1,..., Xn) y2 = X2 +g2 (Xl ; Xn-r+l,..., Xn) Y3 = X3 + (XI, X2 ; Xn-r+i, Xn) in-ru = Xn-r+ gn-r (Xl,..., Xn-r-1, Xn-r+t,., Xn) yn-r+l =gn-r+l (Xl,..., Xn) Yn-r+u gn-r+u (Xl,..., Xn) dans lequel chaque gi (li La clé publique et la clé secrète L'utilisateur choisit une transformation affine bijective aléatoire s, de Kn dans Kn, et une transformation affine bijective aléatoire t de K"r dans K"r. Soit F = t o T o s. Par construction, si on note (y'l,..., y'n+u-r) = F (x'i,..., x'n), on obtient un ensemble explicite {Pl,..., Pn+u-r} de (n+u-r) polynômes quadratiques en n variables, tels que : y'i= Pi (x',,..., x'n) y'n-r+u = Pn-r+u (x' l,..., x'n). Cet ensemble de (n+u-r) polynômes quadratiques constitue la clé publique de ce cryptosystème de la famille T± (n, u, r, K). La taille de cette clé publique est : (1/8). (n+u-r). (n+l). (n/2+l). log2 (q) octets. La clé secrète est constituée de l'ensemble des polynômes gi (c'est-à-dire, de manière équivalente, de la fonction \f), ainsi que des transformations s et t. Signature d'un message (selon la présente invention) Étant donné un message M, on pose (y'l,..., y'n+u-r) = Hash (M), où Hash est une fonction de hachage (sans collision). Pour signer le message M, l'utilisateur qui possède la clé secrète applique le procédé suivant : 1. Calculer (yl,..., Yn+u-r) = ri (yI,..., yn+u-r) ; 2. Choisir aléatoirement des r-uples (xn-r+t,..., Xn), jusqu'à ce que le n-uple (xi,..., Xn) obtenu par xi = y,-gi (xi,..., xi-i ; Xn-r+l,..., xn) (pour 1 3. Pour le n-uple (x,..., Xn) obtenu, calculer (x'i,..., x'n) = s' (xi,..., xn). Remarque 1 : Ce procédé de signature a donc une complexité en O (du). Par conséquent, le cryptosystème T± (n, u, r, K) peut être utilisé pour signer de manière pratique dès que l'on suppose que qu est assez petit. Remarque 2 : La condition u : : ; r assure que la probabilité de ne trouver aucune solution (xi,..., Xn) à l'équation (xi,.... Xn) = (yi,..., yn+u-r) est négligable, et donc que la fonction de schiff-zement F peut être considérée comme une surjection de Kr spur Kn+u Selon la présente invention, on génère aléatoirement les valeurs Xn-r+i,..., Xn appartenant à K, de telle sorte que ce tirage aléatoire est imprévisible (c'est-à-dire que l'attaquant ne peut pas prévoir ces valeurs à partir des données publiques dont il dispose) pour qui ne connaît que la clé publique et pas de secrets. Ceci peut se faire par exemple en utilisant un générateur physique de nombres aléatoires, ou en utilisant un générateur de nombres pseudo-aléatoires avec une clé secrète K', cette clé K'n'étant pas révélée. Par contre, il ne faut pas utiliser une technique publique de génération de nombres pseudo-aléatoires, qui permettrait à quelqu'un connaissant la clé publique et le message M de recalculer Xn-r+i,..., Xn. 8. Généralisation Le procédé de la présente invention se généralise à tout algorithme de signature, dans lequel : 1. La vérification de la validité entre un message M et sa signature x = (xi,... Xn) se fait ainsi : on calcule tout d'abord y = Hash (M), où Hash est une fonction publique, puis on vérifie que les m équations suivantes sont toutes satisfaites : y, =fi (xi,..., xn), 1 im, où les fi sont des fonctions quadratiques publiques à coefficients dans un corps fini K. 2. Pour signer (quand on connaît les secrets), on commence par choisir des valeurs arbitraires pour les variables ( cachées ) ym+1, ..., ym+r, qui dépendent également des valeurs xi,..., Xn par les relations yi = fi (xl,..., xn), m+1 : 5 i : 5 m+r, où les fi sont également des fonctions quadratiques publiques à coefficients dans un corps fini K. Selon le procédé de la présente invention, on génère aléatoirement les valeurs ym+i,, Ym+r appartenant à K, de telle sorte que ce tirage aléatoire est imprévisible (c'est-à-dire que l'attaquant ne peut pas prévoir ces valeurs à partir des données publiques et des valeurs yi,..., ym dont il dispose) pour qui ne connaît que la clé publique et pas de secrets. Ceci peut se faire par exemple en utilisant un générateur physique de nombres aléatoires, ou en utilisant un générateur de nombres pseudo-aléatoires avec une clé secrète K', cette clé K'n'étant pas révélée. Par contre, il ne faut pas utiliser une technique publique de génération de nombres pseudo-aléatoires, qui permettrait à quelqu'un connaissant la clé publique et le message M de recalculer ym+h...ym+r. Références [Cou Gou] : Nicolas Courtois, Louis Goubin, [Cou Gou Pat] : Nicolas Courtois, Louis Goubin et Jacques Patarin, C*-+ and HM : variations around two schemes of TMatsumo o and. Imai, ASIACRYPT'98, Springer LNCS 1514, Octobre 1998, pp. 35-49. [Gou Kip Pat] : Louis Goubin, Aviad Kipnis et Jacques Patarin, Unbalanced Oil and Vinegar Signature Schemes, EUROCRYPT'99, Springer LNCS 1592, May 1999, pp. 206-222. [Gou Pat] : Louis Goubin et Jacques Patarin, Asymmetric Cryptography with S-Boxes, ICICS97, Springer LNCS 1334, Novembre 1997, pp. 356-368. [Ima Mat 1] : H. Imai et T. Matsumoto, Algebraic Methods for Constructing Asymmetric Cryptosystems, Algebraic Algorithms and Error Correcting Codes (AAECC-3), Grenoble 1985, Springer-Verlag LNCS nu 229. [Ima Mat 2] : H. Imai et T. Matsumoto, Public Quadratic Polynomials-tuples for efficient signature-verification and message-encryption, EUROCRYPT'88, SpringerVerlag 1988, pp. 419-453. [Moh 1] : T. T. Moh, A public key system with signature and master key funetions, Communications in Algebra, 27 (5), pp. 2207-2222, 1999. Available at http ://www. usdsi. com/public. ps. [Moh 2] : T. T. Moh, A fastpublic key system with signature and master keyfunctions, in Proceedings of CrypTEC'99, International Workshop on Cryptographie Techniques and E-commerce, Hong-Kong City University Press, pp. 63-69, July 1999. Available at http ://www. usdsi. com/cryptec. ps. [Pat 1] : Jacques Patarin, Cryptanalysis of Matsumoto-Imai public key scheme of Eurocrypt'88, CRYPTO'95, Springer LNCS 963, Août 1995, pp. 248-261. [Pat 2] : Jacques Patarin, Hidden Fields Equations (HFE) and Isomorphisms of Polynomials (IP) Iwo new Families of Asymmetric Algorithms, EUROCRYPT'96, Springer LNCS 1070, Mai 1996, pp. 33-48. [Pat 3] : Jacques Patarin, Asymmetric Cryptography with a Hidden Monomial, CRYPTO'96, Springer LNCS 1109, Août 1996, pp. 45-60. [RSA] : R. L. Rivest, A. Shamir, L. M. Adleman, A Method for Obtaining Digital Signatures and Public-Key Cryptosystems, Communications of the ACM, v. 21, n. 2, 1978, pp. 120-126. Revendications Revendication 1 Procédé pour générer des signatures à clé publique dont la clé publique est un système de m équations quadratiques à n inconnues de la forme yi fi (xi,..., Xn),..., ym = fm (xi,..., Xn), les xi et yi appartenant à un corps fini K, et pour lequel le calcul d'une signature x = (xi,..., Xn) d'un message M vérifiant M = (yl,..., ym) ou (kl,, ym) = Hash (M), Hash étant une fonction publique, s'effectue en tirant aléatoirement r variables Ym+i,, ym+r de K, puis en cherchant une valeur x = (xi,..., Xn) satisfaisant aux m équations publiques et aux r équations secrètes supplémentaires de la forme ym+i = fm+i (xi,... xn), 1 : i i : 5 r, les fm+i étant des fonctions quadratiques secrètes, caractérisé en ce que le tirage aléatoire des valeurs ym+i,..., ym+r est imprévisible, c'est-à-dire que l'attaquant ne peut pas prévoir ces valeurs à partir des données publiques et des valeurs y1, ..., ym dont il dispose, pour qui ne connaît que la clé publique et pas de secret. Revendication 2 Procédé pour générer des signatures à clé publique selon la revendication 1 caractérisé en ce que les valeurs ym+i,, ym+r sont générées en utilisant un générateur physique de nombres aléatoires. Revendication 3 Procédé pour générer des signatures à clé publique selon la revendication 1 caractérisé en ce que les valeurs ym+,,..., ym+r sont générées en utilisant un générateur pseudo aléatoire ayant une clé secrète K'd'au moins 64 bits. Revendication 4 Procédé pour générer des signatures à clé publique selon la revendication 3 caractérisé en ce que le générateur pseudo aléatoire utilisé est déterministe, c'est-à-dire donnera toujours les mêmes sorties sur les mêmes entrées. Revendication 5 Procédé pour générer des signatures à clé publique selon la revendication 1 caractérisé en ce que l'algorithme de signature utilisé est un C*--. Revendication 6 Procédé pour générer des signatures à clé publique selon la revendication 1 caractérisé en ce que l'algorithme de signature utilisé est un HFEv-. Revendication 7 Procédé pour générer des signatures à clé publique selon la revendication 1 caractérisé en ce que l'algorithme de signature utilisé est un T±. Revendication 8 Dispositif selon les revendications précédentes caractérisé en ce que les signatures x sont générées par une carte à microprocesseur (carte à puce).