Voici le principe de cette méthode trouvée par Diffie et Hellman :
Type ClePki Defaut
/****************/
NbBits : Entier;
Fin Type
L : Entier;
P : Nul Ou Decimal;
G : Nul Ou Decimal;
X : Nul Ou Decimal;
Y : Nul Ou Decimal;
SK : Nul Ou Decimal;
Constructeur();
/******************************************************************/
Fonction GenererClePkiKsa1(NbBits : Entier, L : Entier) Retourner Nul Ou ClePki
/* Objet : Genere une cle de Pki pour Ksa. */
/******************************************************************/
Variable
/******/
Cle : Nul Ou ClePki;
NbBits2 : Entier;
Debut
/* Fabrique la cle de Pki. */
Cle=ClePki();
ClePki->NbBits=NbBits;
ClePki->L=L;
/* Tire aleatoirement P. */
Cle.P=Aleatoire(NbBits,Vrai);
/* Tire aleatoirement G. */
TantQue Vrai Faire
NbBits2=Aleatoire();
Fin TantQue
Si NbBits2>NbBits Alors
NbBits2%=NbBits;
Fin Si
Si NbBits2==0 Alors
Continuer;
Fin Si
Cle.G=Aleatoire(NbBits,Vrai);
Arreter;
/* Tire aleatoirement X tel que 2^(L-1) < X < 2^L. */
Cle.X=Aleatoire(L-1,0);
/* Calcul de Y=G^X mod P. */
Cle.Y=ExponentiationModulaire(Cle.G,Cle.X,Cle.P);
Retourner Cle;
Fin Fonction
/******************************************************************/
Procedure GenererClePkiKsa2(Cle : Nul Ou ClePki, Y : Nul Ou Decimal)
/* Objet : Genere une cle de Pki pour Ksa. */
/******************************************************************/
Debut
/* Calcul de SK=Y^X mod P. */
Cle.SK=ExponentiationModulaire(Y,Cle.X,Cle.P);
Fin Procedure
La norme utilisée utilisée est Abstract Syntax Notation One (ASN.1) de l'International Telecommunication Union (ITU) compilée en Basic Encoding Rules (BER).
pkcs-3 OBJECT IDENTIFIER ::= { iso(1) member-body(2) US(840) rsadsi(113549) pkcs(1) 3 }
dhKeyAgreement OBJECT IDENTIFIER ::= { pkcs-3 1 }
DHParameter ::= SEQUENCE
{
prime INTEGER, -- p
base INTEGER, -- g
privateValueLength INTEGER OPTIONAL -- l
}