Réduire le Cracking
Bon j'ai pu prendre en main un windows en remote desktop, et debugger ton truc. Donc on arrive a un rond rose pale, avec un caré jaune qui se balade dedans, et la souris qui peut pas en sortir... Je vais voir pour te donner nom et serial correspondant maintenant, voir coder un keygen si possible, mais ca va donner des serials avec des caracteres non imprimables. Peut etre en 'injectant' le serial via le handle de l'edit, on va voir ca...
Pour l'algo en speed, ca prend la valeur ascii de la Xeme lettre du nom, ca l'ajoute a la valeur ascii de la Xeme lettre du serial, ca concatene ca dans une string en decimal, et c'est comparer avec une constante. Voila
Pour l'algo en speed, ca prend la valeur ascii de la Xeme lettre du nom, ca l'ajoute a la valeur ascii de la Xeme lettre du serial, ca concatene ca dans une string en decimal, et c'est comparer avec une constante. Voila
Je vois que tu as essayé donc ce message et en partie faux, mais tu demandes des cracks-me et après tu rales qu'ils ne sont pas "comme tu veux"AYBABTU a écrit :Je sais très bien que c'est un forum PureBasic, c'est suffisament écrit gros en haut pour le savoirOliv a écrit :Tu es sur un forum poyr PUREBASIC, ne l'oublions pas..... Certains selectionnent des messages, d'autres oublient le sujet du forumAYBABTU a écrit : pas en WinDev...).Mais comme PureBasic m'a l'air d'etre un langage sympa (sans avoir testé) je prefere dire que WinDev n'est pas un vrai langage parce que je sais que certain le pratique ici. (sans vouloir viser quelqu'un)
gangsta93, retourne chez ta maman et laisse les grandes personnes parler entres elles.
Dobro, je parlais du niveau de Zorglub, pas du mien. Encore une fois quelqu'un qui fait un raccourcis facile... Suffit que je parle de cracking pour que je sois un adolescent boutonneux, pretentieux, vaniteux, qui pense etre une leet ? tsss...
De toute facon il m'est tout a fait impossible de faire ce crackme, étant donné que je suis sous linux. Je veux bien le lancer avec Wine mais pas possible de le debugger. Je peux prevenir des personnes si tu veux, c'est le max. que je puisse faire ce soir.
EDIT: Ca plante sous Wine de toute facon, je peux meme pas voir a quoi ca ressemble.
Gansta93 : C'était justement pour te montrer que tes 3-4 derniers messages ne servent à rien

Certaines personnes donnent leur avis, même si on leur dit qu'il sont pathétiques ou autre.....

