Utilisation de la cryptographie à clé publique avec plusieurs destinataires

Nov 26 2020

J'ai un message que je souhaite envoyer à plusieurs destinataires.

Puis-je chiffrer le message séparément avec chacune des clés publiques du destinataire, puis envoyer le message ainsi chiffré au destinataire respectif?

Si un attaquant obtient tous les messages chiffrés et sait que tous ont le même contenu mais sont chiffrés avec des clés différentes, cela facilitera-t-il l'attaque?

Et si l'attaquant parvient à déchiffrer l'un des messages ou obtient le texte en clair par d'autres moyens, cela compromettrait-il l'une des autres clés privées?

Existe-t-il une forme de cryptage asymétrique qui fonctionnerait mieux que d'autres dans ce scénario?

Réponses

10 kelalaka Nov 26 2020 at 14:30

Vous n'avez pas précisé les détails de votre méthode à analyser, cependant, la méthode habituelle n'est pas purement basée sur le cryptage avec cryptographie à clé publique, mais plutôt sur un cryptosystème hybride , où la clé symétrique est transférée avec la cryptographie à clé publique et la clé est utilisé dans la cryptographie à clé symétrique.

Avec RSA

Disons que nous voulons envoyer le message $m$ à $n$ les parties ont chacune $pub_i$ et $prv_i$ clés (utilisez RSA avec OAEP).

Maintenant, générez une clé AES256 aléatoire uniforme $k$ et cryptez le message avec AES-GCM,

$$(c,tag) = \operatorname{AES-GCM-Enc}(k,IV,m)$$

Cryptez maintenant le $k$ Pour chacun $$\bar k = \operatorname{RSA-OAEP-Enc}(pub_i,k)$$ et envoyer à chaque utilisateur $(\bar k, c, IV, tag)$. Désormais, chaque utilisateur peut obtenir la clé individuellement$k$ et décrypter le message.

La faiblesse est qu'un observateur peut voir que vous avez envoyé le même message à tous. Pour atténuer ce problème, si nécessaire, utilisez un IV différent par utilisateur. Notez que cela augmentera le temps de cryptage.

Autres candidats

RSA-KEM

Ce qui précède était l'utilisation directe du RSA. Normalement, on peut opter pour RSA-KEM (en bref ci-dessous, tous les détails ici )

  • Générer un aléatoire $r \in [1,n-1]$ et utilisez HKDF pour dériver une clé.
  • Crypter le message avec AES-GCM à l'aide de la clé dérivée
  • envoyer le $r$ avec le manuel-RSA avec le $(c,tag)$

NaCL

NaCl a des solutions existantes pour cela; le cryptage authentifié

Schéma de chiffrement intégré (IES)

Integrated Encryption Scheme (IES) a également une version à courbe multiplicative et elliptique.

Dans la version courbe elliptique ECIES, il existe tout d'abord des accords sur

  • les paramètres de la courbe elliptique $(q,n,b,G,n,h)$
  • Fonction de dérivation de clé (KDF)
  • Code d'authentification de message comme HMAC-SHA256 (ou utilisez directement AES-GCM ou ChaCha20-Poly1305)
  • chaque utilisateur a $x_i$ comme clé privée et clé publique $P_i = [x_i]G$

Ensuite, le message peut être envoyé comme

  1. L'expéditeur génère un entier aléatoire $r \in [1,n-1]$ Et mettre $R = [r]G$

  2. Laisser $P=(x(P),y(P)) = [r]P_i$ et assurez-vous que $P \neq \mathcal{O}$

  3. Laisser $S = x(P)$

  4. Dériver la clé de chiffrement AES256$$k = \operatorname{HKDF}(S)$$

  5. Cryptez avec AES-GCM ou ChaCha20Poly1305.

    $$(c,tag) = \operatorname{AES-GCM-Enc}(k,IV,m)$$

  6. Envoyer $(R,c,IV,tag)$

