Quel est le nombre maximal d'octets pour chiffrer un message en clair à l'aide de RSA qui est raisonnablement sécurisé et également efficace et AES serait-il meilleur pour la même taille en octets? Soit dit en passant, le cryptage ne doit pas être public, je me demande simplement si AES est aussi bon sur un court message que sur un gros document. Fondamentalement, le message ou le document serait envoyé crypté mais la clé ne serait jamais rendue publique. Je suppose que cela irait également à l'encontre du but de RSA, mais j'ai lu plusieurs fois en ligne que RSA est bon pour les messages courts et AES est bon pour les longs.
RSA, tel que défini par PKCS # 1 , chiffre les "messages" de taille limitée. Avec le "remplissage v1.5" couramment utilisé et une clé RSA de 2048 bits, la taille maximale des données pouvant être chiffrées avec RSA est de 245 octets. . Pas plus.
Lorsque vous "cryptez des données avec RSA", dans la pratique, vous cryptez réellement une clé symétrique aléatoire avec RSA, puis cryptez les données avec un algorithme de cryptage symétrique, qui n'est pas limité en taille. Voici comment cela fonctionne en SSL , S/MIME , OpenPGP ... Régulièrement, certains les gens suggèrent de faire "RSA uniquement" en divisant le message d'entrée en morceaux de 245 octets et en les chiffrant chacun plus ou moins séparément. C'est une mauvaise idée car:
Lors du chiffrement de données avec un chiffrement par bloc symétrique, qui utilise des blocs de n bits, certains problèmes de sécurité commencent à apparaître lorsque la quantité de données chiffrées avec une seule clé se rapproche de 2n/2 blocs, c'est-à-dire n * 2n/2 bits. Avec AES, n = 128 (AES-128, AES-192 et AES-256 utilisent tous des blocs de 128 bits). Cela signifie une limite de plus de 250 millions de téraoctets, ce qui est suffisamment grand pour ne pas être un problème. C'est précisément pourquoi AES a été défini avec des blocs de 128 bits, au lieu des blocs de 64 bits les plus courants (à l'époque): de sorte que la taille des données est pratiquement illimitée.
Comparer directement les deux, c'est un peu comme comparer un tracteur à un train - ce sont tous les deux des véhicules mais leur fonction et leur construction sont complètement différentes.
RSA est un chiffre asymétrique. Il est idéal pour l'échange sécurisé de messages sur un réseau non fiable, car la clé publique peut être connue de tous - un message chiffré avec la clé publique ne peut être déchiffré que par la clé privée. Ainsi, si deux parties connaissent les clés publiques de l'autre, elles peuvent échanger des messages en toute sécurité. Cela signifie qu'aucune information secrète ne doit être transmise - tant que authenticité et intégrité sont maintenus, vous êtes en sécurité. Heureusement, RSA fournit une méthode pour générer signatures sur les données, ce qui permet de prouver leur authenticité. Étant donné un message signé par une clé privée, il est possible de vérifier cette signature en utilisant la clé publique correspondante.
En règle générale, vous ne pouvez chiffrer que des données aussi volumineuses que la longueur de la clé RSA. Donc, si vous avez une clé RSA 4096 bits, vous ne pouvez chiffrer que les messages d'une longueur maximale de 4096 bits. Non seulement cela, mais c'est incroyablement lent. RSA n'est pas conçu comme un chiffrement de transport de données à grande vitesse.
AES est un chiffrement par bloc symétrique et est incroyablement rapide. Le texte en clair est divisé en blocs appelés blocs, et chaque bloc est crypté dans une chaîne. Il existe différentes façons de le faire, mais une méthode courante est appelée Cipher Block Chaining, ou CBC pour faire court. Cela permet des tailles de message théoriquement infinies. Cependant, des chiffres symétriques comme AES nécessitent d'abord l'échange d'une clé secrète. Contrairement à RSA, la clé partagée doit rester inconnue des attaquants, vous devez donc fournir authenticité, intégrité et confidentialité. C'est difficile à faire directement.
Ce que vous aurez tendance à trouver, c'est que les deux schémas sont implémentés ensemble, de sorte que RSA est utilisé pour échanger la clé contre un chiffrement de bloc comme AES:
Cela répond à quelques exigences:
En termes de nivea de sécurité, cela n'a pas vraiment de sens de comparer RSA et AES. Ils font des tâches différentes. Nous actuellement supposons que les clés AES 128 bits sont sûres et que les clés RSA 2048 bits sont sûres, mais cela dépend entièrement des exigences de sécurité individuelles. L'utilisation de clés AES 256 bits et RSA 4096 bits devrait être plus que suffisante pour la prochaine décennie, en supposant que la mise en œuvre est saine.
Notez que tout cela est une simplification, car il y a beaucoup de mises en garde et de détails impliqués, et la description et l'échange RSA comme "cryptage" n'est pas strictement correct, mais dans l'ensemble, cela devrait être un aperçu de haut niveau raisonnable de la façon dont le deux types de travaux cryptographiques.
L'une des raisons pour lesquelles vous ne voyez normalement pas RSA utilisé pour de plus grandes quantités de données est à cause des performances - RSA et AES sont sécurisés pour les grandes et petites quantités de données (lorsqu'elles sont implémentées correctement), mais RSA est beaucoup plus lent.
Dans les cas où la cryptographie à clé publique est logique, mais plus de performances sont nécessaires, un système hybride peut être mis en œuvre qui exploite les deux.
Selon le package de cryptographie GoLang "Le message ne doit pas dépasser la longueur du module public moins 11 octets". http://golang.org/pkg/crypto/rsa/#EncryptPKCS1v15
AES est un algorithme à clé symétrique. RSA est asymétrique. Bien que les deux soient destinés au cryptage, ils sont souvent utilisés de différentes manières, il est donc difficile de les comparer en termes d'efficacité ou de force, car le but de l'utilisation de l'un par rapport à l'autre serait probablement un déterminant plus important dans lequel l'une ou la classe de le cryptage est utilisé.
Vous voudrez peut-être commencer par cette autre question: Cryptage - dois-je utiliser RSA ou AES?