Blame view

Giac_maj/giac-1.4.9/examples/codage/rsa 2.35 KB
6663b6c9   adorian   projet complet av...
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
116
117
118
119
120
  chaine2n(m):={
  //chaine2n(m) transforme la chaine m en l'entier n 
  //m est l'ecriture de n dans la base 256 
  local l,n,s;
  s:=size(m);
  l:=asc(m);
  n:=0;
  for (k:=0;k<s;k++){
  n:=n*256+l[k];
  }
  return(n);
  };
  
  ecritu256(n):={
  //transforme l'entier n en son ecriture en base 256
  local s,r;
  //n est un entier et b=256, ecritu256 est une fonction iterative 
  //ecritu256(n)=le mot de caracteres l'ecriture de n en base 256 
  s:="";
  while (n>=256){
  r:=irem(n,256);
  r:=char(r);
  s:=r+s;
  n:=iquo(n,256);
  }
  n:=char(n);
  s:=n+s;
  return(s);
  };
  //mess est une chaine u:=115769854373006801 n:=152415790094497781
  codrsa(mess,u,n):={
  local s,j,j3,l,mot;
  s:=size(mess);
  j:=0;
  j3:=3;
  l:=[];
  //j est le nombre de paquets de 3 lettres
  while (j3<s) {
  mot:="";
  for (k:=j;k<j3;k++){
  mot:=mot+mess[k];
  }
  //on code le mot
  a:=chaine2n(mot);
  l:=append(l,powmod(a,u,n));
  j:=j3;
  j3:=j+3;
  }
  mot:="";
  for (k:=j;k<s;k++){
  mot:=mot+mess[k];
  }
  a:=chaine2n(mot);
  l:=append(l,powmod(a,u,n));
  return(l);
  };
  //l=codrsa(mess,u,n) m:=12345701 n:=152415790094497781
  decodrsa(l,m,n):={
  local mess,s,a,j,b;
  s:=size(l);
  mess:="";
  for (j:=0;j<s;j++){
  b:=l[j];
  a:=powmod(b,m,n);
  mess:=mess+ecritu256(a);
  }
  return(mess);
  };
  
  //mess=chaine 
  //u:=115769854373006801 n:=152415790094497781 (ma cle publique)
  //ntar:=184007032982289721 et mtar:=32345689 (cle secrete de Tar)
  codrsas(mess,u,n,mtar,ntar):={
  local s,j,j3,l,mot,a,b;
  s:=size(mess);
  j:=0;
  j3:=3;
  l:=[];
  //j est l'indice du premier element d'un paquet de 3 lettres
  while (j3<=s) {
  mot:="";
  for (k:=j;k<j3;k++){
  mot:=mot+mess[k];
  }
  //on code le mot
  a:=chaine2n(mot);
  b:=powmod(a,u,n); 
  //fct de codage selon la cle publique (u,n) du receveur puis
  //fct de decodage selon la cle secrete de l'envoyeur (mtar,ntar)
  l:=append(l,powmod(b,mtar,ntar));
  j:=j3;
  j3:=j+3;
  }
  //on code la derniere tranche du message
  mot:="";
  for (k:=j;k<s;k++){
  mot:=mot+mess[k];
  }
  a:=chaine2n(mot);
  b:=powmod(a,u,n);
  l:=append(l,powmod(b,mtar,ntar));
  return(l);
  };
  //l=codrsas(mess,u,n,mtar,ntar)
  // m:=12345701 n:=152415790094497781 ma cle secrete (receveur)
  //ntar:=184007032982289721 utar:=139035766756978009 cle pub de T 
  decodrsas(l,m,n,utar,ntar):={
  local mess,s,a,j,b;
  s:=size(l);
  mess:="";
  for (j:=0;j<s;j++){
  b:=l[j];
  //codage selon la cle publique (utar,ntar) de l'envoyeur (T)
  a:=powmod(b,utar,ntar);
  //d\'ecodage selon la cle secr\`ete du receveur (m,n) (moi)
  b:=powmod(a,m,n);
  mess:=mess+ecritu256(b);
  }
  return(mess);
  };