Public-Key Cryptography Standards #5

La norme Public-Key Cryptography Standards #5 (PKCS#5) présente les algorithmes de cryptage, décryptage, signature et de vérification d'une signature d'un message à partir d'une clé privée ou publique et d'un mot de passe complémentaire.

Par souci de sécurité forte :

Pour plus de précisions sur les conventions concernant la paire de clés privée et publique ((D, N), (E, N)), merci de se référer à la fiche Public-Key Infrastructure (PKI).

Algorithmes utilisés par Up ! Security Manager

Contexte

Les algorithmes utilisent un contexte composé de la constante et du type global suivant :

Constante
/*******/


Type ClePki Defaut
/****************/
Fin Type

Générateur PBKDF1

Les paramètres du générateur de clé dérivée PBKDF1 sont les suivants :

/****************************************************************/
Procedure GenererCleDeriveeRsa1(MotDePasse : Binaire, Salt : Binaire, NbIterations : Entier, SousJacent : ModeSignatureFlux, TailleCleDerivee : Entier, CleDerivee : Binaire Sortie)
/* Objet : Genere la cle derivee - PBKDF1. */
/****************************************************************/
Variable
/******/


Debut
/* Ouverture du flux concatene MotDePasse||Salt. */
T[0]=IFlux(FluxBinaire(MotDePasse,1));
T[1]=IFlux(FluxBinaire(Salt,1));
F=FluxConcatene(T);
/* Calcul de T(1)=H(MotDePasse||Salt). */
CalculerSignature(SousJacent,IFlux(F),Signature);
Pour I=1 JusquA NbIterations-1 Faire Fin Pour
/* Recupere la cle derivee. */
CleDerivee=Signature.Gauche(TailleCleDerivee);
Fin Procedure

Générateur PBKDF2

Les paramètres du générateur de clé dérivée PBKDF2 sont les suivants :

/****************************************************************/
Procedure GenererCleDeriveeRsa2(MotDePasse : Binaire, Salt : Binaire, NbIterations : Entier, SousJacent : ModeSignatureFlux, TailleCleDerivee : Entier, CleDerivee : Binaire Sortie)
/* Objet : Genere la cle derivee - PBKDF2. */
/****************************************************************/
Variable
/******/


Debut
/* Calcul de la taille de la signature. */
TailleSignature=CalculerTailleSignature(SousJacent);
/* Calcul de L et R. */
R=TailleCleDerivee%TailleSignature;
Si R!=0 Alors Sinon Fin Si
CleDerivee=Binaire();
Pour I=1 JusquA L Faire Fin Pour
Fin Procedure

Cryptage PBES1

Les paramètres du cryptage PBES1 sont les suivants :

/****************************************************************/
Procedure CrypterRsaPbes1(MotDePasse : Binaire, Salt : Binaire, NbIterations : Entier, CryptageSousJacent : ModeCryptageFlux, SignatureSousJacent : ModeSignatureFlux, BufferEntree : Binaire, BufferSortie : Binaire Sortie)
/* Objet : Crypte un binaire en Rsa - PBES1. */
/****************************************************************/
Variable
/******/


Debut
/* Calcul de DK=PBKDF1(MotDePasse,Salt,NbIterations,16). */
GenererCleDeriveeRsa1(MotDePasse,Salt,NbIterations,SignatureSousJacent,16,CleDerivee);
/* Extraction de K et IV tel que DK=K||IV. */
Cle=CleDerivee.Gauche(8);
VecteurInitialisation=CleDerivee.Droite(8);
/* Calcul de PS. */
TailleRemplissage=BufferEntree.Longueur()%8;
Si TailleRemplissage==0 Alors Fin Si
Remplissage=Binaire(TailleRemplissage,TailleRemplissage);
/* Ouverture du flux concatene M||PS. */
T[0]=IFlux(FluxBinaire(BufferEntree,1));
T[1]=IFlux(FluxBinaire(Remplissage,1));
F=FluxConcatene(T);
/* Calcul de C=Crypter(M||PS). */
Selon CryptageSousJacent Faire Fin Selon
Fin Procedure

Décryptage PBES1

Les paramètres du décryptage PBES1 sont les suivants :

/****************************************************************/
Procedure DecrypterRsaPbes1(MotDePasse : Binaire, Salt : Binaire, NbIterations : Entier, CryptageSousJacent : ModeCryptageFlux, SignatureSousJacent : ModeSignatureFlux, BufferEntree : Binaire, BufferSortie : Binaire Sortie)
/* Objet : Décrypte un binaire en Rsa - PBES1. */
/****************************************************************/
Variable
/******/


