Aller au contenu principal

5. Primitives cryptographiques (Cryptographic Primitives)

Les primitives cryptographiques (Cryptographic Primitives) sont des opérations mathématiques de base à partir desquelles des schémas cryptographiques peuvent être construits. Elles sont destinées à être utilisées dans des implémentations matérielles ou comme modules logiciels, et ne sont pas destinées à fournir de la sécurité indépendamment des schémas.

Ce document spécifie quatre types de primitives, organisées par paires : chiffrement et déchiffrement (Encryption and Decryption); signature et vérification (Signature and Verification).

La spécification des primitives suppose que les entrées satisfont certaines conditions, en particulier que les clés publiques et privées RSA sont valides.

5.1. Primitives de chiffrement et de déchiffrement (Encryption and Decryption Primitives)

Une primitive de chiffrement (Encryption Primitive) produit un représentant de texte chiffré à partir d'un représentant de message sous le contrôle d'une clé publique, et une primitive de déchiffrement (Decryption Primitive) récupère un représentant de message à partir d'un représentant de texte chiffré sous le contrôle de la clé privée correspondante.

Une paire de primitives de chiffrement et de déchiffrement est utilisée dans les schémas de chiffrement définis dans ce document et est spécifiée ici : primitive de chiffrement RSA (RSAEP, RSA Encryption Primitive) / primitive de déchiffrement RSA (RSADP, RSA Decryption Primitive). RSAEP et RSADP impliquent la même opération mathématique, avec différentes clés en entrée. Les primitives définies ici sont les mêmes que la primitive de chiffrement par factorisation d'entiers utilisant RSA (IFEP-RSA) / primitive de déchiffrement par factorisation d'entiers utilisant RSA (IFDP-RSA) dans IEEE 1363 [IEEE1363] (à l'exception de l'ajout du support pour le RSA multi-premier), et sont compatibles avec PKCS #1 v1.5.

L'opération mathématique principale dans chaque primitive est l'exponentiation (Exponentiation).

5.1.1. RSAEP

RSAEP ((n, e), m)

Entrée (Input)

(n, e)   clé publique RSA
m représentant du message, un entier entre 0 et n - 1

Sortie (Output)

c        représentant du texte chiffré, un entier entre 0 et n - 1

Erreur (Error)

"message representative out of range" (représentant du message hors plage)

Hypothèse (Assumption)

La clé publique RSA (n, e) est valide

Étapes (Steps)

Étape 1. Si le représentant du message m n'est pas entre 0 et n - 1, sortir "message representative out of range" et arrêter.

Étape 2. Soit c = m^e mod n.

Étape 3. Sortir c.

5.1.2. RSADP

RSADP (K, c)

Entrée (Input)

K        clé privée RSA, où K a l'une des formes suivantes :
- paire (n, d)
- quintuplet (p, q, dP, dQ, qInv) et séquence éventuellement vide de triplets (r_i, d_i, t_i), i = 3, ..., u
c représentant du texte chiffré, un entier entre 0 et n - 1

Sortie (Output)

m        représentant du message, un entier entre 0 et n - 1

Erreur (Error)

"ciphertext representative out of range" (représentant du texte chiffré hors plage)

Hypothèse (Assumption)

La clé privée RSA K est valide

Étapes (Steps)

Étape 1. Si le représentant du texte chiffré c n'est pas entre 0 et n - 1, sortir "ciphertext representative out of range" et arrêter.

Étape 2. Le représentant du message m est calculé comme suit :

a. Si la première forme de K (n, d) est utilisée, soit m = c^d mod n.

b. Si la deuxième forme de K (p, q, dP, dQ, qInv) et (r_i, d_i, t_i) est utilisée, procéder comme suit :

i. Soit m_1 = c^dP mod p et m_2 = c^dQ mod q.

ii. Si u > 2, soit m_i = c^(d_i) mod r_i, i = 3, ..., u.

iii. Soit h = (m_1 - m_2) * qInv mod p.

iv. Soit m = m_2 + q * h.

v. Si u > 2, soit R = r_1 et pour i = 3 à u, exécuter :

  1. Soit R = R * r_(i-1).
  2. Soit h = (m_i - m) * t_i mod r_i.
  3. Soit m = m + R * h.

