IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

[Zip|Crypt] Comment Zipper avec un mot de passe? + Cryptage asymétrique


Sujet :

C#

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Points : 552
    Points
    552
    Par défaut [Zip|Crypt] Comment Zipper avec un mot de passe? + Cryptage asymétrique
    Bonjour à tous,

    J'ai deux questions.

    La principale:
    1/ J'aimerais pouvoir Zipper (compresser et décompresser) avec un mot de passe en utilisant aucune dépendance excepté la Framework 2.0.

    Pour le moment j'utilise l'algo de compression Zip sans cryptage, de cette manière:
    http://beta.blogs.microsoft.co.il/bl...am-object.aspx


    La question secondaire:
    2/ Comment faire un cryptage asymétrique assez léger? (je pense qu'avec le zip on ne peut pas). J'entend comme léger le fait que la méthode soit simple (peu de ligne), pas gourmande et d'un niveau moyen en terme de sécu.

    Mon besoin, c'est d'envoyer depuis une machine cliente du contenu que seul le serveur puisse déchiffrer (autrement dit même le client ne peut déchiffrer ce qu'il va envoyer). Je n'ai pas besoin d'un mécanisme de signature par contre. Donc la clé "publique" crypte coté client (elle sera en dure dans le code), et la clé privée décrypte coté serveur (elle ne sera disponible que chez nous)

    Bonne journée à tous et merci

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par alavoler Voir le message
    1/ J'aimerais pouvoir Zipper (compresser et décompresser) avec un mot de passe en utilisant aucune dépendance excepté la Framework 2.0.

    Pour le moment j'utilise l'algo de compression Zip sans cryptage, de cette manière:
    http://beta.blogs.microsoft.co.il/bl...am-object.aspx
    Pourquoi sans utiliser aucune dépendance ?
    Et l'algo de compression implémenté dans le framework c'est GZIP, pas ZIP...


    Citation Envoyé par alavoler Voir le message
    2/ Comment faire un cryptage asymétrique assez léger? (je pense qu'avec le zip on ne peut pas). J'entend comme léger le fait que la méthode soit simple (peu de ligne), pas gourmande et d'un niveau moyen en terme de sécu.
    Regarde le namespace System.Security.Cryptography, il y a tout ce qu'il faut et c'est assez simple à utiliser. Par contre la compression et le cryptage sont deux choses distinctes, il faut les gérer séparément... par exemple tu compresses puis tu cryptes, ou l'inverse.

    Citation Envoyé par alavoler Voir le message
    Mon besoin, c'est d'envoyer depuis une machine cliente du contenu que seul le serveur puisse déchiffrer (autrement dit même le client ne peut déchiffrer ce qu'il va envoyer). Je n'ai pas besoin d'un mécanisme de signature par contre. Donc la clé "publique" crypte coté client (elle sera en dure dans le code), et la clé privée décrypte coté serveur (elle ne sera disponible que chez nous)
    Je pensais qu'on pouvait faire ça avec un CryptoStream + GZipStream, mais le constructeur de CryptoStream prend en paramètre un ICryptoTransform, qui ne peut être obtenu qu'à partir d'un algo symétrique

    Il doit y avoir une astuce pour le faire, mais pour l'instant je vois pas trop...

    Sinon tu peux toujours crypter directement les donnés binaires, sans utiliser de stream, et ensuite envoyer le tout au serveur

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Encore moi...

    Je viens de tomber sur une discussion intéressante sur Stackoverflow.com.

    En gros ça dit que les algorithmes asymétriques comme RSA ne sont normalement pas utilisés pour encoder de grosses quantités de données (c'est pourquoi le CryptoStream ne marche qu'avec des algos symétriques). Normalement ça sert juste à échanger une clé pour un algo symétrique, qui est ensuite utilisé pour le cryptage

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Points : 552
    Points
    552
    Par défaut
    - Je préfère aucune dépendance car j'estime que le Framework devrait être capable de faire ce que je veux sur le sujet. J'ai besoin juste d'un truc qui compress / decompress, n'importe quel algo me convient. Je ne veux pas m'embêter à lire les conditions d'utilisation de tel ou tel lib...
    J'ai pris ZIP comme exemple, car je sais que c’est un algo ouvert, mais qu'importe... Gzip ou autre, l'important c’est que ce soit natif


    - J'ai bien pigé que la compression et le cryptage sont 2 choses différentes, même si mon post est peut être confus, j'ai pourtant essayé de séparer les questions

    "En gros ça dit que les algorithmes asymétriques comme RSA ne sont normalement pas utilisés pour encoder de grosses quantités de données"
    - Zut... grosso modo je dois encoder un DataSet (disons avec une table de 100 lignes de 3 colonnes) pour donner une idée de la volumétrie... mais c'est amener à bouger mais ce n’est pas un Blueray donc c'est léger, je dirais quelques Ko...

    Les cryptages asymétriques sont tous prévus pour encoder un volume faible pour échanger par la suite avec une clé symétrique ?

    tomlev comme d'hab t'as des idées lumineuses, et je t'en remercie !

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Points : 552
    Points
    552
    Par défaut
    Disons que mon besoin c’est d’envoyer au maximum 1 Mo (en moyenne quelques Ko) de données sous forme de string à travers un WebService, sans que le client puisse déchiffrer ce qu’il vient d’envoyer, seul le serveur en à la faculté. En sachant que je recherche avant tout une solution simple à mettre en place, je ne travail pas au pentagone


    Au début, l'opération de transformer un dataset déjà plutôt obscure, dans un string compressé avec Gzip, ca me paraissait suffisant comme méthode de "cryptage", mais mon Manager veut que je lui "garantisse" que le client ne peut déchiffrer les info qu'il a encodé pour les envoyer.
    Je ne vois que le cryptage asymétrique pour réaliser ca, mais si il faut en plus gérer une clé symétrique / dynamique, ca veut dire que c est compliqué pour pas grand chose... surtout qu'en terme de sécu, si je comprend bien, ca répond pas au besoin de pas pouvoir déchiffrer ce qu'on envoi...

    tsss... j'aime pas la sécu, surtout lorsque c'est pas vraiment légitime , enfin osef: le sujet reste intéressant !

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    A vrai dire j'y connais pas grand chose en webservice, donc je vais faire abstraction de cette partie là... Mais pour encrypter et compresser le contenu du DataSet, je ferais un truc comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    using (MemoryStream memStream = new MemoryStream())
    {
        using (GZipStream gzStream = new GZipStream(ms, CompressionMode.Compress))
        {
            dataSet.WriteXml(gzStream);
        }
     
        RSA rsa = RSA.Create();
        RSAParameters prm = new RSAParameters();
        prm.Exponent = <publicExponent>;
        prm.Modulus = <modulus>;
        rsa.ImportParameters(prm);
        byte[] encryptedBytes = rsa.Encrypt(memStream.ToArray());
        string encryptedString = Convert.ToBase64String(encryptedBytes);
    }
    A la fin tu as dans encryptedString une chaine encodée en base64 qui représente le contenu du DataSet, compressé puis crypté

    (je suis pas tout à fait sur de moi pour les paramètres RSA... à vérifier)

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Points : 552
    Points
    552
    Par défaut
    tomlev

    pas besoin de si connaitre en WebService (c'est juste une methode qui récupère un string basta...)

    Je pense aussi comme toi niveau code, j'essaierai d'implémenter le bousin demain !

    Je vous tiens au courant,

    Bonne soirée à toi tomlev

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par alavoler Voir le message
    pas besoin de si connaitre en WebService (c'est juste une methode qui récupère un string basta...)
    Ben dans certains cas, un webservices peut manipuler un Stream plutôt qu'une String, c'est plus adapté pour des gros volumes. C'est à ce niveau là que je maitrise pas trop. Mais si ton service prend une string, la question ne se pose pas...

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Points : 552
    Points
    552
    Par défaut
    Bon matin !

    Bon je viens d'essayer ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    RSACryptoServiceProvider rsaPub = new RSACryptoServiceProvider();
    rsaPub.FromXmlString(Resource.PublicKey);
    byte[] encryptedData = rsaPub.Encrypt(System.Text.Encoding.UTF8.GetBytes(Resource.PublicKey), false);
     
     
    RSACryptoServiceProvider rsaPriv = new RSACryptoServiceProvider();
    rsaPriv.FromXmlString(Resource.PrivateKey);
    byte[] decryptedData = rsaPriv.Decrypt(encryptedData, false);
    string res = System.Text.Encoding.UTF8.GetString(decryptedData);
    donc en gros j'ai généré au préalable les clés PublicKey et PrivateKey,
    je les load et j'essaye de chiffrer un pti string "test", là ça marche, par contre si j'essaye avec un string plus grand typiquement dans mon exemple l'XML PublicKey, et bien là ça s'explose:
    Clé non valide pour l'utilisation dans l'état spécifié.
    pourtant le fichier ne fait que 161 octets!

    Je pense que c'est possible d'utiliser RSA, car GPG l'utilise bien : http://en.wikipedia.org/wiki/GNU_Privacy_Guard#Process
    Mais peut être bien que sous .Net c'est pas prévu pour les large block...

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    J'ai fait le test, j'ai aussi une erreur si j'essaie de crypter des fichiers de plus de quelques octets en RSA

    Comme je te le disais, ce n'est pas fait pour crypter des grosses quantités de données (typiquement, pas plus que la longueur de la clé)

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Points : 552
    Points
    552
    Par défaut
    Tomlev
    j'ai vu que tu avais posté sur codeproject.

    En ce qui concerne l'utilisation du CryptoStream, j'ai trouvé :
    http://www.ddj.com/windows/184416907

    il propose une méthode de tueur...
    moi qui aime les solutions simples d'une ou deux lignes jsuis gaté

    Enfin bon la question n'est plus à l'ordre du jour dans ma boite (pour le moment) mais la question reste intéressante, si certains on des avis, je suis toujours preneur!

    Surtout que je sens que d'ici quelque mois je vais devoir traiter le probleme...

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par alavoler Voir le message
    En ce qui concerne l'utilisation du CryptoStream, j'ai trouvé :
    http://www.ddj.com/windows/184416907

    il propose une méthode de tueur...
    moi qui aime les solutions simples d'une ou deux lignes jsuis gaté
    argh
    je me disais bien qu'on devait pouvoir le faire avec un peu de boulot... voilà la preuve

Discussions similaires

  1. Réponses: 5
    Dernier message: 25/03/2013, 04h57
  2. [IE 8] Comment verrouiller IE avec un mot de passe
    Par iliesss dans le forum IE
    Réponses: 0
    Dernier message: 16/05/2011, 00h36
  3. Réponses: 0
    Dernier message: 05/02/2009, 13h16
  4. Débutant: Comment faire un bouton avec un mot de passe
    Par ch@rles.be dans le forum Sécurité
    Réponses: 1
    Dernier message: 06/02/2007, 19h37
  5. [batch]comment lancer un excel avec son mot de passe?
    Par victor.ward dans le forum Windows
    Réponses: 1
    Dernier message: 05/12/2005, 10h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo