Bonjour,
je dois rendre un TP Maple lundi sur la cryptographie.. j'ai trouvé quelques algo et tutos trés utiles mais j'ai un soucis dans le tout dernier exo (je mettrai mon code à la fin)
alors en gros il faut décrire un protocole concret d'échanges RSA entre Alice et Bob
alors Alice veut transmettre un message M à Bod, pour cela elle le transforme en chiffre (c'est ce que fait ma procédure "texteàchiffre")
Bob choisit au hasard deux entiers premiers p et q (ma procédure gene_prem me fait ceci) puis on calcule n=pq et phi=(p-1)(q-1)
ensuite Bob choisit un entier premier avec phi au hasard (fonction gene_prem2)
on calcule à l'aide de igcdex l'inverse de e modulo phi que j'ai apelé d1
puis on crypte le message d'Alice en faisant C=M^e mod n
(j'ai utilisé un algo d'exponentiation rapide que j'ai trouvé dans un tuto parce que ça donne un chiffre trop gros pour Maple)
et normalement Bod peut décrypter le message en faisant C^d1 mod n (j'ai appelé le résultat de cette opération m) .. et normalement m doit être égal au message initial d'Alice M .. mon problème est la, ce n'est pas le cas !
j'ai testé toutes mes fonctions independemment les unes des autres, ça marche, je vois vraiment pas où est le soucis
donc je vous mets mon code
> restart:
> Alphabet:=abcdefghijklmnopqrst uvwxyz:
> nb_lettres:=length(Alphabet):
> for var to nb_lettres do
> lettre[var]:=substring(Alphabet,var..var) :
> od:
> lettre[0]:=` `:
> for var from 0 to nb_lettres do
> num_lettre[lettre[var]]:=var:
> od:
> texteachiffre := proc(expression)
> local var,resul,element:
> global nb_lettres:
> resul := 0:
> for var to length(expression) do
> element:=num_lettre[substring(expression,var..var)]:
> resul := resul+element*(nb_lettres+1)^v ar:
> od:
> end:
> M:=texteachiffre(`bonjour bob`);
> gene_Prem := proc()
> local test::integer:
> test := rand(10^6..10^7)();
> if(isprime(test))
> then
> return test
> else
> return(nextprime(test))
> fi:
> end:
>
> P:=gene_Prem();
> Q:=gene_Prem();
>
> N:=P*Q;
> PHI:=(P-1)(Q-1);
> gene_Prem2 := proc(n::integer)
> local tmp::integer,test::boolean:
> test := false:
> while (test=false) do
> tmp:=rand(10^6..10^7)():
> test := is(igcd(tmp,n)=1):
> od:
> return tmp:
> end:
>
> E:=gene_Prem2(PHI);
> igcd(E,PHI);
>
> igcdex(E,PHI,'D1','V');
> D1;
> #C:= M^E mod N;
>
> expomodulo:=proc(xx,nn,mm)
> local x,n,resul:
> x:=xx mod mm:
> resul:=1:
> n:=nn:
> while n>0 do
> if type(n,odd) then
> resul:=resul*x mod mm:
> n:=n-1:
> else x:=x*x mod mm:
> n:=n/2 fi:
> od:
> resul:
> end:
> C:=expomodulo(M,E,N);
> m:=expomodulo(C,D1,N);
> chiffreatexte := proc(nb)
> local var,liste,s:
> global nb_lettres:
> liste := convert(nb,base,nb_lettres+1):
> s:=seq(lettre[var],var = liste):
> cat(s):
> end:
> chiffreatexte(m);
merci pour votre aide, ça doit être une erreur débile mais à force d'avoir le nez dedans j'y vois plus rien lol
-----