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 :

RSA problème d'exécution


Sujet :

C++

  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2023
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2023
    Messages : 1
    Par défaut RSA problème d'exécution
    Bonjour, pouvez vous m'aider, j'arrive pas à exécuter ce code RSA:


    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    #include <iostream>
    #include <vector>
     
    using namespace std;
     
    class RSA {
    public:
      RSA() {}
     
      void generateKeys() {
        // Generate two prime numbers, p and q.
        p = generatePrime();
        q = generatePrime();
     
        // Calculate the modulus, n.
        n = p * q;
     
        // Calculate the public exponent, e.
        e = rand() % (p - 1) + 1;
     
        // Calculate the private exponent, d.
        d = modInverse(e, (p - 1) * (q - 1));
      }
     
      string encrypt(string message) {
        // Convert the message to a number.
        int messageNumber = stoi(message);
     
        // Encrypt the message using the public exponent, e.
        int encryptedNumber = pow(messageNumber, e) % n;
     
        // Convert the encrypted number back to a string.
        string encryptedMessage = to_string(encryptedNumber);
     
        return encryptedMessage;
      }
     
      string decrypt(string encryptedMessage) {
        // Convert the encrypted message to a number.
        int encryptedNumber = stoi(encryptedMessage);
     
        // Decrypt the message using the private exponent, d.
        int decryptedNumber = pow(encryptedNumber, d) % n;
     
        // Convert the decrypted number back to a string.
        string decryptedMessage = to_string(decryptedNumber);
     
        return decryptedMessage;
      }
     
    private:
      int p;
      int q;
      int n;
      int e;
      int d;
     
      int generatePrime() {
        // Generate a random number between 2 and 1000.
        int number = rand() % 1000 + 2;
     
        // Check if the number is prime.
        bool isPrime = true;
        for (int i = 2; i < number; i++) {
          if (number % i == 0) {
            isPrime = false;
            break;
          }
        }
     
        // If the number is prime, return it.
        if (isPrime) {
          return number;
        }
     
        // Otherwise, generate another number.
        return generatePrime();
      }
     
      int modInverse(int a, int m) {
        // This function returns the modular inverse of a modulo m.
     
        // Initialize the result to 1.
        int result = 1;
     
        // While a is not 0, do the following:
        while (a != 0) {
          // Calculate the remainder of a divided by m.
          int remainder = a % m;
     
          // Calculate the modular inverse of the remainder.
          int inverse = modInverse(remainder, m);
     
          // Multiply the result by the inverse.
          result = result * inverse % m;
     
          // Subtract the remainder from a.
          a = a - remainder;
        }
     
        return result;
      }
    };
     
    int main() {
      // Create an RSA object.
      RSA rsa;
     
      // Generate the public and private keys.
      rsa.generateKeys();
     
      // Print the public and private keys.
      cout << "Public key: " << rsa.e << " " << rsa.n << endl;
      cout << "Private key: " << rsa.d << " " << rsa.n << endl;
     
      // Encrypt a message.
      string message = "Hello, world!";
      string encryptedMessage = rsa.encrypt(message);
     
      // Decrypt the message.
      string decryptedMessage = rsa.decrypt(encryptedMessage);
     
      // Print the encrypted and decrypted messages.
      cout << "Encrypted message: " << encryptedMessage << endl;
      cout << "Decrypted message: " << decryptedMessage << endl;
     
      return 0;
    }

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 466
    Par défaut
    Salut,

    Ca ne peut pas être un problème d'exécution vu que ça ne compile même pas !!!

    Les messages du compilateur sont pourtant clair (ici: Visual studio 2022):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    1>C:\.....\ConsoleApplication1\ConsoleApplication1.cpp(29,53): error C2296: « % » : non valide, car l’opérande gauche a le type « double »
    1>C:\.....\ConsoleApplication1\ConsoleApplication1.cpp(112,39): error C2248: 'RSA::e'*: impossible d'accéder à private membre déclaré(e) dans la classe 'RSA'
    1) L'opérateur modulo n'aime pas le type double (renvoyé par la fonction pow).
    2) Tu tentes d'accéder à des membres privés (aurais tu oublié des accesseurs ?).

    PS:
    - Le seul but de la directive "using namespace std" est d'assurer la compatibilité "avec un minimum d'effort" des anciens programmes (avant 1998) avec la librairie de standard (soit 25 ans ou plus !!).
    Elle n'a rien à faire dans un programme moderne.
    A moins que tu soit fan des collisions de nom (ce dont je doute).
    - La fonction rand() est fortement déconseillée (en plus d'être du C), les fonctionnalités de génération de nombre aléatoire se trouvent dans l'entête <random>

Discussions similaires

  1. Problème pour exécuter une chaîne de caractères
    Par Pongo dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 02/09/2005, 10h34
  2. Problème d'exécution : 'rtl60.bpl introuvable'
    Par zeddy23 dans le forum EDI
    Réponses: 3
    Dernier message: 27/07/2005, 20h44
  3. Réponses: 5
    Dernier message: 19/04/2005, 08h50
  4. [Tomcat][EasyStruts] Problème d'exécution
    Par mmed dans le forum Eclipse Java
    Réponses: 6
    Dernier message: 29/12/2004, 11h55
  5. Problème à l'exécution avec wxWindows (compilé avec BCC55)
    Par ShootDX dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 14/11/2003, 18h04

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