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

Langage Delphi Discussion :

Problème au niveau de la puissance


Sujet :

Langage Delphi

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Problème au niveau de la puissance
    Bonjour à tous,

    Voilà je suis en train de créer un programme de déchiffrement via le rsa et je suis confronté à un problème.
    Le programme se déroule correctement jusqu'à la recherche de de u et de v. Je ne comprends pas ce qui ne fonctionne pas, qui plus est, je suis obligé d'écrire la ligne s:=u-f sinon le programme ne fonctionne pas du tout. Je pense qu'il y a un problème au niveau de la puissance, j'ai déjà essayé de remplacer pu:=EXP(s*ln(mm)); en utilisant une procédure et une fonction mais cela ne change rien.
    Si quelqu'un pourrait m'aider ce serait bien gentil, merci

    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
    procedure TForm1.Button2Click(Sender: TObject);
    VAR n,e,f,p,q,d,u,v,mm,s: INTEGER;
        pu: REAL;
    begin
    mm:=strtoint(edit2.Text);
    n:=strtoint(edit4.Text);
    e:=strtoint(edit5.Text);
    p:=strtoint(edit6.Text);
    q:=strtoint(edit7.Text);
    f:=(p-1)*(q-1);
    u:=1;
    d:=1 ;
    while  ( ((e*u-d) mod f) <> 0)  do   
    begin
    u := u+1;
    end;
    v := (d-e*u) div f;   
    Edit8.Text := IntToStr(u);
    Edit9.Text := IntToStr(v);
    s:=u-f;
    pu:=EXP(s*ln(mm));
    While (pu>=0) AND (pu>n) DO
    pu:=pu-n;
    edit3.Text:=floattostr(pu);
     
    end;

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,

    Sans indiquer les valeurs initiales de mm, n, e, p et q ni ce que vous escomptiez ni en quoi cela ne marche pas, cela va être difficile de vous aider...
    --
    Philippe.

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Pour déchiffer en rsa, il faut effectuer ceci: mm^d mod n et pour trouver le d, il faut effectuer ce calcul e*d+k*f=1 qui est le théorème de bézout.
    Dans mon cas, le d c'est mon u.
    mm est la valeur à déchiffrer.
    n est le modulo à effectuer.
    p et q sont deux nombres qui en les multipliant donne n.
    Lorsque nous effectuons (p-1)*(q-1), nous obtenons le f.

    Sur un exemple, j'ai coder le nombre 7 et cela me donne 6 (mm) en modulo 143 (n). Mon e vaut 7 aussi et j'ai p=11 et q=13.
    Je dois effectuer 6^103 mod 143 pour retrouver le nombre 7. Le nombre 103 étant trouvé avec le théorème Bézout.

    Je ne sais pas si j'ai été assez clair.

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 577
    Points : 25 225
    Points
    25 225
    Par défaut
    Personnellement, les formules de mathématiques associés au Chiffrement, c'est incompréhensible et le code pas mieux avec tous ces variables à une lettre !
    Comme quoi les Math peuvent donner un argument dans : Quels sont les pires noms de variables que vous avez déjà vus ?

    Après ce n'est pas comme si Windows ne le faisait pas déjà : PROV_RSA_FULL

    CryptEncrypt avec un exemple AES ou un exemple MD5 que tu dois pouvoir simplifier pour RSA

    cela commence par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CryptAcquireContext(@hProv, nil, nil, PROV_RSA_FULL, 0);
    CryptAcquireContext(@hProv, nil, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
    Voir cet article Encryption using the Win32 Crypto API - RSA Encryption
    Un petit code Russe, peut-il t'aider : unit Crypt_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
     
    unit Crypt_RSA;
     
    interface
     
    uses
      Windows, Classes, SysUtils, WCrypt2;
     
    function RSAGenerateKeys(var PrivateKey, PublicKey: String): Boolean;
    function RSAEncrypt(Source, Key: String): String;
    function RSADecrypt(Source, Key: String): String;
     
    implementation
     
    function RSAGenerateKeys(var PrivateKey, PublicKey: String): Boolean;
    const
      RSA1024BIT_KEY = $04000000;
     
    var
      RSA: HCRYPTPROV;
      HKeyPair: HCRYPTKEY;
      Pair: TStringStream;
      buflen: DWORD;
     
      function SetKey(BlobDef: Cardinal; var Key: String): Boolean;
      begin
        Result := Bool(CryptExportKey(HKeyPair, 0, BlobDef, 0, nil, @buflen));
        if Result then
        begin
          Pair.SetSize(buflen);
          Result := Bool(CryptExportKey(HKeyPair, 0, BlobDef, 0, PByte(Pair.Memory), @buflen));
        end;
     
        Key := Pair.ReadString(buflen);
        Pair.Seek(0, soBeginning);
      end;
     
    begin
      Pair := TStringStream.Create;
     
      Result := Bool(CryptAcquireContext(@RSA, nil, nil, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT));
      if Result then
        Result := Bool(CryptGenKey(RSA, AT_KEYEXCHANGE, RSA1024BIT_KEY or CRYPT_EXPORTABLE, @HKeyPair));
     
      if Result then
        Result := SetKey(PRIVATEKEYBLOB, PrivateKey);
      if Result then
        Result := SetKey(PUBLICKEYBLOB, PublicKey);
     
      CryptDestroyKey(HKeyPair);
      CryptReleaseContext(RSA, 0);
      FreeAndNil(Pair);
    end;
     
    function RSAEncrypt(Source, Key: String): String;
    var
      KeyPair: TStringStream;
      RSA: HCRYPTPROV;
      HPair: HCRYPTKEY;
      DDataSize, EDataSize: DWORD;
     
    begin
      Result := '';
      KeyPair := TStringStream.Create(Key);
      if CryptAcquireContext(@RSA, nil, nil, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) then
      try
        if CryptImportKey(RSA, PByte(KeyPair.Memory), KeyPair.Size, 0, 0, @HPair) then
        try
          EDataSize := SizeOf(Source);
          if CryptEncrypt(HPair, 0, true, 0, nil, @EDataSize, 0) then
          begin
            Result := Source;
            SetLength(Result, EDataSize);
            DDataSize := Length(Source) * SizeOf(Char);
            if not(CryptEncrypt(HPair, 0, True, 0, PByte(PChar(Result)), @DDataSize, EDataSize)) then
              Result := '';
          end;
        finally
          CryptDestroyKey(HPair);
        end;
      finally
      CryptReleaseContext(RSA, 0);
      end;
      FreeAndNil(KeyPair);
    end;
     
    function RSADecrypt(Source, Key: String): String;
    var
      KeyPair: TStringStream;
      RSA: HCRYPTPROV;
      HPair: HCRYPTKEY;
      EDataSize: DWORD;
     
    begin
      KeyPair := TStringStream.Create(Key);
      Result := '';
      if CryptAcquireContext(@RSA, nil, nil, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) then
      try
        if CryptImportKey(RSA, PByte(KeyPair.Memory), KeyPair.Size, 0, 0, @HPair) then
        try
          Result := Source;
          EDataSize := Length(Result);
          if not Bool(CryptDecrypt(HPair, 0, True, 0, PByte(PChar(Result)), @EDataSize)) then
            EDataSize := 0;
          SetLength(Result, EDataSize div SizeOf(Char));
        finally
          CryptDestroyKey(HPair);
        end;
      finally
        CryptReleaseContext(RSA, 0);
      end;
      FreeAndNil(KeyPair);
    end;
     
    end.
    Tu noteras l'utilisation de chaine !
    Comment as-tu prévu le lien entre ces calculs sur des entiers (32Bits) alors que l'on utilise des clés de 1 à 4K (1024 à 4 096)
    Moi, c'est ce que je comprends pas du tout dans le RSA !
    Au moins DES ou AES, c'est des matrices, ça se comprend pour un programmeur qui n'a pas fait de math depuis 15ans !

  5. #5
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Citation Envoyé par adri0706 Voir le message
    Je ne sais pas si j'ai été assez clair.
    Pas vraiment !
    Vous "exposez" un algorithme avec des lettres que vous avez renommé pour votre commodité et vous n'expliquez pas clairement l’algorithme.
    Donnez un jeu d'essai, ce n'est pas compliqué, par exemple :
    Données en entrée : mm = 6, n = 143, e = 7, p = 11, q= 13
    Données attendues : pu = 7, u = ?, v = ?
    Maintenant Exp(s * Ln(mm)), je me demande si on ne va pas dépasser les limites du type Real (5.0 x 10^-324 .. 1.7 x 10^30) et donc obtenir un résultat faux inexploitable...
    --
    Philippe.

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 577
    Points : 25 225
    Points
    25 225
    Par défaut
    c'est vrai que cela aide pour les non-matheux d'avoir des valeurs d'entrée et de sortie mais attention à ne pas trop orienter l'algo vers une version simplifiée pour ces valeurs !

    Il faut prendre ceci comme première référence d'algorithme mathématique avec les mêmes noms de variables !

  7. #7
    Membre habitué
    Inscrit en
    Juillet 2007
    Messages
    113
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Juillet 2007
    Messages : 113
    Points : 170
    Points
    170
    Par défaut
    Pour que la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while  ( ((e*u-d) mod f) <> 0)  do   
    begin
    u := u+1;
    end;
    s'arrête il faut que e soit un multiple de f (au -d près), sinon tu as une boucle infinie...

  8. #8
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Ph. B. Voir le message
    Pas vraiment !

    Maintenant Exp(s * Ln(mm)), je me demande si on ne va pas dépasser les limites du type Real (5.0 x 10^-324 .. 1.7 x 10^30) et donc obtenir un résultat faux inexploitable...
    C'est ce qui se passe je pense, j'ai changé légèrement le code et j'ai résolus avec des nombres plus petits et cela fonctionne tandis qu'en gardant l'exemple donné, cela ne fonctionne pas, je dois adapter le code lorsque des nombres sont plus grands.

    C'est vrai que c'est plutôt penché vers une résolution mathématique (j'étudie les maths).

    Pour les noms de variables, on m'a appris ainsi à l'école, maintenant s'il existe un système plus simple, je suis preneur ^^

    Merci pour vos conseils

  9. #9
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 084
    Points : 1 525
    Points
    1 525
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par adri0706 Voir le message
    Pour les noms de variables, on m'a appris ainsi à l'école, maintenant s'il existe un système plus simple, je suis preneur ^^
    Dehors le prof!!
    Plus sérieusement il est effectivement très important d'avoir des nom de variable ayant une signification. Il existe plusieurs type de conventions de nommage de variables (exemple la notation hongroise)
    Parce que d'ici quelques temps quand tu voudra faire une modification de ton code tu vas te demander c'est quoi cette variable mm déjà ???

Discussions similaires

  1. [UBUNTU] Problème au niveau du partitionnement
    Par Louis-Guillaume Morand dans le forum Ubuntu
    Réponses: 19
    Dernier message: 19/07/2006, 18h05
  2. [CSS] Problème au niveau de la résolution
    Par shukin dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 28/10/2005, 13h29
  3. [PPC][C#][SQL2000] Problème au niveau de donné controlé
    Par Roach dans le forum Windows Forms
    Réponses: 16
    Dernier message: 21/09/2005, 22h08
  4. problème au niveau de restore database
    Par Redouane dans le forum Administration
    Réponses: 2
    Dernier message: 07/09/2005, 11h49
  5. [DNS MX]Avec DynDNS.org, problème au niveau du MX
    Par Swoög dans le forum Développement
    Réponses: 9
    Dernier message: 24/08/2004, 22h00

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