Hum tu dois pas connaitre Wine. Wine est un programme qui permet de faire fonctionner certains logiciels windows sous linux. Mais je dis bien fonctionner, et pas debugger. Je peux pas lancer mon debugger avec wine, il tournerait pas sous linux. Donc au moment de l'edit, non je n'avais pas testé sous windows. Il plantait sous wine, cad sous linux, et c'etait tres surement normal (c'est en testant sous windows ensuite, en remote desktop, cad depuis ma machine sous linux, en me connectant sur une machine sous windows xp et en en prennant le controle, que j'ai vu que le plantage était normal et qu'il avait lieu meme sous windows)Oliv a écrit : Je vois que tu as essayé donc ce message et en partie faux, mais tu demandes des cracks-me et après tu rales qu'ils ne sont pas "comme tu veux"
Dobro, tu ne vois pas de probleme a ce que je continue ca demain ? Il commence a se faire tard, et j'ai des obligations demain matin.
sisi je connais Wine mais ce qui m'a étonné c'est que tu demandes des cracksme et quand t'en as tu dis que tu ne vas même pas essayer de le faire, enfait tu l'a fait, donc je m'écraseAYBABTU a écrit :Hum tu dois pas connaitre Wine. Wine est un programme qui permet de faire fonctionner certains logiciels windows sous linux. Mais je dis bien fonctionner, et pas debugger. Je peux pas lancer mon debugger avec wine, il tournerait pas sous linux. Donc au moment de l'edit, non je n'avais pas testé sous windows. Il plantait sous wine, cad sous linux, et c'etait tres surement normal (c'est en testant sous windows ensuite, en remote desktop, cad depuis ma machine sous linux, en me connectant sur une machine sous windows xp et en en prennant le controle, que j'ai vu que le plantage était normal et qu'il avait lieu meme sous windows)Oliv a écrit : Je vois que tu as essayé donc ce message et en partie faux, mais tu demandes des cracks-me et après tu rales qu'ils ne sont pas "comme tu veux"
Dobro, tu ne vois pas de probleme a ce que je continue ca demain ? Il commence a se faire tard, et j'ai des obligations demain matin.



le nom etait "rien ne sert de courrir il faut partir a point"
et le pass etait , "dobro est le roi du Dobro"
ce qui fait correspondre a la constante (dont je ne regarde que les
130 premiers characteres ! , bien sur le test aurai pu etre plus long !
puisque j'avais autorisé un pass et un nom de 1000 characteres !
vraiment impressionant j'avais essayé de te perdre avec des faux
tests, t'a pas ete dupe Bravo encore

puis je me suis dit on va pas utiliser Xor en plus , j'aurai peut etre du

j'avait ajouter un timer au cas ou tu "ponte" un ou 2 test
de façon a planter le programme au cas ou !
mais bon vu que t'es pas un mancho t'a tracer comme il faut la routine de control , ce qui t'a ammener a comprendre !!
c'est vrais que le test en lui meme n'etait pas compliqué ;
puisque la constante apparait tres clairement dans OllyDbg , par exemple


Comparer par rapport a une constante , etait evident pour un cracker "moyen ou fort" , un petit "nopeur ou une JNZeur" moyen aurai peut etre bloqué quand meme !
la presence de faux numero de code est une astuce pour perdre les debutant traceur ! car il se disent , "facile le code apparait en clair dans le listing" !!!
la pour mon Crack me , j'en ai mis trop, du coup cela perd en credibilitée !!:D
j'essairai de t'en faire un plus dur un de ces 4

voici le listing en purebasic :
vous y verrez les multiples tests bidons pour embrouiller un peut le "traceur"
,plus on en met , plus le gars qui trace se fatigue , la il n'y en a manifestement pas assez !! y en faudrai 1000 avec des goto a la spagueti !!

Code : Tout sélectionner
; prg crée par Dobro
; en pure basic 3.94 beta4
; a l'aide de Japbe !!! <--ça marche avec !! :D
Declare TimerProc(hwnd.l, uMsg.l, idEvent.l, dwTime.l)
ept.s="21421421619922414314220214723113322221764214212137131211234146182216212"
nom$ = InputRequester("crackme", "entrez votre nom", "")
pass$ = InputRequester("entrez le code", "le mot de pass", "")
Dim c$(10000)
Dim car$(10000)
Dim car2$(10000)
For t=0 To Len(nom$)
car$(t)=Mid(nom$,t,1)
Next t
For t=0 To Len(pass$)
car2$(t)=Mid(pass$,t,1)
Next t
For t=0 To 10000
c$(t)=Str(Asc(car$(t))+Asc(car2$(t)))
do$=do$+c$(t)
Next t
If do$<>"5"
EndIf
Goto 150
200:
If c$(5)<>"15354564-565465"
Goto suite
EndIf
suite:
If c$(5)<>"15354564-565465-dgdf4454"
c$(5)="ok le code est bon !! "
Else
c$(45)= "le code n'est pas bon !"
EndIf
If c$(8)<>"15354564-565465"
Goto suite2
EndIf
suite2:
If c$(8)<>"15354564-565465-dgdf4454"
c$(8)="ok le code est bon !! "
Else
c$(45)= "le code n'est pas bon !"
EndIf
If c$(8)<>"15354564-56ffjfg465-fgh554-fprizjcpz"
Goto suite3
EndIf
suite3:
If c$(8)<>"15354564-565465-dgdf4454-654erorer5"
c$(8)="ok le code est bon !! "
Else
c$(45)= "le code n'est pas bon !"
EndIf
If c$(8)<>"15354564-565dfhsn5-fgh554-fprizjcpz"
Goto suite4
EndIf
suite4:
If c$(8)<>"15354564-565465-dgdf4454-654erorer5"
c$(8)="ok le code est bon !! "
Else
c$(45)= "le code n'est pas bon !"
EndIf
If c$(8)<>"15354564-56sfnsf-65-fgh554-fprizjcpz"
Goto suite5
EndIf
suite5:
If c$(8)<>"15354564-565465-dgdf4454-654erorer5"
c$(8)="ok le code est bon !! "
Else
c$(45)= "le code n'est pas bon !"
EndIf
If c$(8)<>"15354564-565dndg--5-fgh554-fprizjcpz"
Goto suite6
EndIf
suite6:
If c$(8)<>"15354564-565465-dgdf4454-654erorer5"
c$(8)="ok le code est bon !! "
Else
c$(45)= "le code n'est pas bon !"
EndIf
uop.s="6199224143142202147231133222217642142"
If c$(8)<>"15354564-565465-fgh554-fprizjcpz"
Goto suite7
EndIf
suite7:
If c$(8)<>"15354564-565dgn---dgdf4454-654erorer5"
c$(8)="ok le code est bon !! "
Else
c$(45)= "le code n'est pas bon !"
EndIf
If c$(8)<>"15354564-565465-fgh554-fprizjcpz"
Goto suite8
EndIf
suite8:
If c$(8)<>"15354564-565465-dgdf4454-654erorer5"
c$(8)="ok le code est bon !! "
Else
c$(45)= "le code n'est pas bon !"
EndIf
risk.s="14621610832102971171163211297114116105114329732112111105110116"
If c$(8)<>"15354564-565465-fgh554-fprizjcpz"
Goto suite9
EndIf
suite9:
If c$(8)<>"15dgn6546545465gn--64-565465-dgdf4454-654erorer5"
c$(8)="ok le code est bon !! "
Else
c$(45)= "le code n'est pas bon !"
EndIf
If c$(8)<>"153545dgn-dgn54dgn64-565465-fgh554-fprizjcpz"
Goto suite10
EndIf
suite10:
If c$(8)<>"15354564-565465-dgdf4454-654erorer5"
c$(8)="ok le code est bon !! "
Else
c$(45)= "le code n'est pas bon !"
EndIf
Goto zaza
toto:
If c$(13)<>Chr(50)
Dim c$(10)
EndIf
toto5 :
InitSprite()
InitMouse()
top$=ept
top2$=risk
top3$=uop
top$=top$+top2$+top3$
CallDebugger
Debug top$
Debug do$
If Left(do$,130)<>Left(top$,130)
do$=Chr(45)
top$=do$+Right(do$,130)
tii=tii+1
Goto suite12
EndIf
For t=1 To Len (top$)
Next t
Declare Forme(forme)
If OpenWindow(0, 0, 0, 400, 400, #PB_Window_BorderLess | #PB_Window_ScreenCentered, "Test") = 0 Or CreateGadgetList(WindowID(0)) = 0
End
EndIf
WindowID = WindowID(0)
If tti>0
ru=1
EndIf
SetTimer_(Handle,ru, 5000, @TimerProc()) ; envoie un evenement toutes les 1000 millisecondes
OpenWindowedScreen(WindowID, 0, 0, 400, 400, AutoStretch, 1, 1)
CreateSprite(1, 32,32)
StartDrawing(SpriteOutput(1))
Box(0, 0,32, 32,RGB($F1,$FD,$1A) )
StopDrawing()
Forme(2)
; change le chifre = change la forme !!!
; forme(0) = rectangle
; Forme(1) = rectangle avec bord arrondi
; Forme(2)= rond !!!
; Forme(3)=Triangle
; forme(4)=rectangle avec trou
; forme(5)=rond+triangle
sensx=10/2
sensy=16/2
Repeat
If tii>1000
End
EndIf
ExamineMouse()
If MouseButton(2) ; si clique bouton droit
End ; on quitte
EndIf
xp=xp+sensx
yp=yp+sensy
If xp+32>400 : sensx=-sensx:EndIf
If xp<0 : sensx=-sensx:EndIf
If yp+32>400 : sensy=-sensy:EndIf
If yp<0 : sensy=-sensy:EndIf
DisplaySprite(1, xp, yp)
FlipBuffers()
ClearScreen(255, 100, 100)
ForEver
End
; les procedures
Procedure Forme(forme)
Select forme
Case 1
Region = CreateRoundRectRgn_(0, 0, WindowWidth(), WindowHeight(), 40, 60) ; Création de la région pour faire une fenêtre avec les angles arrondis
; CreateRoundRectRgn_(X1, Y1, X2, Y2, R1, R2)
; X1, Y1 : coordonné du point haut gauche de la region
; X1, Y1 : coordonné du point haut gauche de la region
; R1, R2 : rayon de l'ellipse qui va servir à arrondir les angles de la region
SetWindowRgn_(WindowID(), Region, #True) ; On applique la région
DeleteObject_(Region) ; On supprime la région
Case 2
Region = CreateEllipticRgn_(0, 0, WindowWidth(), WindowHeight()) ; Création de la région pour faire une fenêtre elliptique
; CreateEllipticRgn_(X1, Y1, X2, Y2)
; X1, Y1 : coordonné du point haut gauche de la region
; X1, Y1 : coordonné du point haut gauche de la region
SetWindowRgn_(WindowID(), Region, #True) ; On applique la région
DeleteObject_(Region) ; On supprime la région
Case 3
Region = CreatePolygonRgn_(?Triangle, 4, #ALTERNATE) ; Création de la région pour faire une fenêtre elliptique
; CreateRoundRectRgn_(Array, NbPoints, Type)
; Array : Adresse de la liste ou de la Data
; NbPoints : Nombre de points du polygone + 1 (car on fait une boucle donc on a 2 fois le premier point)
; Type : Voir msdn
SetWindowRgn_(WindowID(), Region, #True) ; On applique la région
DeleteObject_(Region) ; On supprime la région
Case 4 ; rectangle
Region1 = CreateRectRgn_(0, 0, WindowWidth(), WindowHeight()) ; Création d'une région en rectangle
Region2 = CreateRectRgn_(10, 10, WindowWidth() - 10, 50) ; Création d'une région en rectangle
; CreateRectRgn_(X1, Y1, X2, Y2)
; X1, Y1 : coordonné du point haut gauche de la region
; X1, Y1 : coordonné du point haut gauche de la region
CombineRgn_(Region1, Region1, Region2, #RGN_DIFF) ; On combine les 2 régions
; Les modes suivants sont disponibles :
; #RGN_AND : Intersection
; #RGN_OR : Union
; #RGN_DIFF : Différences
; #RGN_XOR : Union moins les intersections
SetWindowRgn_(WindowID(), Region1, #True) ; On applique la région finale
DeleteObject_(Region1) ; On supprime les régions
DeleteObject_(Region2)
Case 5
Region1 = CreatePolygonRgn_(?Triangle, 4, #ALTERNATE)
Region2 = CreateEllipticRgn_(0, 0, WindowWidth(), WindowHeight())
CombineRgn_(Region1, Region1, Region2, #RGN_OR) ; On combine les 2 régions
SetWindowRgn_(WindowID(), Region1, #True) ; On applique la région finale
DeleteObject_(Region1) ; On supprime les régions
DeleteObject_(Region2)
EndSelect
EndProcedure
DataSection
Triangle :
Data.l 200, 400, 0, 0, 400, 0, 200, 400 ; Coordonnées des points du triangle en x, y (il faut faire une boucle donc on revient au premier point du triangle
EndDataSection
150:
Goto 200
zaza:
If c$(8)<>"15354564-565465-fgh554-fprizjcpz"
Goto suite11
EndIf
suite11:
If c$(8)<>"15354564-565ffgh465-dgdf4454-654erorer5"
c$(8)="ok le code est bon !! "
Else
c$(45)= "le code n'est pas bon !"
EndIf
If c$(8)<>"153545464534-565465-fgh554-fprizjcpz"
Goto suite12
EndIf
suite12:
If c$(8)<>"15354565454-4453*--4-565465-dgdf4454-654erorer5"
c$(8)="ok le code est bon !! "
Else
c$(45)= "le code n'est pas bon !"
EndIf
If c$(8)<>"15354564-5654689865--6565--5-fgh554-fprizjcpz"
Goto suite13
EndIf
suite13:
If c$(8)<>"15354564-5654554--65-dgdf4454-654erorer5"
c$(8)="ok le code est bon !! "
Else
c$(45)= "le code n'est pas bon !"
EndIf
If c$(8)<>"15354564-54645655453-895453-89+899+465-fgh554-fpriz4534jcpz"
Goto suite14
EndIf
suite14:
If c$(8)<>"15354564-56ddfb5468765-465-dgdf4454-654erorer5"
c$(8)="ok le code est bon !! "
Else
c$(45)= "le code n'est pas bon !"
EndIf
If c$(8)<>"15354564-578338378fgh554-fprizjcpz"
Goto suite15
EndIf
suite15:
If c$(8)<>"15354564-565465-dgdf4454-654erorer5"
c$(8)="ok le code est bon !! "
Else
c$(45)= "le code n'est pas bon !"
EndIf
If c$(8)<>"15354564-565785378-fgh554-fprizjcpz"
Goto suite16
EndIf
suite16:
If c$(8)<>"15354564-565465-dg78378374-654erorer5"
c$(8)="ok le code est bon !! "
Else
c$(45)= "le code n'est pas bon !"
EndIf
If c$(8)<>"15354564-565465456445567834343874-fprizjcpz"
Goto suite17
EndIf
suite17:
If c$(8)<>"15354564-565465-dgdf4444564554-654erorer5"
c$(8)="ok le code est bon !! "
Else
c$(45)= "le code n'est pas bon !"
EndIf
If c$(8)<>"15354564-565465-fgh554-fprizjcpz"
Goto suite18
EndIf
suite18:
If c$(8)<>"15354564-565465-dgdf4454-654erorer5"
c$(8)="ok le code est bon !! "
Else
c$(45)= "le code n'est pas bon !"
EndIf
Goto toto
Procedure TimerProc(hwnd.l, uMsg.l, idEvent.l, dwTime.l)
Select uMsg
Case #WM_TIMER
Select idEvent
Case 1
MessageRequester("hello", "pas encore pas encore :D" , #PB_MessageRequester_Ok)
End
Case 2
Case 3
EndSelect
EndSelect
EndProcedure
je me pose quand meme une question!
mon petit algo prend une lettre du nom , l'additionne avec une lettre du pass
puis je la pose dans une variable , comment a tu pu retrouver les mot exacte
car le chemin inverse n'est pas evident !
en effet si l'on additionne le code ascii de "A" et de "B" on obtient la valeur
65+66=131 <=== ceci est le chiffre que tu retrouve dans la constante
1- comment sait tu qu'il ne sagit pas de 13 et de 1 qui se suivent ?
2- 131 peut etre obtenu par plein de combinaison
par exemple la lettre "3" code 51 + la lettre "P" code 80
a partir de la comment as tu pu retrouver les mots exacte du nom
et du pass ?
Comment n'as tu pas pensé que le nom pouvais etre n'importe quoi ?
ainsi que le pass ?
la j'avoue que j'ai du mal a comprendre comment t'as raisonné !!
ici , je pense que cela interresserai beaucoup tout le monde
plus que les insultes de ton Con_frere Bulgroz !
(j'ai pensé que vous etiez la meme personne , mais je crois pas en fait
mon petit algo prend une lettre du nom , l'additionne avec une lettre du pass
puis je la pose dans une variable , comment a tu pu retrouver les mot exacte
car le chemin inverse n'est pas evident !
en effet si l'on additionne le code ascii de "A" et de "B" on obtient la valeur
65+66=131 <=== ceci est le chiffre que tu retrouve dans la constante
1- comment sait tu qu'il ne sagit pas de 13 et de 1 qui se suivent ?
2- 131 peut etre obtenu par plein de combinaison
par exemple la lettre "3" code 51 + la lettre "P" code 80
a partir de la comment as tu pu retrouver les mots exacte du nom
et du pass ?


Comment n'as tu pas pensé que le nom pouvais etre n'importe quoi ?
ainsi que le pass ?
la j'avoue que j'ai du mal a comprendre comment t'as raisonné !!
ici , je pense que cela interresserai beaucoup tout le monde

plus que les insultes de ton Con_frere Bulgroz !
(j'ai pensé que vous etiez la meme personne , mais je crois pas en fait

Dobro a écrit :je me pose quand meme une question!
mon petit algo prend une lettre du nom , l'additionne avec une lettre du pass
puis je la pose dans une variable , comment a tu pu retrouver les mot exacte
car le chemin inverse n'est pas evident !
en effet si l'on additionne le code ascii de "A" et de "B" on obtient la valeur
65+66=131 <=== ceci est le chiffre que tu retrouve dans la constante
1- comment sait tu qu'il ne sagit pas de 13 et de 1 qui se suivent ?
2- 131 peut etre obtenu par plein de combinaison
par exemple la lettre "3" code 51 + la lettre "P" code 80
a partir de la comment as tu pu retrouver les mots exacte du nom
et du pass ?![]()
![]()
Comment n'as tu pas pensé que le nom pouvais etre n'importe quoi ?
ainsi que le pass ?
la j'avoue que j'ai du mal a comprendre comment t'as raisonné !!
ici , je pense que cela interresserai beaucoup tout le monde
plus que les insultes de ton Con_frere Bulgroz !
(j'ai pensé que vous etiez la meme personne , mais je crois pas en fait
Alors, en effet la premiere étape a été de decouper la chaine de caractères de facon a obtenir des valeurs decimals plausibles. Comme il s'agissait d'addition de valeur ascii, on pouvait deja avoir une valeur minimale 96 ('0' = 48; 48+48 = 96) et maximale 244 ('z' = 122; 122+122 = 244) On commence donc à découper la chaine, et en fesant ça, je me dit qu'il y a de forte chance que le nom et le mot de passe ne soit pas de la meme longueur, et donc qu'à la fin de la chaine il y ait les valeurs directement du nom, ou du mot de passe. (les valeurs min et max sont donc 48 et 122 pour la fin) Le truc le plus chiant c'est qu'en general on travaille en base hexadecimale et que je me suis melangé les pinceaux a un moment entre les 2 bases, quand je fesais mes calculs a la main.
Une fois qu'on a ça, on "décrypte" la fin (je l'ai fait à la main) et on trouve un truc comme "l faut partir a poin". A la base, j'étais partis pour decrypter la fin à la main, et ensuite coder un petite programme qui m'aurait sortis toutes les solutions possibles du debut, avec les caracteres imprimables uniquement, et de là garder uniquement le bon. Un bon vieux bruteforce pas tres compliqué à mettre en place. Mais là comme il était facile de reconnaitre le proverbe (meme sans le 't' final :p), j'ai pu donc me dire que le mot de passe était "rien ne sert de courrir il faut partir a point" (d'autant plus qu'il y avait pile-poil le bon nombre de caractères), et de là, une simple boucle avec le mot de passe et la chaine cryptée m'a donné le nom.
Et ouais, y'avait trop de faux serials en clair, dès que j'ai vu ça je me suis dis directement que c'etait tous des faux

Au fait, non je ne suis pas Zorglub, mais il est bien meilleur que moi.
je faisai allusion a Bulgroz !! (l'insulteur) ....Au fait, non je ne suis pas Zorglub, mais il est bien meilleur que moi.
pas a Zorglub (avec qui le courrant est relativement bien passé !

Merci pour ton explication !!
leçons bien aprise : je saurai qu'il faut mettre un pass de la meme longueur qu'un nom
qu'il vaut mieux cripter au maximum les données
mettre des pseudo verification plus realiste ect ...
comme quoi la discution avec des crackers peut etre riche d'enseignements ! (sans forcement etre bordé d'insulte et de "J'me la pete car Moa je suis le plus grand cracker-Belin de la planete "
Merci

C'est la meme personneDobro a écrit :
je faisai allusion a Bulgroz !! (l'insulteur) ....
pas a Zorglub (avec qui le courrant est relativement bien passé !)


Et encore, meme si le nom et le serial était de longeur identique, il etait pas difficile de coder le bruteforcer pour donner des combinaisons qui valident l'algo meme si le nom et le mot de passe ne veulent rien dire, voir meme retrouver les bons parametres avec un peu de chanceDobro a écrit : leçons bien aprise : je saurai qu'il faut mettre un pass de la meme longueur qu'un nom
qu'il vaut mieux cripter au maximum les données
mettre des pseudo verification plus realiste ect ...
Merci

La protection la plus serieuse reste, comme dit dans un autre post, de distribuer une version de Demo sans toutes les fonctionnalités. Mais ça peut toujours se faire avoir (piratage du site et obtention de la version complete, piratage d'un utilisateur enregistré trouvé via le forum de l'auteur, achat avec une fausse carte bancaire (meme si je crois que c'est plutot blindé maintenant) voir meme réel achat par un mecene

Si vous voulez faire un truc non keygennable, il faut aller dans la crypto dure, avec des RSA-1024 ou des courbes elliptiques (bien implementé de preference

