par Anonyme » 04 Avr 2008, 21:15
recoucou ! je vais encore vous embêter avec mon truc mais je dois rendre mon TP lundi et j'ai finis par comprendre pas mal de truc, 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:=abcdefghijklmnopqrstuvwxyz:
> 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)^var:
> 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