Bonsoir à tous,
J'ai commencé ce matin la programmation en C++ après un peu de Python. Lors de mes exercices j'ai songé à réaliser une version simplifiée et schématisée de l'algorithme Diffie-Hellman, d'autant plus que ça me sera utile quand je vais présenter une approche de la Cryptographie pour débutant.
J'ai utilisé les commandes rudimentaires, je ne viens que de commencer aujourd'hui, et je suis plus ou moins parvenu à mes fins. En effet, j'ai bien utilisé la fonction y = (Y^x)%P, et le programme semble marcher. J'avais déjà réalisé auparavant le script en Python, dont les résultats concordaient parfaitement avec la représentation simplifiée qu'on retrouve dans des bouquins de Crypto. Je voulais vérifier les résultats.
Pour Y=11, P=13 et x=8, je dois normalement obtenir y=9. C'est d'ailleurs ce que me retourne mon script py. En revanche c'est une toute autre histoire pour mon programme console C++, lequel persiste à me répondre y=8.
Le plus surprenant, c'est que chez d'autres personnes, cela fonctionne parfaitement !
Images pour illustrer (ce n'est pas une blague) :
Chez moi :
Chez Caletlog (merci à lui pour avoir testé) :
Plus surprenant encore, le programme retourne une valeur correcte pour x=5 (Y & P idem qu'avant), soit y=7, ce qu'on est sensé obtenir. J'ai demandé l'avis de plusieurs personnes, passé quelques recherches, je n'ai rien trouvé...
Voici mon code :
http://pastebin.com/f36sevdN
Je vous remercie de vos futures réponses et bonne soirée.
serait pas car en fonction de l'os un int peut avoir une taille différent ou un double du coup ça tronque différement?(peu être je dis une connerie,je sais pas) mais demande au cas ou^^
je veux dire entre 32 ou 64bits
J'ai remplacer tous les int par des double(en faisant un cast pour gérer le modulo) et j'obtiens bien 9 pour Y=11, P=13 et x=8.
DayDennis Venant du doux monde des langages interprétés je n'en sais strictement rien, mais beaucoup ont testé et obtiennent 9 également (sûrement testé sur une archi x64).
Lucas490 D'accord ! Mais sans aucune modification, trouves-tu également 9 ?
Comme quelqu'un m'a lancé sur l'idée, (pow(Y,x)) dépasserait la valeur d'un int ?
Essaye toi-même avec des doubles ou des (unsigned) long, sinon.
Résolu !
Code corrigé :
http://pastebin.com/bg7GfVa2
Je pense que c'était l'idée de Lucas490, j'ai viré tous les int pour des double, et j'ai utilisé la fonction fmod (modulo) qui passe avec double sans soucis. Maintenant ça tolère de plus grands nombres, avant 11^8 était sûrement trop grand pour une variable int.
Je me coucherai moins bête !
J'obtenais 8 aussi avec la source originale.
11^8 = 214 358 881
Mais avec la source originale j'obtiens ça:
11^8 = 214 358 880
-> d'où le décalage de 1
En vérifiant avec la fonction sizeof, l'entier est codé sur 32bits donc largement suffisant pour 11^8.
Et ça dépend surtout du compilateur du coup ? Définir la taille de l'int sur 64bits ?
Puisque chez certains ça marchait avec le code source original...
ah le type c'est qui ça marchait il avait compilé chez lui
C'est quoi ca distrib linux ?
Debian avec Subtle WM et une joulie config
Xmonad plutôt.
Perdu, là c'est BSPWM