Digital Signature Standard
Algorithme utilisé par Up ! Security Manager
L'algorithme Digital Signature Standard (DSS) du Federal Information
Processing Standards (FIPS) a pour principe de calculer une signature à partir d'une paire de clés (ClePublique, ClePrivee) et d'un algorithme de signature d'un flux binaire ou texte H. La signature est une paire de deux grands nombres (R, S).
Cette signature permet par exemple d'attester l'intégrité du contenu d'un fichier, d'un enregistrement d'une base de données, d'un message échangé, etc. parce qu'il est pratiquement impossible que deux contenus distincts produisent la même signature.
Voici le protocole de signature qui s'appelle Digital Signature Algorithm (DSA):
- Le signataire se procure sa paire de clés (ClePublique, ClePrivee) auprès du référentiel - Elle lui est unique.
- Le signataire signe le message M avec la clé privé ClePrivee pour obtenir la signature (R, S).
- Le signataire transmet au destinataire le message M, la clé publique ClePublique et la signature (R, S).
- Le destinatinataire vérifie l'authenticité et l'intégrité du message avec la clé publique ClePublique.
Ainsi :
- Si les signatures sont différentes alors les contenus sont différents.
- Si les contenus sont identiques alors les signatures sont identiques.
- Si les contenus sont différents alors les signatures sont très certainement différentes.
Voici l'algorithme DSS :
- Génération de la paire de clés.
La clé est caractérisée par un nombre de bits NbBits compris entre 512 et 2048 et multiple de 64.
Pour générer une nouvelle paire de clés, il faut :
- Tirer aléatoirement P, un nombre premier de taille NbBits bits.
- Tirer aléatoirement Q, un nombre premier de taille 159 bits tel que Q divise
P-1
.
- Tirer aléatoirement H2, un nombre entier tel que
H2^((P-1)/Q) % P > 1
avec 1 < H2 < Q-1
.
- Calculer G, un nombre entier tel que
G=H2^((P-1)/Q) % P > 1
.
- Tirer aléatoirement X, un nombre entier tel que
0 < X < Q
.
- Tirer aléatoirement Y, un nombre entier tel que
0 < Y < Q
.
La clé publique ClePublique est (P, Q, G, Y).
La clé privée ClePrivée est (X).
- Signature du message.
Pour le signer le message M, il faut :
- Tirer aléatoirement K, un nombre entier tel que
0 < K < Q
.
- Calculer R, un nombre entier tel que
R=(G^K % P) % Q
.
- Calculer S, un nombre entier tel que
R=(K^-1*Binaire(H(M))+X*R) % Q
.
La signature est (R, S).
- Vérification de la signature du message.
Pour vérifier la signature du message M, il faut :
- Calculer W, un nombre entier tel que
W=S^-1 % Q
.
- Calculer U1, un nombre entier tel que
U1=(Binaire(H(M))*W) % Q
.
- Calculer U2, un nombre entier tel que
U2=R*W % Q
.
- Calculer V, un nombre entier tel que
V=(G^U1*Y^U2 % P) % Q=((G^U1 % P)*(Y^U2 % P) % P) % Q
.
- Vérifier que
V==R
.
La conversion d'une chaine d'un binaire issu de l'algorithme de signature sous-jacent H s'effectue par transfert direct des octets en Little endian.