Jetons PKCS # 11: génération de paires de clés et non-extractibilité des clés privées (suite)

imageDans l'article précédent «Jetons PKCS # 11: certificats et clés privées », nous avons examiné comment associer de maniÚre unique le trio certificat x clé publique x clé privée stockée sur le token / carte à puce avec l'interface PKCS # 11 v.2.40. Dans cet article, nous parlerons de la génération de paires de clés. Nous nous appuierons, comme la derniÚre fois, sur «GOST R 34.10-2012 Information Technology. Sécurité des informations cryptographiques. Les processus de formation et de vérification des signatures numériques électroniques . »

Qu'est-ce qu'une paire de clés?


La paire de clés comprend deux clés:

  • / /Private key — , . / ;

  • / / Public key — , , .

Il convient de rappeler que les clĂ©s privĂ©es et publiques ne sont pas seulement leurs valeurs (pour la clĂ© publique GOST R 34.10-2001, elle est de 512 bits), mais aussi les paramĂštres du schĂ©ma de signature numĂ©rique (article 5.2 de GOST R 34.10-2012 ). À l'avenir, pour simplifier, nous appellerons les paramĂštres du schĂ©ma de signature numĂ©rique les paramĂštres (cryptoparamĂštres) de la paire de clĂ©s.

La clé publique de la signature est calculée comme la valeur d'une fonction de la clé privée, mais la connaissance de la clé publique rend impossible la détermination de la clé privée.

Pour les paires de clés GOST R 34.10-2001 et GOST R 34.10-2012 avec une longueur de clé privée de 256 bits (respectivement, une clé publique est de 512 bits), les paramÚtres cryptographiques suivants sont définis:
  1. id-GostR3410-2001-CryptoPro-A-ParamSet;
  2. id-GostR3410-2001-CryptoPro-B-ParamSet;
  3. id-GostR3410-2001-CryptoPro-C-ParamSet;
  4. id-GostR3410-2001-CryptoPro-XchA-ParamSet;
  5. id-GostR3410-2001-CryptoPro-XchB-ParamSet.

Pour les paires de clés GOST R 34.10-2012 avec une longueur de clé privée de 512 bits (respectivement, une clé publique est de 1024 bits), les paramÚtres cryptographiques suivants sont définis ("Technologies de l'information. Protection cryptographique des informations. ParamÚtres de courbe elliptique pour les algorithmes et protocoles cryptographiques"):
  1. id-tc26-gost-3410-2012-512-paramSetA;
  2. id-tc26-gost-3410-2012-512-paramSetB.

La composition des cryptoparamÚtres est définie dans la clause 5.2 de GOST R 34.10-2012 . Cette structure comprend un q premier - l'ordre du sous-groupe du groupe de points de la courbe elliptique:

image

Et il détermine la longueur de la clé privée / publique et l'exactitude de la clé privée:

image- la longueur de la clé privée est de 256 bits;

image- La longueur de la clé privée est de 512 bits.
Et donc, la clé publique est obtenue à partir de la clé privée.

Et d'oĂč vient la clĂ© privĂ©e?


Pour obtenir une clé privée, vous devez d'abord décider de la durée de la clé privée (256 ou 512 bits), puis décider des paramÚtres cryptographiques de la paire de clés. Maintenant, nous prenons le capteur de nombre aléatoire et obtenons un nombre aléatoire de la longueur correspondante. En fait, ce nombre aléatoire devrait devenir la valeur d de la clé privée (clé de signature d). Cette valeur doit satisfaire la rÚgle suivante:

0 <d <q , oĂč q est un nombre premier parmi les cryptoparamĂštres.

Et si cette condition n'est pas remplie? Si d == 0 , alors générez simplement un nouveau nombre aléatoire. Sinon, il suffit de prendre le reste de la division par entier de la valeur de d , qui dépasse q , parq (d% q) . Le reste deviendra la valeur de la clé privée.

