AES256 CBC + HMAC SHA256 assurant la confidentialité * et * l'authentification?
Je suis en train de penser à l'aide de AES256-CBC + HMAC SHA-256 comme un bloc de construction pour les messages qui assure à la fois la confidentialité et l'authentification.
En particulier, d'envisager ce scénario:
- Alice est en possession d'une clé publique appartenant à Bob (l'échange de clé et d'un algorithme est en dehors de la portée de cette question). Alice a une identification de la clé K, a également partagé avec Bob, qu'elle peut utiliser pour s'identifier avec. Seulement Alice et Bob connaît la clé K.
- Alice crypte (nonce || K) à l'aide de la clé publique de Bob.
- Bob déchiffre le paquet et a maintenant a K et nonce.
- Bob utilise l'algorithme SHA-256 avec SHA256(K || nonce) pour donner un K(e) de 256 bits.
- Bob utilise l'algorithme SHA-256 avec SHA256(K || nonce + 1) pour donner un K(s) de 256 bits.
Maintenant, pour chaque paquet de Bob veut envoyer Alice, il effectue les opérations suivantes:
- Créer une nouvelle aléatoire de 128 bits IV
- Crypte le message avec la IV et K(e) comme clé.
- Crée un SHA-256 HMAC avec K(s) et (IV || message Crypté) en tant que données.
- Enfin envoie (IV || HMAC || Cryptogramme) à Alice
Alice a également calculé K(e) et K(s), et suit la procédure suivante lors de la réception de données à partir de Bob:
- Diviser le message en IV, texte chiffré et HMAC.
- Calculer le HMAC à l'aide de K(s), IV et chiffré.
- Comparer HMAC avec le HMAC envoyé. Si cela correspond, Alice considère ce message authentifié comme un message envoyé par Bob, sinon il est éliminé.
- Alice déchiffre le message à l'aide de K(e)
N'présent protocole s'assurer que Alice déchiffre uniquement les messages de Bob, en supposant que nul autre que Bob peut lire le message crypté qu'Alice envoie lui chiffré à l'aide de sa clé publique?
I. e. ne des messages construits de cette manière d'assurer à la fois la confidentialité et l'authentification?
Remarque: Si le protocole exige Bob envoyer plusieurs messages, ce système a besoin d'une légère modification pour éviter les attaques de relecture.
P. S. je suis conscient de l'AES-GCM/CCM, mais ce schéma serait de travailler avec la base AES, SHA et HMAC algorithmes que l'on trouve dans la plupart des crypto paquets. Cette solution pourrait également être plus lent, mais qui est aussi en dehors de la portée de la question.
source d'informationauteur Nuoji
Vous devez vous connecter pour publier un commentaire.
Fondamentalement, vous recréez SSL/TLS. Cela implique les mises en garde habituelles à propos de la construction de votre propre protocole, et vous êtes chaleureusement encouragés à utiliser TLS avec une bibliothèque existante au lieu de réécrire votre propre.
Cela étant dit, l'utilisation d'AES avec radio-canada pour le chiffrement, et HMAC pour l'intégrité, la est son. Il y a des combinés de chiffrement+intégrité modes (que vous connaissez), et de la CBC+HMAC est une sorte de "vieille école", mais il ne peut pas faire de mal. On fait les choses dans la "science-approuvé ğ: crypter, puis MAC de la chiffré chaîne (et ne pas oublier le IV: l'oubli de la IV est la classique erreur).
Votre de dérivation de clé peut être un peu faible. Il est parfait si SHA-256 se comporte comme un parfait hasard oracle, mais il est connu que SHA-256 n' pas se comporter comme un oracle aléatoire (à cause de la soi-disant de la longueur d'extension de l'attaque). Il est similaire à la raison pour laquelle l'algorithme HMAC est HMAC, imbriquées fonction de hachage invocations, au lieu d'une simple hachage (une fois) la concaténation de la clé MAC et les données. TLS utilise un spécifique de la fonction de dérivation de clé (qui est appelé "le PRF" dans le TLS spécification), ce qui devrait éviter tout désagrément. Cette fonction est construite sur SHA-256 (en fait, plus de HMAC/SHA-256) et peut être mis en œuvre autour de n'importe quel SHA-256 de mise en œuvre.
(Je ne dis pas que je sais comment attaquer votre clé processus de dérivation; seulement c'est une chose la plus délicate à faire correctement, et que sa sécurité peut être évalué qu'après des années de contrôle de centaines de cryptographes. C'est pourquoi la réutilisation de fonctions et protocoles qui ont déjà été examinées à fond est fondamentalement une bonne idée.)
Dans TLS il y a deux nonces, appelé le "client aléatoire" et le serveur "aléatoire". Dans votre proposition, vous n'avez le client "aléatoire". Ce que vous perdez ici, de la sécurité, est une sorte de flou. Une prudente stratégie serait d'inclure un serveur aléatoire (c'est à dire d'autre pour l'instant choisi par Bob). Le genre de choses que nous voulons éviter, c'est quand Alice et Bob exécuter le protocole dans les deux directions, et un attaquant flux des messages d'Alice de Alice elle-même. L'analyse complète de ce qu'est un attaquant pourrait faire est complexe (c'est une branche de la cryptographie); en général, les nonces dans les deux directions ont tendance à éviter certains problèmes.
Si vous envoyez plusieurs paquets, alors vous pouvez avoir quelques questions sur la perte de paquets, les paquets dupliqués ("rejeu"), et les paquets arrivant de l'ordre. Dans le contexte de TLS, cela ne devrait "normalement" se produire parce que TLS est utilisé sur un support qui assure d'ores et déjà (dans des conditions normales, sans compter les attaques actives) que les données sont transférées dans un ordre strict. Ainsi, TLS comprend un numéro de séquence dans les données, ce qui va dans le MAC. Cela permettrait de détecter toute modification d'un attaquant, inclure le replay, la perte de dossiers et enregistrement de la réorganisation. Si possible, vous devez également utiliser un numéro de séquence.
La réponse à la question est non, il n'y a aucune garantie que Alice déchiffre uniquement les messages de Bob, mais c'est seulement parce que vous n'avez pas stipuler que seulement Bob sait K. Si Alice et Bob sont les deux seules personnes qui savent Kpuis le nœud de la question est de savoir si votre clé de génération de protocole est son. (Nous ne pouvons ignorer le reste, je crois, parce que vous êtes tout simplement à l'aide de l'algorithme HMAC-SHA256 et AES256 comme ils sont destinés à être utilisés.)
La génération de protocole n'est pas mauvais, mais il peut être amélioré. La façon de créer des clés de secrets partagés est d'utiliser un "fonction de dérivation de clé". Utilisez ces fonctions de hachage dans une manière similaire à ce que vous avez fait ici, mais ils sont également volontairement lent pour inhiber les attaques par force brute. PBKDF2 semble être ce que vous souhaitez, comme il l'a) peut tirer de 512 bits de données clés (ou plus), et b) peut être constitué de l'primitives, vous disposez, à savoir, SHA256 et HMAC-SHA256.
Si vous ne voulez pas utiliser de l'ICP, jetez un oeil à TLS-PSK. Il semblerait pour résoudre le problème précis à résoudre vous-même. Voir la RFC 4279 (et 5487 pour plus d'ciphersuites).