Étape 3. Sortir m.

Note : L'étape 2.b peut être réécrite comme une seule boucle, à condition que l'ordre de p et q soit inversé. Cependant, pour la cohérence avec PKCS #1 v2.0, les deux premiers nombres premiers p et q sont traités séparément des nombres premiers supplémentaires.

5.2. Primitives de signature et de vérification (Signature and Verification Primitives)

Une primitive de signature (Signature Primitive) produit un représentant de signature à partir d'un représentant de message sous le contrôle d'une clé privée, et une primitive de vérification (Verification Primitive) récupère un représentant de message à partir d'un représentant de signature sous le contrôle de la clé publique correspondante. Une paire de primitives de signature et de vérification est utilisée dans les schémas de signature définis dans ce document et est spécifiée ici : primitive de signature RSA version 1 (RSASP1, RSA Signature Primitive, version 1) / primitive de vérification RSA version 1 (RSAVP1, RSA Verification Primitive, version 1).

Les primitives définies ici sont les mêmes que la primitive de signature par factorisation d'entiers utilisant RSA version 1 (IFSP-RSA1) / primitive de vérification par factorisation d'entiers utilisant RSA version 1 (IFVP-RSA1) dans IEEE 1363 [IEEE1363] (à l'exception de l'ajout du support pour le RSA multi-premier), et sont compatibles avec PKCS #1 v1.5.

L'opération mathématique principale dans chaque primitive est l'exponentiation, comme dans les primitives de chiffrement et de déchiffrement de la section 5.1. RSASP1 et RSAVP1 sont identiques à RSADP et RSAEP, sauf pour les noms des paramètres d'entrée et de sortie ; ils sont distingués car ils sont utilisés à des fins différentes.

5.2.1. RSASP1

RSASP1 (K, m)

Entrée (Input)

K        clé privée RSA, où K a l'une des formes suivantes :
- paire (n, d)
- quintuplet (p, q, dP, dQ, qInv) et séquence éventuellement vide de triplets (r_i, d_i, t_i), i = 3, ..., u
m représentant du message, un entier entre 0 et n - 1

Sortie (Output)

s        représentant de signature, un entier entre 0 et n - 1

Erreur (Error)

"message representative out of range" (représentant du message hors plage)

Hypothèse (Assumption)

La clé privée RSA K est valide

Étapes (Steps)

Étape 1. Si le représentant du message m n'est pas entre 0 et n - 1, sortir "message representative out of range" et arrêter.

Étape 2. Le représentant de signature s est calculé comme suit :

a. Si la première forme de K (n, d) est utilisée, soit s = m^d mod n.

b. Si la deuxième forme de K (p, q, dP, dQ, qInv) et (r_i, d_i, t_i) est utilisée, procéder comme suit :

  1. Soit s_1 = m^dP mod p et s_2 = m^dQ mod q.
  2. Si u > 2, soit s_i = m^(d_i) mod r_i, i = 3, ..., u.
  3. Soit h = (s_1 - s_2) * qInv mod p.
  4. Soit s = s_2 + q * h.
  5. Si u > 2, soit R = r_1 et pour i = 3 à u, exécuter :
    • a. Soit R = R * r_(i-1).
    • b. Soit h = (s_i - s) * t_i mod r_i.
    • c. Soit s = s + R * h.

Étape 3. Sortir s.

Note : L'étape 2.b peut être réécrite comme une seule boucle, à condition que l'ordre de p et q soit inversé. Cependant, pour la cohérence avec PKCS #1 v2.0, les deux premiers nombres premiers p et q sont traités séparément des nombres premiers supplémentaires.

5.2.2. RSAVP1

RSAVP1 ((n, e), s)

Entrée (Input)

(n, e)   clé publique RSA
s représentant de signature, un entier entre 0 et n - 1

Sortie (Output)

m        représentant du message, un entier entre 0 et n - 1

Erreur (Error)

"signature representative out of range" (représentant de signature hors plage)

Hypothèse (Assumption)

La clé publique RSA (n, e) est valide

Étapes (Steps)

Étape 1. Si le représentant de signature s n'est pas entre 0 et n - 1, sortir "signature representative out of range" et arrêter.

Étape 2. Soit m = s^e mod n.

Étape 3. Sortir m.