La génération des paramètres Diffie Hellman dans OpenSSL peut être effectuée comme suit:
$ openssl dhparam -out dh2048.pem 2048
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
[...]
Le "générateur 2" y a retenu mon attention. Il semble que je puisse choisir entre les générateurs 2 et 5 comme indiqué par la page de manuel (man dhparam
):
-2, -5 The generator to use, either 2 or 5. 2 is the default. If present then the input file is ignored and parameters are generated instead.
Diffie-Hellman fonctionne dans un sous-groupe d'entiers modulo a prime p. A savoir, vous avez un générateur g, qui est un modulo entier conventionnel p. Ce générateur a un ordre r qui est le plus petit entier positif tel que gr = 1 mod p. Les deux systèmes qui s'engagent dans DH choisissent les clés privées a et b respectivement comme entiers dans une plage donnée, et les clés publiques DH correspondantes (qu'ils échangent sur le fil) sont gune mod p et gb mod p.
DH est sécurisé tant que:
La valeur exacte du générateur g n'a pas d'importance, tant que les deux parties utilisent la même valeur. On peut montrer que si quelqu'un peut calculer un logarithme discret relativement à un générateur g, il peut le calculer aussi facilement relativement à n'importe quel générateur g ' du même sous-groupe. Ainsi, ce qui compte, c'est l'ordre du sous-groupe, pas le générateur. Vous pouvez utiliser 2 ou 5, cela ne changera pas la sécurité.
L'utilisation d'un générateur court présente de (légers) avantages pour les performances, c'est pourquoi ils sont préférés. La différence de performances entre 2 et 5 sera cependant négligeable. Dans certains protocoles, le générateur est convenu au niveau du protocole, c'est-à-dire qu'il n'est pas transmis sur le fil; il est codé en dur dans les deux systèmes. Certains protocoles imposent donc l'utilisation de 2, d'autres veulent utiliser 5, pour des raisons historiques et traditionnelles. OpenSSL, en tant que bibliothèque polyvalente, peut générer des paramètres pour les deux cas.
Il y a cependant des détails . Il peut être difficile de s'assurer que le générateur choisi a bien un ordre avec un diviseur premier suffisamment grand. Par défaut, openssl dhparam
va générer un soi-disant "nombre premier sûr", c'est-à-dire qu'il génère des nombres premiers aléatoires q jusqu'à ce qu'il en trouve un tel que p = 2q + 1 soit également un entier premier. L'ordre de tout g modulo q est toujours un diviseur de p-1. Ainsi, en utilisant un nombre premier sûr, OpenSSL est garanti que l'ordre r de tout générateur g dans le 2..p-2 range (en particulier 2 et 5) sera égal à q ou 2q, donc toujours un multiple de q, qui est un nombre premier assez grand.
Si OpenSSL a généré un p aléatoire sans s'assurer qu'il s'agissait d'un "nombre premier sûr", alors l'ordre réel de g = 2 ou 5 serait difficile à calculer exactement (cela impliquerait la factorisation p-1, ce qui coûte cher).
Dans certains contextes non DH, à savoir l'algorithme de signature DSA, il faut avoir un sous-groupe de type DH tel que l'ordre du générateur soit exactement égal à un nombre premier non trop grand donné = q, au lieu d'être simplement un multiple de q. Dans ce cas, OpenSSL (avec le -dsaparam
commutateur de ligne de commande) générera d'abord q, puis p = qt + 1 pour les valeurs aléatoires de t jusqu'à ce qu'un nombre premier soit trouvé; et le générateur sera obtenu en prenant un s modulo p aléatoire et en calculant g = st modulo p (cela donne nécessairement soit 1 soit un entier de commande exactement q). Lors de la production de paramètres DSA, le générateur ne peut pas être facilement (ou pas du tout) forcé à être un petit entier spécifique comme 2 ou 5. Pour DSA, le générateur est "gros".
Qu'est-ce que le générateur 2 et 5?
Comprendre cela nécessite une certaine formation mathématique. Diffie-Hellmann fonctionne sur groupes cycliques. Ces groupes ont tous en commun qu'il y a au moins un générateur, c'est-à-dire un élément qui peut être utilisé pour générer tous les autres éléments du groupe.
Regardons un exemple:
Z_11 *: Ensemble d'entiers i = 0,1, ..., 10 pour lesquels gcd (i, 11) = 1. Il s'agit d'un groupe abélien sous multiplication modulo 11.
Générateur: a = 2
a^1 = 2 mod 11,
a^2 = 4 mod 11,
a^3 = 8 mod 11,
a^4 = ( 16 =) 5 mod 11,
a^5 = ( 32 =) 10 mod 11,
a^6 = ( 64 =) 9 mod 11,
a^7 = ( 128 =) 7 mod 11,
a^8 = ( 256 =) 3 mod 11,
a^9 = ( 512 =) 6 mod 11,
a^10 = (1024 =) 1 mod 11
Comme vous pouvez le voir, nous avons généré tout le groupe, c'est-à-dire que nous avons chaque élément comme résultat. Notez cependant que cela fonctionnera sur toutes sortes de groupes, et n'est pas limité au groupe multiplicatif d'entiers modulo p.
Comment le fait de choisir 5 au lieu de 2 affecte-t-il la sécurité?
Non, le problème Diffie-Hellman concerne la taille du groupe cyclique, pas les éléments qui génèrent le groupe . Ainsi, lorsque les deux éléments sont des générateurs pour un groupe, cela ne fait aucune différence. Le choix de 2 comme générateur présente cependant deux avantages, car vous pouvez implémenter les algorithmes sous-jacents plus efficacement.
Personnellement, je ne changerais pas la valeur par défaut ici, sauf s'il y a une très bonne raison de le faire. Ce n'est évidemment pas le cas, sinon vous n'auriez pas à demander;).
Est-ce spécifique à OpenSSL?
Non, cela découle des mathématiques des groupes cycliques eux-mêmes.