Du côté du décryptage

  1. Calculer $P = [x_i]R$ en raison de $$P = [x_i]R=[x_i r]G =[r x_i] G = [r]P_i $$ comme préparé
  2. Laisser $S = x(P)$
  3. Dériver la clé de chiffrement AES256$$k = \operatorname{HKDF}(S)$$
  4. Décrypter $$(m,\perp) = \operatorname{AES-GCM-Dec}(k,IV,c,tag)$$N'acceptez jamais une balise incorrecte, arrêtez $(\perp)$?

WhatsApp

WhatsApp utilise une idée similaire .


Remarque: si possible, j'irais pour le NaCL

3 user10216038 Nov 26 2020 at 16:30

Existe-t-il une forme de cryptage asymétrique qui fonctionnerait mieux que d' autres dans ce scénario?

L'ancien GPG prend déjà en charge cette fonctionnalité.

Vous pouvez ajouter autant de paramètres de nom - -recipient que vous le souhaitez. Cela fonctionne de la même manière que la méthode décrite par kelalaka, mais il est déjà intégré à GPG.

2 Ángel Nov 27 2020 at 01:54

J'ai un message que je souhaite envoyer à plusieurs destinataires.

Bien

Puis-je crypter le message séparément avec chacune des clés publiques du destinataire,

En fait, quand on parle de chiffrer un message à l'aide de sa clé publique, c'est une simplification et on utilise une cryptographie mixte. Le message est chiffré à l'aide d'un algorithme symétrique (tel qu'AES) avec une clé aléatoire, puis cette clé est celle strictement chiffrée avec la clé publique.

puis envoyer le message ainsi crypté au destinataire respectif?

Oui. Notez que vous pouvez chiffrer tous les destinataires en utilisant la même clé aléatoire (cela vous permet d'envoyer une seule copie du fichier à tout le monde) ou un fichier entièrement rechiffré à chacun.

Si un attaquant obtient tous les messages chiffrés et sait que tous ont le même contenu mais sont chiffrés avec des clés différentes, cela facilitera-t-il l'attaque?

Non (en supposant des algorithmes appropriés, évidemment)

Et si l'attaquant parvient à déchiffrer l'un des messages ou obtient le texte en clair par d'autres moyens, cela compromettrait-il l'une des autres clés privées?

Et non. L'intérêt de la crypto clé publique / privée est précisément que la connaissance de la clé publique ne compromet pas la clé privée. Notez que l'attaquant pourrait créer lui-même ses propres messages chiffrés à toutes ces personnes, donc des messages infinis dont le texte brut est connu.

Existe-t-il une forme de cryptage asymétrique qui fonctionnerait mieux que d'autres dans ce scénario?

Pas vraiment. Vous voulez en fait un cryptage hybride, mais l'algorithme exact n'a pas vraiment d'importance, à condition qu'il soit bon. Je recommanderais d'utiliser la cryptographie elliptique car cela nécessite des clés et des messages plus courts, mais à part être plus gros, RSA convient également.

2 RogerLucas Nov 27 2020 at 22:18

CMS (Cryptographic Message Syntax) prend en charge cela en standard. Vos données sont cryptées avec une clé symétrique aléatoire, et cette clé est ensuite cryptée une fois pour chacune des clés publiques des destinataires auxquels vous souhaitez envoyer le message.

L'utilitaire OpenSSL l'implémente. Vous avez besoin d'un certificat pour chaque destinataire par lequel vous souhaitez que le message puisse être reçu.

Si vous avez un fichier source.binque vous souhaitez envoyer en toute sécurité à trois destinataires, vous pouvez faire:

openssl cms -encrypt -in source.bin -out encrypted.cms -recip friend1.cert -recip friend2.cert -recip friend3.cert 

Vous les envoyez encrypted.cms.

Votre "ami 1" peut alors:

openssl cms -decrypt -in encrypted.cms -recip friend1.cert -inkey friend1-private.pem -out source.bin

«Friend 2» et «Friend 3» peuvent faire de même avec leurs clés et obtenir les données originales.

Si vous le souhaitez, vous pouvez également signer les données pour les authentifier comme provenant de vous.

Voir: https://www.openssl.org/docs/man1.1.1/man1/cms.html

Il existe de nombreux exemples et conseils pour OpenSSL et CMS sur Internet (certains d'entre eux même sur Stack Exchange / Overflow! :-))