Changeset 21ab56 in git


Ignore:
Timestamp:
Aug 7, 2008, 6:00:50 PM (16 years ago)
Author:
Hans Schönemann <hannes@…>
Branches:
(u'fieker-DuVal', '117eb8c30fc9e991c4decca4832b1d19036c4c65')(u'spielwiese', 'b4f17ed1d25f93d46dbe29e4b499baecc2fd51bb')
Children:
1747d96b7453246c6adbfeaa049fcdc86ce6baeb
Parents:
8aa6644ea35972e79663964572e177714af6c853
Message:
*pfister: code


git-svn-id: file:///usr/local/Singular/svn/trunk@10965 2c84dea3-7e68-4137-9b89-c4e89433aadc
File:
1 edited

Legend:

Unmodified
Added
Removed
  • Singular/LIB/crypto.lib

    r8aa664 r21ab56  
    11//GP, last modified 28.6.06
    22///////////////////////////////////////////////////////////////////////////////
    3 version="$Id: crypto.lib,v 1.4 2008-03-25 15:54:04 Singular Exp $";
     3version="$Id: crypto.lib,v 1.5 2008-08-07 16:00:50 Singular Exp $";
    44category="Teaching";
    55info="
     
    19541954}
    19551955
     1956static proc wordToNumber(string s)
     1957{
     1958   int i;
     1959   intvec v;
     1960   number n;
     1961   number t=27;
     1962   for(i=size(s);i>0;i--)
     1963   {
     1964      if(s[i]=="a"){v[i]=0;}
     1965      if(s[i]=="b"){v[i]=1;}
     1966      if(s[i]=="c"){v[i]=2;}
     1967      if(s[i]=="d"){v[i]=3;}
     1968      if(s[i]=="e"){v[i]=4;}
     1969      if(s[i]=="f"){v[i]=5;}
     1970      if(s[i]=="g"){v[i]=6;}
     1971      if(s[i]=="h"){v[i]=7;}
     1972      if(s[i]=="i"){v[i]=8;}
     1973      if(s[i]=="j"){v[i]=9;}
     1974      if(s[i]=="k"){v[i]=10;}
     1975      if(s[i]=="l"){v[i]=11;}
     1976      if(s[i]=="m"){v[i]=12;}
     1977      if(s[i]=="n"){v[i]=13;}
     1978      if(s[i]=="o"){v[i]=14;}
     1979      if(s[i]=="p"){v[i]=15;}
     1980      if(s[i]=="q"){v[i]=16;}
     1981      if(s[i]=="r"){v[i]=17;}
     1982      if(s[i]=="s"){v[i]=18;}
     1983      if(s[i]=="t"){v[i]=19;}
     1984      if(s[i]=="u"){v[i]=20;}
     1985      if(s[i]=="v"){v[i]=21;}
     1986      if(s[i]=="w"){v[i]=22;}
     1987      if(s[i]=="x"){v[i]=23;}
     1988      if(s[i]=="y"){v[i]=24;}
     1989      if(s[i]=="z"){v[i]=25;}
     1990      if(s[i]==" "){v[i]=26;}
     1991   }
     1992   for(i=1;i<=size(s);i++)
     1993   {
     1994      n=n+v[i]*t^(i-1);
     1995   }
     1996   return(n);
     1997}
     1998
     1999static proc numberToWord(number n)
     2000{
     2001   int i,j;
     2002   string v;
     2003   list s;
     2004   number t=27;
     2005   number mm;
     2006   number nn=n;
     2007   while(nn>t)
     2008   {
     2009      j++;
     2010      mm=nn mod t;
     2011      s[j]=mm;
     2012      nn=(nn-mm)/t;
     2013   }
     2014   j++;
     2015   s[j]=nn;
     2016   for(i=1;i<=j;i++)
     2017   {
     2018      if(s[i]==0){v=v+"a";}
     2019      if(s[i]==1){v=v+"b";}
     2020      if(s[i]==2){v=v+"c";}
     2021      if(s[i]==3){v=v+"d";}
     2022      if(s[i]==4){v=v+"e";}
     2023      if(s[i]==5){v=v+"f";}
     2024      if(s[i]==6){v=v+"g";}
     2025      if(s[i]==7){v=v+"h";}
     2026      if(s[i]==8){v=v+"i";}
     2027      if(s[i]==9){v=v+"j";}
     2028      if(s[i]==10){v=v+"k";}
     2029      if(s[i]==11){v=v+"l";}
     2030      if(s[i]==12){v=v+"m";}
     2031      if(s[i]==13){v=v+"n";}
     2032      if(s[i]==14){v=v+"o";}
     2033      if(s[i]==15){v=v+"p";}
     2034      if(s[i]==16){v=v+"q";}
     2035      if(s[i]==17){v=v+"r";}
     2036      if(s[i]==18){v=v+"s";}
     2037      if(s[i]==19){v=v+"t";}
     2038      if(s[i]==20){v=v+"u";}
     2039      if(s[i]==21){v=v+"v";}
     2040      if(s[i]==22){v=v+"w";}
     2041      if(s[i]==23){v=v+"x";}
     2042      if(s[i]==24){v=v+"y";}
     2043      if(s[i]==25){v=v+"z";}
     2044      if(s[i]==26){v=v+" ";}
     2045   }
     2046   return(v);
     2047}
     2048
     2049proc code(string s)
     2050"USAGE:  code(s); s a string
     2051ASSUME:  s contains only small letters and space
     2052COMPUTE: a number, RSA-coding of the string s
     2053RETURN:  return RSA-coding of the string s as string
     2054EXAMPLE: code;  shows an example
     2055"
     2056{
     2057   ring r=0,x,dp;
     2058   number
     2059p=398075086424064937397125500550386491199064362342526708406385189575946388957261768583317;
     2060   number
     2061q=472772146107435302536223071973048224632914695302097116459852171130520711256363590397527;
     2062   number n=p*q;
     2063   number phi=(p-1)*(q-1);
     2064   number e=1234567891;
     2065   list L=exgcdN(e,phi);
     2066   number d=L[1];
     2067   number m=wordToNumber(s);
     2068   number c=powerN(m,e,n);
     2069   string cc=string(c);
     2070   return(cc);
     2071}
     2072example
     2073{"EXAMPLE:";  echo = 2;
     2074  string s="i go to school";
     2075  code(s);
     2076}
     2077
     2078proc decode(string g)
     2079"USAGE:  decode(s); s a string
     2080ASSUME:  s is a string of a number, the output of code
     2081COMPUTE: a string, RSA-decoding of the string s
     2082RETURN:  return RSA-decoding of the string s as string
     2083EXAMPLE: decode;  shows an example
     2084"
     2085{
     2086   ring r=0,x,dp;
     2087   number
     2088p=398075086424064937397125500550386491199064362342526708406385189575946388957261768583317;
     2089   number
     2090q=472772146107435302536223071973048224632914695302097116459852171130520711256363590397527;
     2091   number n=p*q;
     2092   number phi=(p-1)*(q-1);
     2093   number e=1234567891;
     2094   list L=exgcdN(e,phi);
     2095   number d=L[1];
     2096   execute("number c="+g+";");
     2097   number f=powerN(c,d,n);
     2098   string s=numberToWord(f);
     2099   return(s);
     2100}
     2101example
     2102{"EXAMPLE:";  echo = 2;
     2103  string
     2104s="78638618599886548153321853785991541374544958648147340831959482696082179852616053583234149080198937632782579537867262780982185252913122030800897193851413140758915381848932565";
     2105  string t=decode(s);
     2106  t;
     2107}
    19562108
    19572109/*
Note: See TracChangeset for help on using the changeset viewer.