web-dev-qa-db-fra.com

Pourquoi le chiffrement asymétrique est-il moins efficace que le chiffrement symétrique?

Il est de notoriété publique que le chiffrement asymétrique est en général beaucoup plus cher à calculer que le chiffrement symétrique, donc la pratique courante consiste à utiliser le chiffrement asymétrique pour établir une clé symétrique pour l'échange de données en masse. Cependant, je ne trouve aucune information sur la durée exacte du ralentissement.

Donc, en supposant que j'ai un petit morceau de données X (disons une valeur de hachage de 256 bits), et que je choisis des algorithmes cryptographiques modernes raisonnables, quel est le coût relatif approximatif à calculer

  • X chiffré sous une clé publique
  • X chiffré sous une clé symétrique
  • H (X), H étant une fonction de hachage cryptographique
13
Izz

Cela dépend de l'algorithme. Surtout avec la cryptographie asymétrique, les vitesses varient énormément. Vous voudrez peut-être consulter eBACS pour une analyse comparative plus détaillée et indépendante de la machine de diverses primitives de chiffrement. Comme toujours, vous devez effectuer votre propre benchmark sur votre propre système pour savoir exactement à quoi vous attendre sur un système de production dans les conditions choisies.

Vous ne devez jamais utiliser de chiffrement asymétrique pour chiffrer quoi que ce soit directement. Si vous cryptez autre chose qu'une clé, vous pouvez courir le risque de rendre la cryptanalyse possible. Par exemple, RSA n'aime pas crypter les données non aléatoires. C'est très bien lorsque vous cryptez une clé (ce qui est aléatoire, après tout), mais pas si vous cryptez ASCII. Cité de ne autre réponse (accentuez le mien):