C'est pourquoi le régulateur (FSB de Russie) fait des demandes spéciales sur le capteur de nombre aléatoire.

Comme exemple de la source principale pour remplir le tampon:

  • les nombres alĂ©atoires comprennent:
  • registre TSC du processeur - compteur d'horloge du processeur;
  • Compteur horaire GTC
  • compteur d'incrĂ©mentation automatique dans un thread sĂ©parĂ©;
  • fonction standard rand ();
  • coordonnĂ©es de la souris.

Comme sources supplĂ©mentaires pour remplir ce tampon peuvent ĂȘtre:

  • Le compteur de processus en mode utilisateur;
  • Minuterie haute rĂ©solution Windows.

Ainsi, pour que la carte Ă  puce / jeton PKCS # 11 gĂ©nĂšre une paire de clĂ©s Ă  l'intĂ©rieur d'elle-mĂȘme, il est nĂ©cessaire d'avoir une carte Ă  jeton / Ă  puce avec un capteur de nombre alĂ©atoire matĂ©riel intĂ©grĂ© qui rĂ©pond aux exigences du contrĂŽleur. Et ce n'est qu'alors que nous pourrons parler de la non-suppression de la clĂ© privĂ©e.

Pour générer une paire de clés, la fonction C_GenerateKeyPair est utilisée . En fonction de la paire de clés (avec quelle longueur de clé privée est de 256 ou 512 bits) que nous générons, le mécanisme approprié y sera utilisé:

  • CKM_GOSTR3410_KEY_PAIR_GEN pour une paire de clĂ©s avec une clĂ© privĂ©e de 256 bits;
  • CKM_GOSTR3410_512_KEY_PAIR_GEN pour une paire de clĂ©s avec une clĂ© privĂ©e de 512 bits.

Lors de la génération d'une paire de clés, ses attributs sont définis, par exemple, les paramÚtres cryptographiques:

image

Nous nous intéressons aux attributs de récupération de clé privée.


Il s'agit auparavant de l'attribut CKA_SENSITIVE, qui est chargĂ© d'obtenir la valeur de la clĂ© privĂ©e. Si la valeur de l'attribut CKA_SENSITIVE est dĂ©finie sur CK_TRUE, la clĂ© privĂ©e ne peut pas ĂȘtre extraite du jeton en clair. Le deuxiĂšme attribut CKA_EXTRACTABLE vous permet d'obtenir la clĂ© privĂ©e sous forme cryptĂ©e. Pour ce faire, il doit ĂȘtre dĂ©fini sur CK_TRUE.

La définition de l'attribut CKA_SENSITIVE sur CK_TRUE et l'attribut CKA_EXTRACTABLE sur CK_FALSE lors de la génération de la paire de clés rendent la clé privée complÚtement irrécupérable. La possibilité de déterminer si la clé est exportable est disponible dans le navigateur Redfox:

image

Quelqu'un dira - et si nous modifions les valeurs de ces attributs. En rĂšgle gĂ©nĂ©rale, cela ne peut pas ĂȘtre fait, la protection ne peut pas ĂȘtre abaissĂ©e, tout comme «vous ne pouvez pas abaisser le degré». De la mĂȘme maniĂšre, vous pouvez rendre la clĂ© privĂ©e non rĂ©cupĂ©rable aprĂšs son importation dans le token (Ă  moins bien sĂ»r que le token / carte Ă  puce autorise l'importation). AprĂšs avoir créé (ou pendant la crĂ©ation) l'objet CKO_PRIVATE_KEY, vous devez dĂ©finir CKA_SENSITIVE = CK_TRUE et l'attribut CKA_EXTRACTABLE = CK_FALSE .

