/* librairie RSA - juil 97 - par Sylvain Huet */ /* fonctions a usage interne */ fun RSAsizebis(n,b,i)= if (BigCmp b n) >0 then i else RSAsizebis n BigAdd b b i+1;; fun RSAsize(n)= RSAsizebis n BigFromAsc "1" 0;; fun RSAcryptone3(l,n,i1)= if l==nil then nil else let l->[m nxt] in (BigToStringn (BigMuln (BigMuln m m n) m n) i1)::RSAcryptone3 nxt n i1;; fun RSAcutstring(s,i,n)= let substr s i n -> z in if strlen z then z::RSAcutstring s i+n n else nil;; fun RSAdecryptone(l,k,n)= if l==nil then nil else let l->[m nxt] in (BigExpn BigFromString m k n)::RSAdecryptone nxt k n;; /* API */ /* decryptage d'un message s avec la cle privee n,k -> retourne une string */ fun RSAdecrypt(s,k,n)= let ((RSAsize n)-1)>>3 -> nbyte in BigListToString (RSAdecryptone (RSAcutstring s 0 nbyte+1) k n) nbyte;; /* cryptage d'un message s avec la cle publique n -> retourne une string */ fun RSAcrypt3(s,n)= let ((RSAsize n)-1)>>3 -> nbyte in strcatn RSAcryptone3 (BigListFromString s nbyte) n nbyte+1;; /* creation d'un couple clef publique-cle privee d'environ i bits (entre i et i-1) retourne le couple [n k]*/ fun RSAcreate3(i)= let [BigFromAsc "1" BigFromAsc "3"] -> [un trois] in let [BigPrimal i>>1 BigPrimal i-(i>>1)] ->[p q] in if ! BigCmp p q then RSAcreate3 i else let BigMul p q ->n in let BigMul BigSub p un BigSub q un -> phi in let BigInvn trois phi -> k in [n k];;