RSA a quelques contraintes opérationnelles. Avec la variante la plus utilisée (celle connue sous le nom de PKCS # 1 v1.5), si la taille de la clé RSA est de "1024 bits" (ce qui signifie que la composante mathématique centrale de la paire de clés est un entier de 1024 bits), alors RSA peut chiffrer un message d'une longueur maximale de 117 octets et génère un message chiffré d'une longueur de 128 octets. Cette taille limitée et l'augmentation de la taille lors du cryptage sont des conséquences inévitables de la structure mathématique du processus de cryptage RSA. En raison de ces contraintes, nous ne chiffrons généralement pas les données directement avec RSA; à la place, nous sélectionnons une petite séquence d'octets aléatoires, que nous appelons clé de session. Nous chiffrons la clé de session avec RSA; puis nous utilisons la clé de session avec un algorithme de chiffrement symétrique pour traiter l'ensemble du message. C'est ce qu'on appelle le cryptage hybride.

Le chiffrement d'une petite quantité de données avec un chiffrement symétrique ne vous permettra pas de bénéficier autant de sa vitesse plus élevée. La plupart des chiffrements symétriques ont un certain coût d'installation unique appelé programme de clés , où la clé est traitée et divisée en sous-clés distinctes pour chaque composant du chiffrement, ou répartie entre les états internes du chiffrement. Ces sous-clés sont généralement mises en cache afin qu'elles puissent être utilisées directement chaque fois que le chiffrement est appelé. Chaque fois qu'une nouvelle clé est utilisée, la planification des clés est exécutée et doit se terminer avant que tout ne puisse être chiffré. Certains chiffrements ont des horaires clés très coûteux, tels que Blowfish , dont le calendrier clé équivaut à 521 chiffrements Blowfish nécessitant 4 Ko de RAM et est la base de la lenteur - bcrypt fonction. D'autres ont des horaires de clé très simples, comme THÉ qui divise simplement la clé et la mélange avec des constantes. Lorsque vous êtes En chiffrant une grande quantité de données avec une seule clé, vous pouvez bénéficier davantage de la vitesse d'un chiffrement rapide que si vous chiffrez des données en petits morceaux de manière indépendante.


Un repère rapide sur un système bas de gamme (Pentium III, 1 GHz) à charge moyenne est ci-dessous. Notez que ces benchmarks ne montrent que la vitesse de ces algorithmes sur cette machine spécifique. Il peut être précis dans un ordre de grandeur, mais une machine plus rapide avec des capacités différentes peut non seulement être plus rapide, la vitesse relative des algorithmes individuels peut être différente! Mais pour avoir une idée ...

RSA, avec différentes tailles:

 OpenSSL> vitesse rsa 
 ... 
 Signe vérifier signe/s vérifier/s*
 rsa 512 bits 0,001305s 0,000113s ​​766,2 8881,1 
 rsa 1024 bits 0,007685s 0,000372s 130,1 2687,5 
 rsa 2048 bits 0,050615s 0,001355s 19,8 738,1 
 rsa 4096 bits 0,353636s 0,005201s 2,8 192,3 

AES, avec différentes tailles de clés et longueurs d'entrée:

 OpenSSL> speed aes 
 ... 
 Les 'nombres' sont en milliers d'octets par seconde traités. 
 Type 16 octets 64 octets 256 octets 1024 octets 8192 octets 
 aes-128 cbc 21174.71k 23656.67k 24212.96k 39798.65k 40800.k 
 aes-192 cbc 18706.23k 20713.58k 21222.25k 34669.23k 35059.k 
 aes-256 cbc 16153,38 k 17569,97 k 18004,69 k 30170,76 k 30020.k 

SHA-256, avec différentes longueurs d'entrée:

 OpenSSL> speed sha256 
 ... 
 Les 'nombres' sont en milliers d'octets par seconde traités. 
 Type 16 octets 64 octets 256 octets 1024 octets 8192 octets 
 sha256 6537.11k 14781.14k 26256.93k 32630.49k 34562.k

* Dans le manuel RSA, la vérification de signature est identique au chiffrement et la signature est identique au déchiffrement. La vérification consiste à déterminer si se ≡ m (mod n), alors que le cryptage est en cours d'exécution c ≡ me (mod n). Dans le monde réel, il y a différences importantes impliquant des opérations de remplissage spéciales nécessaires pour éviter que RSA ne soit brisé de manière triviale.


Je suppose que vous vous demandez pourquoi il y a cette différence de performances. La raison est liée au fonctionnement de ces primitives cryptographiques. Une explication de base des chiffrements asymétriques, des chiffrements symétriques et des fonctions de hachage, ainsi que de ce qui influence leurs performances, est ci-dessous.

Les chiffres asymétriques impliquent ce que l'on appelle problèmes de dureté . Ce sont des problèmes ouverts en mathématiques qui exploitent le fait qu'une opération est facile à effectuer dans une direction, mais difficile à opérer en sens inverse sans valeur secrète. RSA utilise le fait qu'il est trivial de multiplier deux énormes nombres premiers ensemble, mais prohibitivement difficile de factoriser le nombre composite résultant dans les nombres premiers d'origine sans au moins l'un des nombres premiers d'origine. Pour manuel RSA , le cryptage du message m nécessite que vous calculiez c ≡ me (mod n). Pour déchiffrer c, calculez m ≡ c (mod n). Ici, n est le produit des deux nombres premiers secrets, p et q, et d est l'inverse modulaire de e (un exposant public qui est souvent choisi pour être Fermat prime ), où d est obtenu en calculant d ≡ e-1 mod (p - 1) (q - 1).

Les chiffres asymétriques peuvent varier énormément en vitesse car ils impliquent tous des concepts mathématiques différents. Même des chiffres distincts qui utilisent les mêmes concepts (tels que RSA et le Rabin cryptosystem ) peuvent varier en vitesse. Ces algorithmes sont souvent si lents car ils nécessitent de fonctionner sur de très grands nombres à la fois, ce qui est difficile pour nos processeurs modernes qui ne peuvent traiter efficacement que les nombres 64 bits (ou quelques fois plus, jusqu'à 512 bits pour les CPU les plus récents, lorsque des optimisations spéciales sont utilisées). L'arithmétique modulaire en particulier est triviale lorsqu'elle implique des entiers 64 bits sur un processeur 64 bits, mais est très inefficace lorsque des nombres massifs de 2048 bits sont impliqués.

Les chiffrements symétriques sont de deux types: chiffrements de flux et chiffrements de blocs*. Les chiffrements de flux utilisent la clé pour générer un flux déterministe sans fin d'octets pseudo-aléatoires (le flux de clés). Ce flux est combiné avec du texte en clair pour former un texte chiffré. Le déchiffrement implique la même opération, combinant le flux de clés avec le texte chiffré pour obtenir le texte en clair. Un chiffrement de bloc, d'autre part, prend une clé et l'utilise pour permuter une entrée d'un bloc fixe, produisant un bloc de texte chiffré de la même taille. Un chiffrement par bloc peut être exécuté en sens inverse avec la même clé pour déchiffrer le texte chiffré. Les chiffres de bloc doivent être exécutés dans un mode de fonctionnement pour chiffrer en toute sécurité plus d'un seul bloc de données avec une clé. Certains modes permettent des implémentations parallèles. D'autres doivent être sérialisés, tandis que d'autres peuvent encore être parallélisés pour le chiffrement mais pas le déchiffrement, ou vice versa.

Les chiffres symétriques sont très rapides car ils n'impliquent que de la confusion (la sortie ne donne aucune indication sur l'entrée ou la clé) et la diffusion (un petit changement dans l'entrée ou la clé provoque un changement drastique dans la sortie). Contrairement aux chiffrements asymétriques qui agissent généralement sur des nombres massifs, les chiffrements symétriques impliquent un grand nombre d'opérations dépendantes de clés très simples, répétées plusieurs fois. Chaque opération est suffisamment petite pour être calculée efficacement par un processeur. En particulier, les chiffres utilisant le schéma ARX (comme Salsa20) ne nécessitent que des ajouts, des rotations et des opérations XOR sur de très petits morceaux de données de taille Word, qui peuvent être mis en œuvre de manière extrêmement efficace sur les processeurs.

Les fonctions de hachage sont très similaires aux chiffres symétriques et impliquent les mêmes concepts de confusion et de diffusion. En fait, les fonctions de hachage sont parfois utilisées pour créer des chiffres, et vice versa. Cela peut être vu avec Salsa20, un chiffrement de flux qui utilise un hachage en son cœur, et Whirlpool, une fonction de hachage qui utilise une version modifiée d'AES. Une fonction de hachage prend une entrée de taille effectivement illimitée et génère un résumé de taille fixe. Comme un chiffrement, la confusion empêche un attaquant de apprendre quoi que ce soit à propos de l'entrée de la sortie, et la diffusion amplifie les petits changements à l'entrée.

Les hachages sont souvent plus lents que les chiffres symétriques car ils ont des exigences plus strictes. En particulier, les hachages doivent non seulement empêcher un attaquant d'inverser l'opération (une attaque de pré-image) et de modifier une entrée sans que le hachage ne change (une deuxième attaque de pré-image), il doit également rendre difficile la génération d'une paire d'entrées qui créent la même chose. hachage (une attaque par collision). Être résistant aux collisions est difficile et nécessite généralement un hachage assez lent et complexe. Pour le mettre en perspective, un attaquant peut entrer en collision le hachage MD4 horriblement cassé avec moins d'effort qu'il n'en faut pour invoquer la fonction deux fois. Même encore, la meilleure attaque de pré-image est purement théorique.

* Le chiffrement du chiffrement de flux est C = P ⊕ EK et le déchiffrement est P = C ⊕ EK [~ # ~] p [~ # ~] est en clair, [~ # ~] c [~ # ~] est texte chiffré et EK est le flux de clés généré avec la clé [~ # ~] k [~ # ~]. Pour un chiffrement par bloc, le chiffrement est C = EK(P) et le déchiffrement est P = DK(C) pour un seul bloc de [~ # ~] p [~ # ~] et [~ # ~] c [~ # ~]. Un mode de fonctionnement est nécessaire pour traiter plus d'un seul [~ # ~] p [~ # ~] ou [~ # ~] c [~ # ~] donné un seul [~ # ~] k [~ # ~].

 Lorsque vous utilisez une fonction de hachage pour construire un chiffrement ou vice versa, les propriétés de sécurité exigées du hachage sont différentes. Par exemple, Salsa20 est un chiffrement de flux sécurisé malgré le fait qu'il est construit à partir d'une fonction de hachage qui manque de résistance aux collisions . De même, un hachage construit à partir d'un chiffrement nécessite le chiffrement doit être sécurisé contre les attaques par clé associée, ce qui n'est pas nécessairement requis pour un chiffrement sécurisé à lui seul.

14
forest