Dans ce dernier cas (lors de l'importation), il convient de garder à l'esprit que bien que la clé privée soit devenue non récupérable, elle est apparue de cÎté (par exemple, à partir de PKCS # 12 ), et il n'y a aucune garantie qu'il n'y a pas de doublon ailleurs.

Et ici, il ne ferait pas de mal de vous rappeler, cher lecteur, quela sĂ©curitĂ© n'est assurĂ©e que par un COMPLEXE de mesures organisationnelles et techniques . Par consĂ©quent, cela ne fonctionnera pas pour combler les trous dans la sĂ©curitĂ© de l'organisation au dĂ©triment des moyens techniques et vice versa - tout devrait ĂȘtre coordonnĂ© organiquement. Y compris, lors de l'accĂšs Ă  la valeur de la clĂ© privĂ©e.

Assurez-vous que le jeton / la carte Ă  puce contient des objets PKCS # 11 Ă  part entiĂšre (CKO_PRIVATE_KEY, CKO_PUBLIC_KEY, CKO_CERTIFICATE) qui sont impliquĂ©s dans les opĂ©rations cryptographiques sur le jeton lui-mĂȘme Ă  l'aide de l'utilitaire p11conf disponible en tĂ©lĂ©chargement gratuit:

$ /usr/local/bin64/p11conf -h
usage:  /usr/local/bin64/p11conf [-hitsmIupPred] -A APIpath [-c slotID -U userPin -S SOPin -n newPin -L label]
        -h display usage
        -i display PKCS#11 library info
        -s display slot(s) info (-c slotID is optional)
        -t display token(s) info (-c slotID is optional)
Others must use -c slotID
        -m display mechanism list
        -I initialize token 
        -u initialize user PIN
        -p set the user PIN
        -P set the SO PIN
        -r remove all objects
        -e enumerate objects
        -d dump all object attributes
Copyright(C) 2011-2016
$

Pour voir quels objets sont sur le jeton, il suffit d'exécuter une commande du formulaire:

bash-4.3$ /usr/local/bin64/p11conf -A /usr/local/lib64/libls11sw2016.so -c 0 -e
Enter user PIN: ********
Token objects:
1: CKO_PRIVATE_KEY
         label: 'LS11SW2016:; ..;0x23855(145493)'
2: CKO_PUBLIC_KEY
         label: 'LS11SW2016:; ..;0x23855(145493)'
3: CKO_CERTIFICATE
         label: 'LS11SW2016:; ..;0x23855(145493)'


OK
bash-4.3$

Si de tels objets sont absents sur le jeton et qu'ils disent que le jeton PKCS # 11 avec la clé non extractible est utilisé, alors ce n'est probablement pas le cas. Le jeton est probablement utilisé simplement comme un lecteur flash avec un code PIN, et le certificat et les clés sont stockés en tant qu'objets CKO_DATA .

Et enfin, pour voir non seulement quels types d'objets sont stockĂ©s sur le jeton, mais des objets avec tous les attributs, vous devez utiliser l'indicateur –d en plus :

bash-4.3$ /usr/local/bin64/p11conf -A /usr/local/lib64/libls11sw2016.so -c 0 –e -d
Enter user PIN: ********
Token objects:
1: CKO_PRIVATE_KEY
	 label: 'LS11SW2016:; ..;0x23855(145493)'
==================================
Object handle: 0x1
----------------------------------
CKA_CLASS
0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
CKA_TOKEN
0x01, 
CKA_PRIVATE
0x01, 
CKA_LABEL
0x4c, 0x53, 0x31, 0x31, 0x53, 0x57, 0x32, 0x30, 
0x31, 0x36, 0x3a, 0xd0, 0x9e, 0xd0, 0x9e, 0xd0, 
0x9e, 0x20, 0xd0, 0x9b, 0xd0, 0x98, 0xd0, 0xa1, 
0xd0, 0xa1, 0xd0, 0x98, 0x2d, 0xd0, 0xa1, 0xd0, 
0xbe, 0xd1, 0x84, 0xd1, 0x82, 0x3b, 0xd0, 0x9c, 
0xd0, 0xb0, 0xd1, 0x81, 0xd0, 0xbb, 0xd0, 0xbe, 
0x20, 0xd0, 0x90, 0x2e, 0xd0, 0x90, 0x2e, 0x3b, 
0x30, 0x78, 0x32, 0x33, 0x38, 0x35, 0x35, 0x28, 
0x31, 0x34, 0x35, 0x34, 0x39, 0x33, 0x29, 
CKA_VALUE: attribute sensitive
CKA_KEY_TYPE
0x03, 0x10, 0x32, 0xd4, 0x00, 0x00, 0x00, 0x00, 
CKA_SUBJECT
0x30, 0x81, 0x9b, 0x31, 0x0b, 0x30, 0x09, 0x06, 
0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x52, 0x55, 
0x31, 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 
0x03, 0x0c, 0x11, 0xd0, 0x9c, 0xd0, 0xb0, 0xd1, 
0x81, 0xd0, 0xbb, 0xd0, 0xbe, 0x20, 0xd0, 0x90, 
0x2e, 0xd0, 0x90, 0x2e, 0x31, 0x1c, 0x30, 0x1a, 
0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x13, 0xd0, 
0x9b, 0xd0, 0x98, 0xd0, 0xa1, 0xd0, 0xa1, 0xd0, 
0x98, 0x2d, 0xd0, 0xa1, 0xd0, 0xbe, 0xd1, 0x84, 
0xd1, 0x82, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x09, 
0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 
0x01, 0x16, 0x10, 0x61, 0x6d, 0x61, 0x73, 0x6c, 
0x6f, 0x76, 0x40, 0x6c, 0x69, 0x73, 0x73, 0x69, 
0x2e, 0x72, 0x75, 0x31, 0x31, 0x30, 0x2f, 0x06, 
0x03, 0x55, 0x04, 0x08, 0x0c, 0x28, 0x35, 0x30, 
0x20, 0x20, 0xd0, 0x9c, 0xd0, 0xbe, 0xd1, 0x81, 
0xd0, 0xba, 0xd0, 0xbe, 0xd0, 0xb2, 0xd1, 0x81, 
0xd0, 0xba, 0xd0, 0xb0, 0xd1, 0x8f, 0x20, 0xd0, 
0xbe, 0xd0, 0xb1, 0xd0, 0xbb, 0xd0, 0xb0, 0xd1, 
0x81, 0xd1, 0x82, 0xd1, 0x8c, 0x20, 
CKA_ID
0x97, 0x46, 0x4e, 0xcc, 0x7c, 0xa9, 0xea, 0xb1, 
0x0a, 0xda, 0xec, 0x10, 0xf4, 0x49, 0x7e, 0x7f, 
0x2d, 0x71, 0x4b, 0xa7, 
CKA_SENSITIVE
0x01, 
. . .
CKA_GOSTR3410_PARAMS
0x06, 0x09, 0x2a, 0x85, 0x03, 0x07, 0x01, 0x02, 
0x01, 0x02, 0x01, 
CKA_GOSTR3411_PARAMS
0x06, 0x08, 0x2a, 0x85, 0x03, 0x07, 0x01, 0x01, 
0x02, 0x03, 
CKA_GOST28147_PARAMS
0x06, 0x07, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x1f, 
0x01, 


OK
bash-4.3$

Tout ce qui est dit ici est valable pour un token / carte Ă  puce avec interface PKCS # 11, y compris un token cloud.

En conclusion, nous rappelons que les jetons / cartes Ă  puce avec interface PKCS # 11 sont largement utilisĂ©s dans les projets Mozilla (navigateurs, clients de messagerie), dans les navigateurs Chrome de Google et d'autres projets. Si nous parlons de la Russie, les jetons / cartes Ă  puce avec interface PKCS # 11 sont utilisĂ©s avec succĂšs pour accĂ©der au portail des services d'État.

Source: https://habr.com/ru/post/fr400943/


All Articles