PROCEDE POUR EFFECTUER UNE PHASE DE MULTIPLICATION MODULAIRE DE DEUX OPERANDES EN MULTIPRECISION ET CRYPTOPROCESSEUR POUR LA MISE EN ŒUVRE DU PROCEDE
L'invention concerne le domaine de la cryptographie et plus particulièrement les cryptosystèmes à clé publique.
Ces systèmes sont utilisés lorsqu'il s'agit de communiquer des données que l'on souhaite conserver confidentielles ou que l'on souhaite authentifier par une signature .
Selon un exemple de chiffrement, quelqu'un, souhaitant émettre un message, prend connaissance au préalable d'une clé publique attachée au destinataire à qui il va l'adresser. Il chiffre le message au moyen de cette clé publique et le transmet. Le destinataire, après réception, peut déchiffrer le message et retrouver le document initial en utilisant sa clé privée.
Selon un autre exemple de signature, on signe un document en le codant au moyen de sa clé privée et on présente la signature avec le document initial . Le destinataire vérifie la signature en utilisant la clé publique associée à la clé privée de l'émetteur.
Des systèmes permettant ces opérations sont maintenant bien connus. Par exemple, on connaît le crypto-système RSA développé par R. Rivest, A. Shamir et L. Adleman. On en trouve une présentation complète dans le brevet US 4 405
829 déposé à leurs noms.
On connaît d'autres types de cryptosystèmes, à base de calculs logarithmiques discrets, tels que le système DSS (Digital Signature Standard) , proposé et publié par le "Department of Commerce" des Etats-Unis d'Amérique.
Le procédé de cryptographie de type RSA, par exemple, consiste, à partir de paramètres publics e, n, à
transformer un message m en un message chiffré c calculé à partir du message m selon la formule c = m
e modulo n (1) compte-tenu du fait qu'on retrouve le message m, ou on en authentifie l'émetteur, à partir de la reconnaissance de c selon une formule inverse similaire : m = c
d modulo n Dans la formule (1) , c est le reste de la division de m
e par n. La formule (1) s'exprime donc algébriquement de façon suivante :
ce qui revient à un calcul binaire du type
U = A. B - N.Q (2) correspondant à
U = A.B modulo N (2bis)
Pour procéder à ces opérations, on utilise notamment un dispositif électronique portable, tel qu'une carte à microprocesseur, constituant une carte cryptographique. La carte comprend un crypto-processeur qui est une unité de calcul spécialisée, pouvant, pour l'essentiel, multiplier, sous forme binaire, des grands nombres tels que
A, B, Q, N par exemple de 1024 bits, entre eux, selon des algorithmes de multiplications modulaires en multiprecision tels que ceux proposés par Barrett, Implementing the Rivest
Shamir and Adleman public key encryption algorithm on a standard digital signal processor, In Advances in
Cryptology - CRYPTO' 86, Santa Barbara, California (edited by A. M. Odlyxko), vol. 263 of Lecture Notes in Computer Science, pp. 311-323, Springer-Verlag, 1987; Montgomery,
Modular multiplication without trial division, Mathematics of Computation, 44:519 521, Apr. 1985; Quisquater, R.
Ferreira, R. Malzahn, p. Marissen, J.J. Quisquater and T.
ille, FAME : A 3rd génération coprocessor for optimising public key cryptosystems in smart card applications, In Proc. CARDIS 1996, Smart Card Research and Advanced Applications (edited by P. H. Hartel. P. Paradinas and J.J. Quisquater), pp. 59-72, Stichting Mathematisch centrum. C 1, Amsterdam, The Netherlands, September 16 18 1996; R. Ferreira, R. Malzahn, J.J. Quisquater and T. Wille, A high performance third génération crypto card. In Digitale Signatur and sicherheitssensitive Anwendungen (edited by Struiff Glade, Reimer) , Vierveg, 1996; ou Sedlak, the RSA cryptography processor, In Advances in Cryptology - EUROCRYPT' 87, Amsterdam, The Netherlands (edited by D. Chau and W.I. Price) , vol. 304 of Lecture Notes in Computer Science, pp. 95-105, Springer-Verlag, 1988. Par multiplication modulaire, on entend une phase de multiplication decomposable en deux sous-phases, l'une de multiplication partielle de deux opérandes A, B et l'autre de réduction partielle par le produit de deux autres opérandes Q, N selon la loi indiquée par la formule (2) . Par multiplication en multiprecision, on entend une double succession de phases (i, j) de multiplications appliquées à deux opérandes représentables en multiprecision, de la façon suivante : A = p_ι 2(p_1)t + Ap_22(p-2)t + .... ΑL2lt + ... ^ + Ao "1 . B = Bp-1 2(p_1)t + Bp-22(p"2)t + .... B2jt + ... B^ + Bo J
Les opérandes A et B sont fractionnés en p mots Ai et p mots Bj de t bits chacun lors du traitement dans le cryptoprocesseur qui est typiquement un processeur t bits
(généralement t = 32) ; p représente alors l'ordre de multiplicité de la précision.
La formule (3) est algébriquement exacte bien que les opérandes A et B soient obtenus à partir de Ai et Bj respectivement par simple concaténation, ordinairement
notée p-x I p_2 | ... I Ai | ...Ai I 0. Ceci résulte dans la formule de l'introduction des coefficients multiplicateurs 2xt et 2Dt qui n'ont pour tout résultat en représentation binaire que d'appliquer un décalage de it et jt bits respectivement des opérandes partiels Ai et Bj avant d'effectuer l'addition.
Cette formule permet de préciser le procédé de calcul en multiprecision des multiplications modulaires, le calcul du produit Q.N étant en effet similaire au calcul du produit A.B. On peut par exemple effectuer le produit par exemple des opérandes A, B exprimés par la formule (3) . On obtient :
Cela peut se traduire, en utilisant' les propriétés de distributivité de l'opération modulo, par l'algorithme simplifié de multiplication modulaire suivant : begin I I commentaire : initialisation
(1) U = o
(2) for j = o up to p-l (3) U = U + (A p-l.Bj)2tj
(4) end for
I I commentaire : début de "boucle i"
( 5 ) for i = p-2 downto o
( 6) Q = [U/Nj ( 7 ) J = 15 . 2* l l commentaire : début de "boucle j "
(8) for j = o up to p-l
(9) ϋ = U - (Q.Nj)2t(j+1)
(10) U = ϋ + (Ai.Bj)2
tj (11) end for il fin "boucle j" (12) end for I I fin "boucle i" l I commentaire : terminaison
(14) for j = o up to p-l
(15) U = U- (Q.Nj)2tj
(16) end for end le quantificateur [_αj représentant la partie entière de α.
Dans cet algorithme, l'opération de calcul de la quantité Q n'est pas décrite. Cette quantité est en théorie obtenue en prenant la partie entière du quotient du résultat intermédiaire U par N. Il existe d'autres méthodes de calcul de ce quotient Q comme par exemple celle donnant une estimation Q de Q et décrite dans le document de J-F Dhem, Design of an efficient public-key cryptographie library for RISC based smart cards, Thèse soutenue en vue de l'obtention du grade de Docteur en Sciences Appliquées, Université catholique de Louvain, Faculté des Sciences Appliquées, Laboratoire de Microélectronique, Louvain-la- Neuve, Belgique. Disponible à : http : //users .belgacom.net/dhem/these, May 1998. Le chiffrement de messages de type RSA étant réalisé en temps réel lors d'une transmission, ces algorithmes doivent être exécutés extrêmement rapidement sous peine de ralentir cette transmission de façon rédhibitoire .
Une façon d'augmenter la rapidité de calcul d'un processeur est de le concevoir selon une architecture parallèle, les bus d'information reliant les mémoires et les unités arithmétiques et logiques comportant autant de bits que les nombres soumis aux calculs. Le nombre de bits étant ici 1024, cette conception n'est pas possible. Les microprocesseurs travaillent sur des mots machine de t bits, t pouvant être égal à 8, 16, 32, 64. Actuellement, la valeur la plus courante est t = 32 bits.
Pour travailler sur des nombres plus grands, on dispose alors d'instructions travaillant sur n mots machine, donc sur n.t bits. Si n = 2, on parle alors de double précision. Les concepteurs de cryptoprocesseurs peuvent adopter des multiplieurs obligeant à des opérations intermédiaires de normalisation et de dénormalisation. Mais cela coûte en temps d'exécution de façon non négligeable.
Une autre matière d'augmenter la rapidité de calcul d'un processeur est de le concevoir spécifiquement pour les opérations qu'on lui demande.
On est ainsi amené à combiner une architecture de multiplieur et, par exemple, complémentairement, une électronique rapide de normalisation et de dénormalisation, jointe à une électronique rapide de fractionnement de longs mots en mots plus petits et, inversement, de leur défractionnement, avec les traitements adéquats de propagation de retenues.
Ces solutions "câblées" certes très rapides manquent d' adaptabilité, offrent moins de possibilités de défense quant aux agressions du type "timing attacks" et sont, à terme, coûteux en temps de conception et de développement.
La demanderesse a cherché à trouver une solution plus performante encore que les solutions connues en temps d'exécution et adaptable facilement aux diverses exigences d'utilisation tant en chiffrement qu'en authentification et notamment adaptable pour masquer aisément la chronologie des variations de consommation en une conception "anti- timing attacks" quelle que soit l'application implémentée. A cet effet, l'invention concerne tout d'abord un procédé pour effectuer une phase de multiplication modulaire de deux opérandes en multiprecision, la phase de multiplication étant composée d'au moins deux sous-phases,
l'une de multiplication partielle, l'autre de réduction partielle, procédé caractérisé par le fait que les deux sous-phases sont entrelacées et font appel à un même circuit multiplieur. En entrelaçant les deux sous-phases, on peut effectuer simultanément, à chacune des multiplications des sous- phases, les accès mémoires nécessaires à chacune des deux sous-phases, en avance de phase.
De préférence, le circuit multiplieur effectue simultanément une multiplication et deux additions.
En utilisant un circuit multiplieur du type XY + C + Z, on effectue les additions pendant les multiplications.
De préférence encore, chaque sous-phase comporte une étape de chargement d'un des registres d'entrée du circuit multiplieur pour les sous-phases équivalentes ultérieures. Ces étapes chargent des registres contenant des résultats de calculs partiels de poids binaire supérieurs pour en propager l'effet sur les calculs ultérieurs.
Corrélativement, chaque sous-phase récupère ces mêmes registres d'entrée chargés pour les sous-phases équivalentes antérieures pour effectuer ses calculs.
Avantageusement, les opérations de chargement et de déchargement des registres du circuit multiplieur à partir de et vers le module mémoire du cryptoprocesseur, et les opérations de contrôle-commande du circuit multiplieur sont commandées par un logiciel pseudo-code comportant des macrocommandes et des pseudo-instructions .
Ainsi, on a une totale adaptabilité du multiplieur relativement aux applications qui en seront faites ultérieurement, sans changer sa conception matérielle.
L'invention concerne aussi un cryptoprocesseur pour la mise en œuvre du procédé de l'invention, comprenant une fonction de multiplication, un module mémoire, un module de
multiplication avec des registres, et un circuit multiplieur, caractérisé par le fait qu'il comprend aussi des multiplexeurs reliant les registres au circuit multiplieur. Ainsi, on peut disposer du circuit multiplieur pour exécuter les deux sous-phases d'une boucle j sans effectuer d'accès mémoire entre ces deux sous-phases.
Avantageusement, le circuit multiplieur est agencé pour réaliser une opération du type XY + Z + C. Avantageusement encore, le circuit multiplieur est du type parallèle, comprend une matrice d'intersection , une matrice de produits partiels et une matrice d'additionneurs, caractérisé par le fait que la matrice de produits partiels comporte deux registres supplémentaires. Ces deux registres permettent d'additionner les entrées Z et C par la matrice d'additionneur du multiplieur.
De préférence, le cryptoprocesseur comporte une mémoire pseudo-code et un interprêteur. Avantageusement, la mémoire pseudo-code peut comporter des pseudo-instructions de chargement/déchargement des registres et des macrocommandes de commande du circuit multiplieur et des multiplexeurs.
Ainsi, on peut adapter la succession des opérations sur les registres et des commandes du circuit multiplieur en fonction des besoins opérationnels du cryptoprocesseur.
L'invention sera mieux comprise à l'aide de la description qui suit et du dessin annexé dans lequel la figure 1 montre la suite des opérations du procédé de multiplication modulaire de l'invention; la figure 2 représente la structure par blocs fonctionnels du cryptoprocesseur selon l'invention;
- la figure 3 est un schéma électronique du module de multiplication;
- la figure 4 est un schéma logique du module de multiplication; - la figure 5 est un schéma électronique du circuit de multiplication XY + C 4- Z;
- la figure 6 montre les opérations réalisées en une sous-phase par le module de multiplication et - la figure 7 est un exemple de pseudo-code réalisant une multiplication modulaire.
Lorsque le cryptoprocesseur a besoin d'effectuer une multiplication modulaire modulo N de deux opérandes A et B, il peut appliquer l'algorithme (5) ci-dessus, notamment la boucle interne de cet algorithme, ésignée ici par l'appellation boucle j, ceci p fois dans une autre boucle externe désignée par la boucle i . Dans la boucle j , il doit alors faire exécuter par son multiplieur une multiplication donnant un produit résultant partiel Ai Bj décalé de jt bits "vers la gauche", c'est-à-dire vers les bits de poids fort auquel il ajoute un résultat partiel précédent U, et une deuxième multiplication donnant un résultat Q.Nj décalé de (j+l).t bits "vers la gauche" qu'il ajoute au résultat précédent . Nj , est le ième mot du complément à 2 de N augmenté de
1. Il n'y a que des additions à effectuer.
Il faut remarquer que dans l'algorithme (5) Q est une variable temporaire, petite, qui est calculée à l'aide de la valeur complète de N, à la différence des calculs des lignes (9) et (15) , dans lesquels on utilise les mots fractions Njde N.
On propose ici d'utiliser un multiplieur réalisant les opérations combinées X.Y + C + Z, ou C, ou Z et C étant
éventuellement nuls. Puisqu'il n'apparaît qu'une addition au maximum dans chacune des multiplications de la boucle j , un opérande au moins du multiplieur reste disponible pour le report des retenues. De plus, il se trouve que le résultat de la multiplication obtenue par le multiplieur XY + C + Z est de la même longueur effective identique que celui de la multiplication XY si les longueurs effectives de C ou de Z n'excèdent pas celles de X ou de Y. Cette propriété permet de prévoir les longueurs effectives des résultats et d'optimiser les échanges mémoire entre le multiplieur et le cryptoprocesseur par la méthode exposée ci-après.
La figure 1 montre la suite des opérations de l'algorithme (5) et les échanges mémoire correspondants.
L'initialisation de la variable de travail U de p mots de t bits, correspondant aux lignes (1) à (4) de l'algorithme (5), est effectuée lors d'une première étape 20 itérée par une boucle repérée "initialisation U" pour donner les mots du résultat cherché en fin d'algorithme et rangés dans un registre 172 du cryptoprocesseur.
Ce calcul est effectué à partir du mot Ap_ι et des mots Bp_ι... Bo, ces mots étant extraits des registres 174 et 175 du cryptoprocesseur contenant les nombres A et B de p mots de t bits.
Le lancement de la boucle i ligne (5) est effectué entre les étapes 21 et 21' pour
1) exécuter le calcul, étape 22 des lignes (6) et (7) , en initialisation de la boucle j d'où résulte une variable intermédiaire Q qui est rangée dans un registre 171 du cryptoprocesseur,
2) lancer la boucle j, ligne (8) entre une étape 23 et une étape 23' pour, après recherche de Nj extraite d'un
registre 173 contenant le nombre N de p mots de t bits, de Ai et de B , itérer les étapes 40 (de réduction) 50 (de multiplication et de transfert ou d'addition) .
L'exécution d'une phase de réduction finale correspondant aux lignes 13 à 16 de l'algorithme 5 est nécessaire et réalisée lors de l'étape supplémentaire 62 itérée entre les étapes 61 et 63 de la boucle de terminaison.
La suite des opérations va maintenant être détaillée. En référence à la figure 1, les nombres A, B, et N et un nombre résultat U sont fragmentables en mémoire du cryptoprocesseur en p mots de t bits Ai, Bj , Nj et Uj numérotés de 0 à p-l, comme indiqué en 171, 172, 173, 174 et 175. Comme chaque multiplication de mots de t bits chacun donne un mot résultat de 2 t bits, correspondant à la concaténation de 2 mots de t bits, le plus significatif étant désigné par MSB (most significant bit) et le moins significatif par LSB (least significant bit) , à chaque boucle suivante j sont traités des mots de t bits de la boucle j précédente et mémorisés dans des registres de t bits R0, RI et Rtemp, et des résultats de la boucle j sont mémorisés dans ces mêmes registres pour le traitement de la boucle suivante. Une multiplication combinée à deux additions de mots de t bits, (XY + C + Z) , donne un résultat d'au plus 2 t bits, sans crainte de débordement fractionnable en 2 mots de t bits.
Après une étape 30 de mise à zéro du registre 172 contenant le nombre résultat U et après l'étape 22 préliminaire de calcul de Q, sont enchaînées deux sous- phases dans la boucle j :
1) Première sous-phase de réduction, en étape 40 avec une multiplication du type XY + C + Z pour une réduction du
résultat temporaire U, dans laquelle le multiplieur réalise simultanément les opérations suivantes :
QNj + Uj + RO
RO contenant le mot MSB du calcul similaire de la précédente boucle j et Rtemp, par un transfert 70, contenant le mot LSB de ce calcul de la boucle j en cours. Par un transfert 80, RO reçoit en fin de calcul de la boucle j en cours le mot MSB du calcul effectué pour servir lors de l'exécution de la boucle j suivante. 2) Deuxième sous-phase 50 de multiplication modulaire partielle pour obtenir le résultat temporaire U en fait la "retenue", en effectuant simultanément les opérations suivantes :
AiBj+Rtemps+Rl RI contenant le mot MSB du calcul similaire de la précédente boucle j et, par le transfert 90, recevant en fin de calcul le mot MSB de la boucle j en cours pour servir lors de l'exécution de la boucle j suivante.
En entrelaçant les sous-phases de réduction et de multiplication sur au moins deux boucles j , on conserve un registre temporaire Rtemp de même taille t ne nécessitant pas d'accès à la mémoire du cryptoprocesseur, pour rechercher des données communes utiles pour l'exécution des deux sous-phases. Si l'on effectuait les sous-phases complètes de réduction et de multiplication successivement, chaque sous- phase donnant des résultats sur des mots doubles, il faudrait réaliser des appels mémoire séparément pour chaque sous-phase. Ici on économise ces appels mémoire. La mise en œuvre du procédé ci-dessus va maintenant être expliquée en fixant a priori, pour simplifier, la taille de mots machine t égale à 32 bits.
En référence à la figure 2, le cryptoprocesseur 100 comporte une entrée 101 de message m à chiffrer, ou de message c à déchiffrer, une sortie 102 de message c chiffré ou de message m déchiffré, une mémoire 103 des paramètres publics P de chiffrement : le modulo n et l'exposant, d ou e .
Ces entrées 101, sorties 102 et mémoire 103 de paramètres sont reliées, quand c'est nécessaire, à une application 110 de cryptage (chiffrement, déchiffrement, authentification...) qui requiert au moins une opération de multiplication modulaire par N de deux opérandes A, B. Ces données A, B, N sont transmises par une liaison 121 à une fonction de multiplication 120 qui renvoie par une liaison 122, après calcul, un résultat qui est le produit A B modulo N recherché. Cette fonction de multiplication 120 comporte au moins une mémoire pseudo-code 125 contenant une liste de pseudo-instructions P.I. et des macrocommandes MC à exécuter, exposées plus loin dans le document, et correspondant à la fonction de multiplication et un compteur ordinal 126 pour transmettre dans l'ordre de la liste les pseudo-instructions PI et les macrocommandes MC à un interpréteur de pseudo-code 130, qui est relié par ailleurs à des mémoires 131 et 132 contenant respectivement le code exécutable des macrocommandes MC d'un module de multiplication 150 décrit plus loin et le code exécutable des pseudo-instructions PI, essentiellement pour contrôler le mouvement des données d'un module 140 de registres à décalages, décrit plus loin également.
L'interpréteur 130 est relié audit module de multiplication 150 par les liaisons électroniques 136 de contrôle du module et audit module 140 par les liaisons 143 de contrôle des registres et la liaion 142 U de transmission des résultats partiels Uj . Outre la fonction
interpréteur de pseudo-code classique, l'interpréteur 130 comporte éventuellement dans une option de conception © particulière une fonction de calcul de quotient Q 135 reliée audit module de registres à décalage par une entrée 142N et une sortie 144 du module de calcul de quotient.
La fonction de multiplication est reliée au module 140 de registres à décalage par un bus de données 141 transmettant les données A, B, N au module 140.
Les modules de multiplication 150 et de registres à décalage 140 sont reliés entre eux par des bus de données 152. Une horloge 160 cadence le compteur ordinal 126, l'interpréteur 130, les modules de multiplication 150 et de registes à décalage 140.
Les modules de multiplication et de registres à décalage vont maintenant être décrits.
En référence à la figure 3 , le module de multiplication 150 comprend un circuit multiplieur 1500 à quatre entrées parallèles X, Y, Z, C reliées aux entrées A, N, B, Q, respectivement par des bus parallèles 151A, 151B, 153 et à une sortie 152 par un bus parallèle (U) , par 1 ' intermédiaire de registres de multiplexeurs et de démultiplexeurs décrits ci-après. Le nombre de bits de ces registres correspond bien sûr au nombre de bits des bus qui les alimentent ou qui sont alimentés par eux. Pour un bus donné, ce nombre, à supposer t = 32, est indiqué en figure 3 en regard des repères des tailles bus et les repères sont reportés sur les bus.
Ainsi, le bus A (151A) , sans repère, donc de 32 bits, alimente des registres A0 (32 bits) , RRSUB (4 bits) , RBN0 (32 bits) , RBN1 (32 bits) , RUO (32 bits) et RUl (32 bits) . Ces registres alimentent les entrées Y du circuit multiplieur par un multiplexeur MUX2 , pour A0 , Z du circuit multiplieur par un multiplexeur MUXl pour RUO et RUl, et X
du circuit multiplieur par un démultiplexeur DEMUX pour RBN1, et directement pour RBNO et RRSUB- Le bus B (151B) alimente Al, lui-même alimentant un multiplexeur MUX2 , de même que le bus Q (153) alimente, selon l'option de conception GD, des registres Q0 et Ql, eux-mêmes alimentant le démultiplexeur MUX2.
Dans une autre option © de conception se substituant à l'option de conception ©, une partie d'un bus O de sortie du circuit 1500 alimente aussi des registres à décalage ROI à R03 tandis que 66 autres bits du registre O[35..100] alimentent les registres Q0 et Ql .
Quelle que soit l'option de conception choisie, en sortie, le circuit multiplieur 1500 alimente le bus O de 102 bits, une partie h ou g de ce bus, respectivement O [34..101] et O [32..97] alimentant les deux registres R0 et RI, à travers le démultiplexeur DEMUX1 , les registres RI servant pour le calcul de multiplication et R0 servant pour le calcul de réduction étant reliés en rebouclage sur l'entrée C du circuit-multiplieur 1500 à travers le multiplexeur MUXO, une autre partie du bus O composée de ses 32 LSB O[0..31], alimentant d'une part le bus de sortie 152 (U) à travers des registres Rkl et RkO , et d'autre part du registre Rtemp composé des registres RtO et Rtl servant à bénéficier du calcul de réduction pour effectuer le calcul de multiplication et, à travers eux, le multiplexeur MUXl en rebouclage sur l'entrée Z du circuit multiplieur 1500.
Les liaisons électroniques 136 sont quant à elles reliées : 1) au registre Rtemp par une commande de mise à zéro (RESET) ,
2) aux multiplexeurs MUXO, MUXl, MUX2 pour les mettre dans l'un ou l'autre des états, repérés 0 ou 1, les mettant en
situation de transmettre leurs entrées 0 ou 1 en sortie sur C, Z ou Y respectivement du circuit 1500 : A ou Q, Rt ou U (respectivement des signaux binaires A/Q et t/U) . 3) aux démultiplexeurs DEMUX et DEMUXl conformément au tableau "commandes BUS/DEMUX" de la figure 3 pour transmettre une partie des bits du registre RBN1 et des données complémentaires sur l'entrée X du circuit 1500.
En référence à la figure 4, maintenant, le module de registres à décalage 140 comporte quatre registres 172, 173, 174, 175 contenant respectivement un résultat de calcul U et trois données de calcul, le module N et les opérandes A, B, chacun sur par exemple 1024 bits correspondants à p mots de t = 32 bits, indicés de 0 à p-l, rappelés Uj , Ai, Bj et Nj . Les registres 173, 174 et 175 sont alimentés par la fonction de multiplication 120 au moyen des bus A, B, N de la liaison 141, et alimentent eux- mêmes les bus A et B sous la commande de drivers 147, 148 et 149 respectivement sur les registres 173, 174 et 175. Les drivers 147, 148 alimentent le bus 151A en données et le driver 149 alimente le bus 151B, les trois étant commandés par l'interpréteur 130 à travers une liaison 143, en phase avec le signal d'horloge.
Le module 140 reçoit du module de multiplication 150 le résultat du calcul par le bus 152 (U) à travers le driver 146, lequel résultat est mémorisé dans le registre 172 avant d'être retransmis sur le bus 151A vers le module 150, soit sous forme fractionnée, soit totalement, sous la commande du driver 146 et sur le bus 142 U, seulement dans le cas de l'option © de conception vers l'interpréteur 130, en même temps que N du registre à décalage 173 à travers le driver 147 sous la commande de l'interpréteur 130.
Pour cette option Φ, en retour de la transmission, à l'interpréteur, de U et N, une donnée Q mémorisée dans un registre 171 peut être retransmise au module de multiplication 150 à travers le bus 153 (Q) par un driver 145 sous la commande de l'interpréteur.
Outre les remises à zéro initiales des registres (U, RO, RI, Rtemp) les drivers du module 140 ont ici deux fonctions :
1) ils transmettent au module 150 un mot de 32 bits indexé par un entier i ou j communiqué par l'interpréteur 130 au travers de la liaison 143;
2) ils effectuent un décalage registre préalable à cette transmission pour l'accélérer.
Le driver 146 gère en plus les bus 152 de réception du résultat U et 142U de renvoi du résultat U vers l'interpréteur, le driver 147 gère en plus le bus 142 N de renvoi de N vers l'interpréteur pour le calcul de Q.
Quant au circuit multiplieur 1500, on propose ici une conception parallèle du circuit, connue parfois sous l'appellation anglosaxonne de "Wallace tree".
Selon cette conception classique, en référence à la figure 5, une première opération est effectuée entre les opérandes X et Y de tl et t2 bits respectivement, tl étant supposé supérieur à t2, mémorisés dans les registres 1501 et 1502, opération qui est une intersection logique bit à bit entre les deux opérandes selon une matrice 1510 de circuits "AND" pour donner le tableau de produits partiels 1520 composés de t2 registres de tl bits repérés 1 à lt2+ι-
Ici, deux autres registres 1503 et 1504, de tl bits, repérés 10 et 11, ont été ajoutés dans le tableau de produits partiels ci-dessus.
Ces registres contiennent les deux autres entrées Z et C du circuit multiplieur de mots de tl et de t2 bits
respectivement de sorte que, par exemple, X, Z < 2t et Y,
C < 2t2 et donc XY + C + Z < 2fcl + t2 Le tableau de produits binaires partiels 1520 doit donner lieu à une somme effectuée par une matrice 1530 d'additionneurs tels que l'additionneur 1531 à trois entrées lk u+ι, lk u rk_1 u et à deux sorties sk u et rk u, k étant le rang du bit de la ligne lu traitée, lu la valeur du bit à additionner, su le bit somme et rk u le bit retenue. Le fonctionnement en est bien connu . Le résultat est obtenu dans un registre 1540 et comporte tι+ t2 - 1 bits.
Les pseudo-instructions prévues pour commander les drivers du module 140 sont les suivantes :
MTA [Rs], [Rt] Cette instruction charge les registres [Rs] et [Rt] (Ai, Ai-i) du registre 175 dans les registres A0 et Al du module 150.
MTB [Rs], [Rt] charge les registres [Rs] :
Bj , Bj+i ou Nj , Nj+i du registre 174 ou 173 dans les registres Rt :
RBN0 et RBN1 du module 150.
MTU [Rt], [Rs] charge les registres 172 (Rs) dans les registres RUO et RUl du module 150 (Rt)
RESET [Rs] Cette instruction remet à zéro le registre Rs, qui peut être l'un de ces registres R0 , RI, RtO, Rtl, RUO, RUl,
RBN0, RBN1, RRSUB, Al, A0 , Q, R03-R00 du module 150.
LW + + [Rt], [Rs] charge Rt dans Rs, Rt étant un registre du module 140 et Rs un registre du module 150, avec incrémentation des indices des registres du module 140 dans les fonctions 147, 148, 149, suivant le cas.
LW - - [Rt], [Rs]
Même chose, avec décrémentation.
SW + + [Rs],[Rt] ou
SW - - [Rs], [Rt] suivant incrémentation ou décrémentation, instruction permettant de décharger Rs dans Rt, symétriquement aux instructions LW. SWAP + + 1 ou SWAP - - [Rs], RUO, Rkl ou
SWAP + + 1 ou SWAP - - [Rs], RUl, RkO .
Ces instructions permettent d'enchaîner les opérations de chargement et de déchargement précédentes, en parallèle sur les opérations de multiplication modulaires entrelacées, sans nécessité de nouvel accès au module mémoire 140.
BLEINC et BGZINC
Instructions de branchement équivalentes aux suites d'instructions de langage C suivantes ble t2, t7, interne (branch if less than) addiu t2, t2 , imm (immédiate value) et : bgz t2 , interne addiu t2, t2 , -imm Les macrocommandes MC prévues pour commander le module de multiplication 150 sont les suivantes :
1) MULTEXQT :
(RBNO du module 150 contient NO/Nj du registre 173 et RUO de ce module contient UO du registre 172) - charge Q0, Ql dans l'entrée X du module 1500 (tl = 66 bits figure 5) en positionnant MUX2 du module 150 sur l'entrée 1 du multiplexeur par le signal A/Q = 1 des liaisons 136 envoyé par l'interpréteur 130,
- charge RBNO (32 bits) dans Y du module 1500 (t2 = 64 bits) ,
- charge RUO dans Z en positionnant MUXl sur l'entrée 1 du multiplexeur par le signal t/u = 1,
- charge RO dans C en positionnant MUXO sur son entrée 0 par le signal A/Q = 1,
- provoque l'exécution de la multiplication du circuit multiplieur 1500, - place le mot LSB du résultat 1540, repéré O[0..31], dans le registre RtO du module 150, et le mot MSB de ce résultat, repéré 0[32..97], dans le registre R0 du même module .
Puis, similairement : (à ce stade RBN1 et RUl contiennent Nl/Nj+1 Ul des registres 173 et 172 respectivement) :
- charge Q0, Ql dans X, RBN1 dans Y, RUl dans Z et R0 dans C du circuit multiplieur 1500, provoque l'exécution de la multiplication du circuit 1500,
- place le mot LSB du résultat 1540 dans les registres Rtl et RkO du module 150,
- place le mot MSB du résultat 1540 dans les registres R0 et Rkl du module 150. Les registres RkO - Rkl contiennent le résultat qui est envoyé par le bus U (liaison 152) dans le module mémoire 140, registres 172 (U0, Ul) à partir duquel il est renvoyé comme résultat partiel par la liaison 142 U vers l'interpréteur 130, puis vers la fonction de multiplication 125 d'une part et vers la fonction 135 selon une première option © de conception.
Mais le contenu des registres RkO-Rkl peut être envoyé directement vers l'interpréteur 130 pour mise à jour de U. 2) MULTEXQK : (RBNO du module 150 contient NO/Nj du registre 173 et RtO contient le mot LSB résultat d'une macro commande immédiatement précédente dans la liste pseudo-code 125) . Mêmes opérations que MULTEXQT mais en substituant :
RtO à RUO RkO à RtO Rtl à RUl Rkl à Rtl et en remarquant qu'avant la seconde multiplication Rtl contient le mot MSB résultat d'une macrocommande immédiatement précédente dans la liste pseudo-codes 125.
3) MULTEXAT identique à MULTEXQT, dans laquelle on substitue A à Q, RI à RO et B à N.
4 ) MULTEXAK identique à MULTEXQK, dans laquelle on substitue A à Q, RI à RO et B à N.
Dans une seconde option © de conception, sont prévues les macro commandes identiques
5) MULTEXAT, Rs
6) MULTEXAK, Rs
7) MULTEXQT, Rs
8) MULTEXQK, Rs tenant compte d'un paramètre dans un registre du module 140 non représenté, indiquant si les registres R03 - R00 du module 150 sont utilisés ou non.
9) MULTEXT, RS exécute une multiplication 68 x 68 bits de la façon suivante :
- place MUXO en position 1, RESET R0
- place l'entrée Z en haute impédence par le signal HI de la liaison 136
- place RBNO [0..32] | RBN1 [0..1] en entrée X du circuit 1500 en positionnant DEMUX en configuration d'entrées 00
( (a) figure 3)
- place MUX2 en configuration d'entrées 2 mettant les registres R00-R03 en entrée Y du circuit 1500
- place DEMUXl en configuration d'entrée 0 ((h) figure 3)
- déclenche le circuit multiplieur 1500
- range le résultat dans RO
- place RBN1[2..31] | RRSUB[0..3] en entrée X du circuit multiplieur, le démultiplexeur DEMUX étant en position 01
( (c) de commande des bus en figure 3)
- déclenche le circuit multiplieur 1500
- range le résultat final O[35..100] dans le registre Q0|Q1.
Le paramètre RS permet en plus d'effectuer un décalage de Rs bits des bits stockés dans les registres R00 - R03.
Le fonctionnement du système va maintenant être expliqué .
Lorsqu'un message m subit une application de cryptage
110 de paramètres n, e nécessitant une opération de multiplication modulaire de module N entre deux opérandes A et B, l'application 110 transmet ces paramètres par le bus
121 à la fonction de multiplication 120 qui transmet, avec une cadence déterminée par l'horloge 160 et dans un ordre correspondant à celui imposé par le compteur ordinal 126, les pseudo-instructions PI sur les registres du module de registre à décalage 140 et les macrocommandes MC du module de multiplication 150 vers l'interpréteur 130, alors que les pseudo-instructions affectant la fonction de branchement du compteur ordinal sont rebouclées sur le compteur ordinal lui-même.
Les paramètres A, B, N sont stockés dans les registres
175, 174 et 173 du module 140 par les bus 141, en une suite de mots de t bits, prêts à être transmis en parallèle mais par fractions de t bits sur le bus 151 B et 151 A vers le module de multiplication 150.
L'interpréteur 130 exécute les pseudo-instructions PI et les macro commandes MC qu'il reçoit, et dans le même
ordre, à l'aide des mémoires 131 et 132 contenant leur interprétation en langage machine.
Ainsi, une traduction de la boucle j interne de l'algorithme (5) en pseudo-code, sans le calcul de Q, peut être : for j = 1 to j = size - 2 MULTEXQT
U[J] = RkO;
U[J+1] = Rkl; RBO ≈ B[J+2];
RB1 = B[J+3];
MULTEXAK
RUO = U[J+2],
RN1 = N[J+3], end for
Dans cet exemple, la multiplication modulaire de la boucle interne est exécutée en deux sous phases, une de réduction partielle par MULTEXQT, une de multiplication partielle par MULTEXAK, chacune d'une durée pouvant être de deux cycles .
En référence à l'algorithme (5), le circuit multiplieur 150 est utilisé alternativement pour le produit modulaire QNj et pour le produit modulaire Ai Bj et, suivant le cas, Ai ou Q est chargé (Al|A0 ou Ql|Q0) en fonction de la configuration d'entrée du multiplexeur MUX2 commandée par le signal A|Q de la liaison 136 et le résultat temporaire MSB (0[32..97] est rangé dans le registre RI ou R0 pour le calcul suivant alors que le résultat partiel LSB (O[0..31] est rangé après la deuxième sous-phase dans les registres Rkl|Rk0. Ces registres
Rkl | RkO sont ensuite envoyés par le canal du bus 152 (U) au module mémoire 140 pour y être concaténé aux résultats partiels précédents et, en fin de concaténation complète, fournir le résultat A.B modulo N à l'application de cryptage 110 par la liaison 122.
Plus précisément, en référence à la figure 6, puisque les sous-phases de réduction et de multiplication sont entrelacées, l'opérande Y du circuit de multiplication 1500 reçoit, selon la commande A/Q appliquée sur le multiplexeur MUX2 les données binaires de l'un des deux registres de 64 bits pour (A1/A0) et de 66 bits pour (Q1/Q0) , registres qui sont chargés à partir du module 140 en simultanéité avec l'exécution d'une sous-phase. L'opérande X reçoit soit Bj soit Nj (B0 ou N0 et Bl ou NI) de 32 bits sauf dans le cas particulier ou le démultiplexeur DEMUX est actif. L'opérande C reçoit soit RI soit R0 , toujours selon la commande A/Q, tandis que l'opérande Z reçoit alternativerment la partie LSB d'une multiplication précédente Uj (Rtl/RtO) et le résultat partiel d'une boucle j précédente (RUl/RUO) suivant la commande t/U, de la liaison 136, appliquée au multiplexeur MUXl. Dans la boucle j, ligne (10) de l'algorithme (5), la macro commande MULTEXQT est exécutée alors que
(XI | X0) = N0 (Zl | Z0) = U0
Y = Q1|Q0
C = RO précédent soit T pQO . La partie LSB (O[0..31]0du produit N0 (Ql|Q0) (X1|X0) Y est rangée dans RtO, et sa partie MSB (0[32..97], dans TmpQO, comme indiqué sur la figure 6 par les flèches Φ et ©. Alors sont chargés pour multiplication
(X3|X2) = NI (Z3|Z2) = Ul
Y = Q0|Q1 C = TmpQO La partie LSB (O[0..31] du résultat (X3|X2)Y de la multiplication N1(Q1|Q0)) est ici rangée dans Rtl et sa partie MSB (0[32..97]) dans TmpQl comme indiqué par les flèches © et © sur la figure 6.
Les résultats temporaires Rk0|Rkl, qui sont les mêmes résultats que Rtθ|Rtl, sont sauvegardés dans Uj|Uj+ι. Les registres du circuit multiplieur sont à nouveau chargés pour exécution de la macro commande MULTEXAK de la façon suivante : (X1|X0) = B0 (Zl|Z0) = RtO précédent
Y = (Al|A0)
C = TmpAO précédent .
La partie LSB du résultat est rangée dans le registre
RkO. La partie MSB du résultat est rangée dans le registre
TmpAO .
Alors sont chargés pour multiplication
(X3 |X2) = Bl
(Z3|Z2) = Rtl précédent Y = (Al|A0)
C = TmpAO
La partie LSB du résultat est rangée dans le registre
Rkl
La partie MSB du résultat est rangée dans le registre TmpAl
On obtient ainsi le résultat de calcul de la boucle interne j . Il suffit ensuite de dérouler cette boucle interne p fois en faisant cette fois varier l'indice i.
C'est ce qui a été fait, par exemple, dans la liste de pseudo-code montrée sur la figure 7, mettant en œuvre l'option de conception ©, dans laquelle la boucle i contient
1) une séquence {l} d'initialisation des registres Q0, Ql et R00, ROI, R02, R03 du module 150, la macro commande MULTEXT caculant Ql|Q0,
2) une séquence {2} d'initialisation des registres RI, RtO, Rtl, RkO, Rkl par un premier produit A.B effectué par la macro commande MULTEXAK puis des registres RBNO, RBN1, RUO, RUl de ce même module, 3) la boucle j déjà vue précédemment,
4) une opération de réduction de fin de boucle i dans laquelle on calcule le quotient Q {4} avant de l'appliquer
{5} sur un dernier calcul partiel de A.B.
Le procédé et la mise en œuvre selon 1 ' invention ainsi décrite permet de doubler le gain de vitesse d'exécution de
1 ' algorithme RSA.
On a montré la réalisation d'un système cryptoprocesseur à 32 bits en utilisant un processeur du type RISC (reduced instruction set computer) , mais on aurait pu tout aussi bien concevoir de mettre en œuvre le procédé de l'invention en utilisant un processeur de 16 bits ou de 64 bits.