Debut
/* Calcul de DK=PBKDF1(MotDePasse,Salt,NbIterations,16). */
GenererCleDeriveeRsa1(MotDePasse,Salt,NbIterations,SignatureSousJacent,16,CleDerivee);
/* Extraction de K et IV tel que DK=K||IV. */
Cle=CleDerivee.Gauche(8);
VecteurInitialisation=CleDerivee.Droite(8);
/* Calcul de EM=Decrypter(C). */
Selon CryptageSousJacent Faire Fin Selon
/* Recuperation du message. */
TailleEM=EM.Longueur();
BufferSortie=EM.Gauche(TailleEM-EM[TailleEM-1]);
Fin Procedure

Cryptage PBES2

Les paramètres du cryptage PBES2 sont les suivants :

/****************************************************************/
Procedure CrypterRsaPbes2(MotDePasse : Binaire, Salt : Binaire, NbIterations : Entier, CryptageSousJacent : ModeCryptageFlux, SignatureSousJacent : ModeSignatureFlux, TailleCle : Entier, BufferEntree : Binaire, BufferSortie : Binaire Sortie)
/* Objet : Crypte un binaire en Rsa - PBES2. */
/****************************************************************/
Variable
/******/


Debut
Selon CryptageSousJacent Faire Fin Selon
TailleCleDerivee=TailleCle+TailleVecteurInitialisation;
/* Calcul de DK=PBKDF2(MotDePasse,Salt,NbIterations,TailleCleDerivee). */
GenererCleDeriveeRsa2(MotDePasse,Salt,NbIterations,SignatureSousJacent,TailleCleDerivee,CleDerivee);
/* Extraction de K et IV tel que DK=K||IV. */
Cle=CleDerivee.Gauche(TailleCle);
Si TailleVecteurInitialisation!=0 Alors Sinon Fin Si
/* Calcul de PS. */
TailleRemplissage=TailleBufferEntree%8;
Si TailleRemplissage!=0 Alors Fin Si
Remplissage=Binaire(TailleRemplissage,TailleRemplissage);
/* Ouverture du flux concatene M||PS. */
T[0]=IFlux(FluxBinaire(BufferEntree));
T[1]=IFlux(FluxBinaire(Remplissage));
F=FluxConcatene(T);
/* Calcul de C=Crypter(M||PS). */
Selon CryptageSousJacent Faire Fin Selon
Fin Procedure

Décryptage PBES2

Les paramètres du décryptage PBES2 sont les suivants :

/****************************************************************/
Procedure DecrypterRsaPbes2(MotDePasse : Binaire, Salt : Binaire, NbIterations : Entier, CryptageSousJacent : ModeCryptageFlux, SignatureSousJacent : ModeSignatureFlux, TailleCle : Entier, BufferEntree : Binaire, BufferSortie : Binaire Sortie)
/* Objet : Décrypte un binaire en Rsa - PBES2. */
/****************************************************************/
Variable
/******/


Debut
Selon CryptageSousJacent Faire Fin Selon
TailleCleDerivee=TailleCle+TailleVecteurInitialisation;
/* Calcul de DK=PBKDF2(MotDePasse,Salt,NbIterations,TailleCleDerivee). */
GenererCleDeriveeRsa2(MotDePasse,Salt,NbIterations,SignatureSousJacent,TailleCleDerivee,CleDerivee);
/* Extraction de K et IV tel que DK=K||IV. */
Cle=CleDerivee.Gauche(TailleCle);
Si TailleVecteurInitialisation!=0 Alors Sinon Fin Si
/* Calcul de EM=Decrypter(C). */
Selon CryptageSousJacent Faire Fin Selon
/* Recuperation du message. */
TailleEM=EM.Longueur();
BufferSortie=EM.Gauche(TailleEM-EM[TailleEM-1]);
Fin Procedure

Signature PBMAC1

Les paramètres de la signature PBMAC1 sont les suivants :

/****************************************************************/
Procedure SignerRsaPbmac1(MotDePasse : Binaire, Salt : Binaire, NbIterations : Entier, SousJacent : ModeSignatureFlux, TailleCle : Entier, BufferEntree : Binaire, BufferSignature : Binaire Sortie)
/* Objet : Signe un binaire en Rsa - PBMAC1. */
/****************************************************************/
Variable
/******/


Debut
/* Calcul de DK=PBKDF2(MotDePasse,Salt,NbIterations,TailleCleDerivee). */
GenererCleDeriveeRsa2(MotDePasse,Salt,NbIterations,SousJacent,TailleCle,Cle);
/* Appel de HMAC. */
SignerHmac(SousJacent,Cle,BufferEntree,BufferSignature);
Fin Procedure

Vérification de la signature PBMAC1

Pour cette vérification de signature de base, la taille du message est limitée à NbBits/8 octets.

/****************************************************************/
Fonction SignerRsaPbmac1(MotDePasse : Binaire, Salt : Binaire, NbIterations : Entier, SousJacent : ModeSignatureFlux, TailleCle : Entier, BufferEntree : Binaire, BufferSignature : Binaire Sortie) Retourner Booleen
/* Objet : Verifie la signature d'un binaire en Rsa - PBMAC1. */
/****************************************************************/
Variable
/******/


