2010-01-25 4 views
2

Je suis à la recherche d'une solution d'échange de clés entre une application .NET et un périphérique embarqué. Les deux extrémités ont une clé secrète partagée, ce qui rend l'algorithme ECDH (Elliptic Curve Diffie-Hellman) excellent pour échanger en toute sécurité un secret principal pour la session.Qu'est-ce qu'une bibliothèque C++ avec une implémentation compatible ECDiffieHellmanCng?

Il existe une bonne bibliothèque C++, crypto++, qui implémente ECDH et convient au périphérique embarqué. Cependant, son implémentation de l'ECDH diffère de l'implémentation ECDiffieHellmanCng de Mirosoft (comme mentionné dans son FAQ). Nous aimerions rester compatibles avec les algorithmes de sécurité .NET afin que nous puissions nous en tenir au code managé pour l'application PC (maintenant, ou si nous utilisons CNG, quand nous abandonnerons XP un jour).

Est-ce que quelqu'un a vu une implémentation en plus de Microsoft qui est compatible avec Microsoft? Sinon, existe-t-il d'autres bonnes solutions d'échange de clés entre le code .NET et le code C++ intégré pour une utilisation avec des clés pré-partagées?

Mise à jour 2010-01-27: Pour clarifier, j'essaie d'utiliser ECDH pour effectuer à la fois l'authentification bidirectionnelle et l'échange de clés entre deux terminaux point de vente qui ne se font pas confiance jusqu'à ce qu'ils voient qu'ils partagent le même secret. Ceci est similaire au scénario d'appariement Bluetooth où le secret partagé est échangé hors bande (sauf dans mon cas, les périphériques peuvent ne pas être proches les uns des autres).

+0

La FAQ que vous liez est la FAQ pour cryptlib de Peter Gutmann - pas pour crypto ++. –

+0

Bonne correction. L'entrée de la FAQ est préférable à travers une mise en garde générale que vous ne pouvez pas supposer que deux implémentations du même algorithme de cryto général fonctionneront les uns avec les autres. J'espère que quelqu'un arrive à savoir ce que fait. –

Répondre

0

OpensSSL a un port à Visual Studio

+0

Mon premier choix est d'utiliser ce qui est déjà dans le .NET Framework, c'est pourquoi je me concentre sur l'interopérabilité, pas seulement sur la portabilité. –

1

Pour l'interopérabilité, vous êtes mieux avec l'aide de RSA. Vous ne trouverez pas beaucoup de mises en œuvre gratuites d'ECC en raison du champ de mines de brevets. Si un côté génère une clé aléatoire, cryptez-la avec la clé publique de l'autre côté et signez-la avec sa propre clé privée. Ensuite, l'autre côté peut vérifier la signature et déchiffrer la clé partagée. Si vous vous inquiétez des attaques de relecture (notez que le schéma ECDH que vous envisagiez d'utiliser ne vous protégeait pas - sauf si vous envisagiez d'utiliser des clés éphémères), vous pouvez demander aux deux parties de générer une clé aléatoire, de la chiffrer avec la clé publique de l'autre côté, puis combiner les deux clés d'une manière ou d'une autre.

Encore mieux serait probablement d'utiliser un protocole standard: envisager TLS avec la validation du certificat client. Vous pouvez coder en dur les certificats client et serveur.

+0

Le schéma ECDH empêche les attaques de rejeu en incorporant de nouveaux matériaux aléatoires pour chaque échange de secret maître. Dans .NET, le constructeur ECDiffieHellmanCng génère le nombre aléatoire. J'aime votre idée de RSA, mais il y a la question de savoir comment s'authentifier (désolé, je n'étais probablement pas assez clair à ce sujet). Les deux parties ont un secret partagé, mais ni l'un ni l'autre ne se fie à l'autre pour ne pas être un imposteur. Je crois que l'authentification par certificat serait impraticable, car il pourrait y avoir des milliers d'instances uniques des deux côtés, qui ne sont pas fiables, sauf pour avoir le secret partagé. –