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

Sécurité Discussion :

Cryptage RSA par clef privée : Impossible à décoder avec OpenSSL


Sujet :

Sécurité

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Inscrit en
    Février 2007
    Messages
    253
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Février 2007
    Messages : 253
    Par défaut Cryptage RSA par clef privée : Impossible à décoder avec OpenSSL
    Bonjour à tous.

    Je travaille sur un problème de gestion de licence.
    Le but ? Fournir à ceux qui auront payé une licence leur permettant d'utiliser un logiciel.
    Bon, jusque là, c'est très commun. Le programme est un programme écrit en C++ donc compilé.

    Le principe : encoder sur mon site web, la licence en RSA en utilisant la clef privée puis décoder cette clef avec la clef publique dans le logiciel.

    Ok, plusieurs failles de sécurité : la clef de décodage est dans le programme (qu'il faudra masquer en l'encodant elle aussi pour ne pas la modifier facilement via un éditeur de texte).

    Le but est simplement que l'on ne puisse pas facilement encoder une nouvelle licence... si on peut la lire c'est pas trop grave mais je ne veux pas pour autant la laisser en clair. De toute façon le système n'est pas fait pour être incassable car une protection logicielle est forcément faillible, il suffit de l'exécuter via un debugger... et avec de solides connaissances...

    Le logiciel sera vendu certainement autour de 5€ (s'il sort un jour) donc je ne peux pas utiliser de dongle à 30€ pièce !

    Voici mon problème :
    -> cryptage RSA de la licence avec la clef privée sous PHP côté site web (la licence peut être décryptée sous php avec la clef publique).
    -> décryptage impossible en utilisant OpenSSL.

    wxmemDestinationBuffer est un wxMemoryBuffer (wxWidgets), c'est un simple buffer binaire qui contient la licence encryptée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        FILE *pfKeyFile = fopen("monchemin\\maclefpublique.pem", "r");                   // Open the private key file
        RSA *pRSAPublicKey = PEM_read_RSA_PUBKEY(pfKeyFile, NULL, NULL, NULL); // And read the RSA key from it
        fclose(pfKeyFile);
    
        unsigned char *pszOutBuffer = new unsigned char[RSA_size(pRSAPublicKey)]; // Create some buffers of the right size
    
    int iLen = RSA_public_decrypt(wxmemDestinationBuffer.GetDataLen(), (const unsigned char *) wxmemDestinationBuffer.GetData(), pszOutBuffer, pRSAPublicKey, RSA_PKCS1_OAEP_PADDING);
    wxmemDestinationBuffer.GetDataLen() est ègal à RSA_size(pRSAPublicKey) (256)
    iLen retourne toujours -1, le message d'erreur est "unknown padding type".
    J'ai tenté avec RSA_PKCS1_PADDING, idem, le message est "block type is not 01"

    Pour les puristes qui vont me répondre, normalement on crypte avec la clef publique et on décrypte avec la clef privée, mais je ne peux pas fournir une clef privée différente par utilisateur du logiciel !
    Ce que je fais s'apparente plus à une signature numérique mais je souhaite aussi crypter la licence, qu'elle ne soit pas lisible en clair!

    La question que je me pose : est-ce que OpenSSL PEUT décrypter avec la clef publique ? J'y ai passé des heures, modifier les options de cryptage côté php en CRYPT_RSA_ENCRYPTION_OAEP ou CRYPT_RSA_ENCRYPTION_PKCS1 mais rien n'y fait.

    Si vous avez des réponses ou des suggestions...

    -> il faut que la licence soit cryptée
    -> Il ne faut pas que l'on puisse en générer par soi même
    -> Il faut que je puisse authentifier / vérifier au décryptage que ça provient bien de moi
    -> La licence générée fait 256 octets, il faut éviter qu'elle soit trop longue (genre signature numérique + hash + encryption + .... )

    PS : j'ai aussi essayé RSA_private_decrypt() mais là, c'est pire, le programme crash (segmentation fault).

  2. #2
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    377
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2009
    Messages : 377
    Par défaut
    Pour les puristes qui vont me répondre, normalement on crypte avec la clef publique et on décrypte avec la clef privée, mais je ne peux pas fournir une clef privée différente par utilisateur du logiciel !
    Ce que je fais s'apparente plus à une signature numérique mais je souhaite aussi crypter la licence, qu'elle ne soit pas lisible en clair!
    C'est tout à fait correcte d'utiliser ta clé privé dans ce sens, cela s'appele une signature te permet d'authentifié la provenance de ton certificat.

    Maintenant j'ai l'impression que tu confonds deux choses la signature et le chiffrement. On utilise que très rarement le RSA pour chiffrer, c'est lent, lent et encore une fois lent.
    Ce que tu dois faire c'est une signature, tu génères des licences que tu signes avec ta clé privé. Ensuite dans ton programme tu contrôle que la signature est correcte.
    Si quelqu'un veut t'attaquer, il va devoir générer une signature correcte pour son logiciel, ce qu'il ne peut faire vu qu'il ne possède pas la clé privé.
    Par contre comme tu le dis il "n'existe pas" de solution de sécurité logiciel efficace. Mais un petit coup d'obfuscator, et tu décourageras la plupart des attaquants pour un logiciel de 5$

    Pour ce qui est d'openssl tu peux évidement signer/contrôler une signature, juste un passage de la doc :

    $ openssl dgst -h
    unknown option '-h'
    options are
    -c to output the digest with separating colons
    -d to output debug info
    -hex output as hex dump
    -binary output in binary form
    -sign file sign digest using private key in file
    -verify file verify a signature using public key in file
    -prverify file verify a signature using private key in file
    Et une référence :
    http://www.madboa.com/geek/openssl/

  3. #3
    Membre confirmé

    Inscrit en
    Février 2007
    Messages
    253
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Février 2007
    Messages : 253
    Par défaut
    Merci pour ta réponse...

    J'ai un ami expert réseau et sécurité, il m'a dit la même chose ! Grrrrrr !
    C'est en effet plus une signature, mais il faut que je j'encrypte pour ne pas laisser la licence "en clair".

    Il m'a expliqué, il faut que je signe le licence mais du coup je ne sais pas comment je vais encrypter le tout (certificat + signature), je veux pas laisser les infos contenues dans la licence en clair...

    Impossible de stocker la clef privée dans le programme : trop facile de retrouver la clef publique à partir de la clef privée.

    On utilise que très rarement le RSA pour chiffrer, c'est lent, lent et encore une fois lent.
    Oui je sais mais ce n'est pas pour chiffrer mais pour déchiffrer, de plus l'ajout de la licence se fait très rarement, pas grave si ça prend du temps !

    Mais un petit coup d'obfuscator, et tu décourageras la plupart des attaquants pour un logiciel de 5$
    Ehhhh.. de l'obfuscation sur un programme en C++, donc compilé ?

    J'ai vu que certain programmes protègent les exe (empèche le debug, etc), il suffit de faire un md5 sur la DLL qui contient la protection dans l'executable et d'empécher le lancement si la dll est modifée...

    Compliqué lorsque l'on ne peux pas utiliser de dongle...

  4. #4
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    377
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2009
    Messages : 377
    Par défaut
    Compliqué lorsque l'on ne peux pas utiliser de dongle...
    Ehhhh.. de l'obfuscation sur un programme en C++, donc compilé ?
    Le dongle n'est qu'une des protections possibles, il existe de nombreuses solution pour "blinder" ton exécutable. Peut-importe le langages, cherche du côté des packers/protecteur, il te permettront de cacher un tant soit peu ta clé publique utilisé pour vérifier la signature.


    Il m'a expliqué, il faut que je signe le licence mais du coup je ne sais pas comment je vais encrypter le tout (certificat + signature), je veux pas laisser les infos contenues dans la licence en clair...
    Tu peux protéger ta licence en la chiffrant simplement, c'est pas la panacée, mais pour un logiciel à 5$ c'est une bonne solution.

  5. #5
    Membre confirmé

    Inscrit en
    Février 2007
    Messages
    253
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Février 2007
    Messages : 253
    Par défaut
    Citation Envoyé par manticore Voir le message
    Le dongle n'est qu'une des protections possibles, il existe de nombreuses solution pour "blinder" ton exécutable. Peut-importe le langages, cherche du côté des packers/protecteur, il te permettront de cacher un tant soit peu ta clé publique utilisé pour vérifier la signature.
    Toutes mes signatures embarqués dans le programme ne seront pas mise en clair et certainement réparties entre l'exécutable et les multiples DLLs, l'exe refusant de se lancer si une DLL a été modifiée, c'est déja une première base.

    Le logiciel coutera 5€ pour les particuliers, 50€ pour les clubs (tennis de table).

    Si je signe ma licence en RSA côté site web, j'aimerais encoder licence + signature avec de la crypto pour ne pas laisser la licence en clair, que me conseiller-vous ? AES ? Comment générer les clefs de cryptages AES ? De quelle longueur ? La taille de la signature fait 256 octets + la licence donc je ne peux pas crypter avec une clef RSA...
    Dommage AES est un cryptage sysmétrique... pas de possibilité de crypter le tout avec un cryptage asymétrique (un bloc d'environ 300 octets) ?

  6. #6
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    377
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2009
    Messages : 377
    Par défaut
    J'ai l'impression que tu fais une erreur sur la compréhension du chiffrement symétrique et asymétrique.

    Pour signer il te faut de l'asymétrique, afin de générer une signature que tu peux contrôler sans pouvoir les générer.

    Pour chiffrer, il te faut du symétrique (pas que l'asymétrique ne fonctionne pas mais il est plus lent et n'apporte rien.). Ceci car de toute façon tu devras stocker ta clé de chiffrement sur ton programme (ou l'envoyer depuis un serveur web).

    L'AES est le standard actuel avec une clé de 128 bits tu es blindé.

    Maintenant il te faut trouver une solution pour cacher ta clé, il y a plusieurs solutions. La plus simple étant d'utiliser un packer qui va te blinder ton exécutable.

    Une référence qui peut-être utile.
    http://www.id07.com/logiciels/progra...otecteurs-v15/

    Pour cacher ta clé évite d'utiliser un string par contre mais au point un système de sérial, ou un calcul est fait pour la générer sinon un éditeur hexa révélera la clé.

    Ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int key = 0;
    key = a * 61;
    key = key ^ key;
    ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [C#] Cryptographie par clefs privée/publique
    Par dev01 dans le forum Windows Forms
    Réponses: 9
    Dernier message: 22/08/2011, 21h44
  2. Utilisation de deux bibliothèques différentes pour le cryptage RSA --> impossible ?
    Par Djobird dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 26/01/2011, 17h25
  3. Connexion SSH avec clefs privée/publique
    Par NikoBe dans le forum Eclipse Java
    Réponses: 7
    Dernier message: 12/06/2007, 20h50
  4. [VB.NET2.0] cryptage RSA avec clef privée
    Par AP dans le forum Framework .NET
    Réponses: 4
    Dernier message: 17/04/2007, 15h35
  5. cryptage clef privee / clef publique
    Par maminova77 dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 07/03/2006, 08h34

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