Debut
SignerRsaPbmac1(MotDePasse,Salt,NbIterations,SousJacent,TailleCle,BufferEntree,BufferSignature2);
Retourner BufferSignature==BufferSignature2;
Fin Fonction

Format utilisé par Up ! Security Manager

Le format Public-Key Cryptography Standards #5 (PKCS#5) du laboratoire Rsa spécifie le format d'échange des clés publiques ou privées.

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 #5 v2.0 ASN.1 Module
-- Revised March 25, 1999

-- This module has been checked for conformance with the
-- ASN.1 standard by the OSS ASN.1 Tools

PKCS5v2-0 {iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs-5(5) modules(16) pkcs5v2-0(1)}

DEFINITIONS ::= BEGIN

-- Basic object identifiers

rsadsi OBJECT IDENTIFIER ::= {iso(1) member-body(2) us(840) 113549}
pkcs OBJECT IDENTIFIER ::= {rsadsi 1}
pkcs-5 OBJECT IDENTIFIER ::= {pkcs 5}

-- Basic types and classes

AlgorithmIdentifier { ALGORITHM-IDENTIFIER:InfoObjectSet } ::= SEQUENCE


ALGORITHM-IDENTIFIER ::= TYPE-IDENTIFIER

-- PBKDF2

PBKDF2Algorithms ALGORITHM-IDENTIFIER ::= { {PBKDF2-params IDENTIFIED BY id-PBKDF2}, ...}

id-PBKDF2 OBJECT IDENTIFIER ::= {pkcs-5 12}

algid-hmacWithSHA1 AlgorithmIdentifier {{PBKDF2-PRFs}} ::= {algorithm id-hmacWithSHA1, parameters NULL : NULL}

PBKDF2-params ::= SEQUENCE
PBKDF2-SaltSources ALGORITHM-IDENTIFIER ::= { ... }

PBKDF2-PRFs ALGORITHM-IDENTIFIER ::= { {NULL IDENTIFIED BY id-hmacWithSHA1}, ... }

-- PBES1

PBES1Algorithms ALGORITHM-IDENTIFIER ::=
pbeWithMD2AndDES-CBC OBJECT IDENTIFIER ::= {pkcs-5 1}
pbeWithMD2AndRC2-CBC OBJECT IDENTIFIER ::= {pkcs-5 4}
pbeWithMD5AndDES-CBC OBJECT IDENTIFIER ::= {pkcs-5 3}
pbeWithMD5AndRC2-CBC OBJECT IDENTIFIER ::= {pkcs-5 6}
pbeWithSHA1AndDES-CBC OBJECT IDENTIFIER ::= {pkcs-5 10}
pbeWithSHA1AndRC2-CBC OBJECT IDENTIFIER ::= {pkcs-5 11}

PBEParameter ::= SEQUENCE
-- PBES2

PBES2Algorithms ALGORITHM-IDENTIFIER ::= { {PBES2-params IDENTIFIED BY id-PBES2}, ...}

id-PBES2 OBJECT IDENTIFIER ::= {pkcs-5 13}

PBES2-params ::= SEQUENCE
PBES2-KDFs ALGORITHM-IDENTIFIER ::= { {PBKDF2-params IDENTIFIED BY id-PBKDF2}, ... }

PBES2-Encs ALGORITHM-IDENTIFIER ::= { ... }

-- PBMAC1

PBMAC1Algorithms ALGORITHM-IDENTIFIER ::= { {PBMAC1-params IDENTIFIED BY id-PBMAC1}, ...}

id-PBMAC1 OBJECT IDENTIFIER ::= {pkcs-5 14}

PBMAC1-params ::= SEQUENCE
PBMAC1-KDFs ALGORITHM-IDENTIFIER ::= { {PBKDF2-params IDENTIFIED BY id-PBKDF2}, ... }

PBMAC1-MACs ALGORITHM-IDENTIFIER ::= { ... }

-- Supporting techniques

digestAlgorithm OBJECT IDENTIFIER ::= {rsadsi 2}
encryptionAlgorithm OBJECT IDENTIFIER ::= {rsadsi 3}

SupportingAlgorithms ALGORITHM-IDENTIFIER ::=
id-hmacWithSHA1 OBJECT IDENTIFIER ::= {digestAlgorithm 7}

desCBC OBJECT IDENTIFIER ::= {iso(1) identified-organization(3) oiw(14) secsig(3) algorithms(2) 7} -- from OIW

des-EDE3-CBC OBJECT IDENTIFIER ::= {encryptionAlgorithm 7}

rc2CBC OBJECT IDENTIFIER ::= {encryptionAlgorithm 2}

RC2-CBC-Parameter ::= SEQUENCE
rc5-CBC-PAD OBJECT IDENTIFIER ::= {encryptionAlgorithm 9}
RC5-CBC-Parameters ::= SEQUENCE
END