Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 Kryptografi med Elliptiske kurver med perspektiv til Suite B CHRISTEL BACH KRYPTOLOGI C, MASTERPROJEKT, 2010 MASTER I KRYPTOLOGI ÅRHUS UNIVERSITET 1 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 Kryptografi med Elliptiske kurver med perspektiv til Suite B CHRISTEL BACH Forord 31. juli 2010 Nærværende materiale er skrevet som afsluttende opgave i forbindelse med Master i Kryptologi, Kryptologi C, Århus Universitet, mellem 2006 og 2010. Det er desuden med visse modifikationer eventuelt tænkt anvendt i en undervisningssammenhæng i forbindelse med modulet βSecurityβ til uddannelserne Professionsbachelor Software Udvikling og Professionsbachelor Web Udvikling. Bekendtgørelsen for dette modul kan ses i bilag C2. Det ligger dog uden for modulets kerneområder og vil være at betragte som emne for særligt interesserede. Der vil derfor være både grundlæggende forklaringer, og referencer til videre studier af emnet. 01.oktober 2010. Denne version 1.4 indeholder flere smårettelser samt udvidede eksempler på pohlighellmann angreb, complex multiplikation o.a. samt et par ekstra bilag, alt sammen udarbejdet til master forsvaret der fandt sted 28.09.2010. Desuden er et par åbenlyse matematiske fejl og protokol fejl i version 1.0 af denne opgave, påvist ved forsvaret , rettet og skrevet om. Tak til mine børn for at have udholdt lange perioder med alt for meget fokus på masteruddannelsen. Tak til mine kolleger for aldrig at tvivle. En særlig tak til Niels og Marlene. 2 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 Indhold FORORD............................................................................................................................. 2 1. INTRODUKTION ......................................................................................................... 6 2. ELLIPTISKE KURVER OVER ENDELIGE LEGEMER FP....................................................... 7 3. ELLIPTISKE KURVER OVER DET ENDELIGE LEGEME F2M ................................................ 8 4. ECDLP, ELLIPTISK KURVE DISKRET LOGARITME PROBLEM .......................................... 9 5. EGNEDE OG UEGNEDE KURVER OG DOMÆNEPARAMETRE ........................................ 9 DISKRIMINANTEN....................................................................................................................... 9 SUPERSINGULÆRE KURVER ........................................................................................................ 10 ANORMALE KURVER ................................................................................................................. 10 ANORMALE BINÆRE KURVER β KOBLITZ KURVER............................................................................ 10 BINÆRE LEGEMER AF SAMMENSAT ORDEN ................................................................................... 10 NÆSTEN PRIMTALSORDEN ......................................................................................................... 10 BASEPUNKTET SOM GENERATOR ................................................................................................. 10 PSEUDO-RANDOMISERING......................................................................................................... 11 DOMÆNEPARAMETER GENERERING OG VALIDERING ...................................................................... 11 ANBEFALINGER OG NIST ........................................................................................................... 11 6. ANTAL PUNKTER PÅ KURVEN ................................................................................... 12 HASSES SÆTNING ..................................................................................................................... 12 3 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 ANTALLET AF PUNKTER PÅ BINÆRE KURVER #π¬π¬(ππππππ ) ............................................................... 13 SCHOOFS ALGORITME ............................................................................................................... 13 KOMPLEKS MULTIPLIKATION (CM) METODE ................................................................................. 14 COMPLEX MULTIPLIKATION β GENNEMREGNET EKSEMPEL ............................................................... 14 7. ANGREB - MÅDER AT FINDE N FOR NP= Q ................................................................ 15 WEIL PAIRRING OG MOV ATTACK .............................................................................................. 16 POLLARDS RHO METODE ........................................................................................................... 17 POHLIG β HELLMAN METODE..................................................................................................... 17 POHLIG-HELLMANN ANGREB GENNEMREGNET.............................................................................. 18 8. SUITE B .................................................................................................................... 19 NIST ANBEFALINGER ................................................................................................................ 20 Legemer ...............................................................................................................20 OPTIMERING PÅ NIST KURVER β NUMERISK EKSEMPEL .................................................................. 21 Matematiske rutiner på p192 ..............................................................................21 Det ses altså at være langt enklere at regne via de optimerede rutiner. ...........22 Binære legemer....................................................................................................22 NIST kurver ...........................................................................................................22 Valg af reduktionspolynomium............................................................................22 9. GENERERING OG VERIFIKATION AF DOMÆNE PARAMETRE ..................................... 23 VERIFIKATION.......................................................................................................................... 24 Sha1 hashing af hexværdier .................................................................................26 Verifikation af P-192 ............................................................................................27 Yderligere verifikationsovervejelser: ...................................................................29 Eksempel - At konstruere r for P-224 ..................................................................29 Test af domæneparametre for P-224: .................................................................30 Test af domæne parametre for P-521 ................................................................31 10. IMPLEMENTATIONSOVERVEJELSER: ...................................................................... 32 STORE TAL - BIGINTEGERS ......................................................................................................... 32 MODULÆR MULTIPLIKATIV INVERS .............................................................................................. 33 KVADRATRØDDER MODULUS P IMPLEMENTATION ......................................................................... 34 PUNKTET I UENDELIG - HOMOGENE KOORDINATER ....................................................................... 37 βDOUBLE AND ADDβ ALGORITME ................................................................................................. 38 Hurtig potensopløftnings algoritmen ..................................................................38 11. KRYPTOGRAFISK ANVENDELSE AF ELLIPTISKE KURVER .......................................... 39 PRINCIPPER BAG ELLIPTIC DIFFIE-HELLMAN NØGLE UDVEKSLING ...................................................... 39 Eksempel på Diffie-Hellman nøgleudveksling med P-192 ...................................39 PRINCIPPER BAG EC ELGAMAL PUBLIC KEY KRYPTOSYSTEM ............................................................ 40 At repræsentere klartekst med punkter på elliptiske kurver ..............................41 MV ELGAMAL - MENEZES β VANSTONE VARIANTEN AF ELGAMAL ................................................... 44 Beskedudvidelse: .................................................................................................45 Eksempel: .............................................................................................................45 Fra klartekst til ASCII værdier og fra ASCII til klartekst ........................................47 4 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 ECDSA β DIGITAL SIGNATUR MED ELLIPTISKE KURVER ................................................................... 49 Lille ECDSA eksempel ...........................................................................................50 ECDSA eksempel med P-192 ................................................................................51 12. IMPLEMENTATION AF MV ELGAMAL ECC .............................................................. 52 13. PAKKELØSNINGER, BIBLIOTEKER OG ANDRE IMPLEMENTATIONER ....................... 54 ILLUSTRATIVE IMPLEMENTATIONER AF KRYPTOGRAFI MED EC .......................................................... 54 SUPPORT AF SUITE B I .NET ...................................................................................................... 55 ANDRE LØSNINGER - BOUNCY CASTLE ......................................................................................... 55 14. ECC VERSUS RSA ................................................................................................... 55 15. DANSKE STANDARDER PÅ OMRÅDET FOR DIGITAL SIGNATUR OG SIKKER KOMMUNIKATION: .......................................................................................................... 56 16. AFRUNDING OG KONKLUSION .............................................................................. 57 EFTERSKRIFT ........................................................................................................................... 57 17. LITTERATUR HENVISNINGER ................................................................................. 59 18. OVERSIGT OVER BILAG: ........................................................................................ 60 19. ECC KILDEKODE TIL IMPLEMENTATION AF ELLIPTISK KURVE KRYPTOGRAFI MV ELGAMAL 60 20. Kryptering og dekryptering af beskeder med NIST kurver baseret på primlegemer og kurven Y^2=X^3+AX+B i C#.NET ..............................................60 SUPPLERENDE PÆDAGOGISKE MATEMATISKE BILAG ............................................ 73 Kort oversigt over algebraiske strukturer: ...........................................................73 Homomorfi β endomorfi -isomorfi ......................................................................74 Afbildinger ............................................................................................................74 Grundlæggende om Elliptiske kurver ..................................................................75 Diskriminanten og singulære punkter .................................................................78 Mathematica visualisering ...................................................................................79 Punktaddition på R β kode eksempel i javascript ................................................80 Multiplicativ invers modulus p - kodeeksempel i javascript ...............................81 ElGamal og DLP ....................................................................................................82 Kvadratroden af store tal .....................................................................................83 RSA protokol og implementation ........................................................................83 Tidskomplexitet med regneeksempler på elliptiske kurver ................................88 MIPS β antal millioner instruktioner pr sekund ...................................................88 Eksempel: At lede efter kvadrattal ......................................................................89 Eksempel: Antallet af punkter der beregnes med Schoofs algoritme tidskompleksitet ..................................................................................................89 Eksempel β Pollards Rho metode: .......................................................................89 Kan man lave en tabel over tP på en NIST kurve? ...............................................90 21. 5 ØVRIGE BILAG: ..................................................................................................... 90 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 Danske standarder ...............................................................................................90 Studieordning.......................................................................................................92 1. Introduktion Grundlæggende indføring i emnet elliptiske kurver over R er inkluderet i bilag B2. Man vil også kunne se en visualisering af elliptiske kurver hos wolfram.com 1 Et lille demonstrationseksempel på punktaddition i R er vedlagt som i kildekode i bilagB5. Da der vil blive anvendt algebraisk terminologi er der i bilag B1 en kort oversigt over algebraiske strukturer Ved kryptografisk anvendelse af elliptiske kurver(EC) anvendes elliptiske kurver over endelige legemer. Denne gennemgang vil være organiseret således at grundlæggende egenskaber for kurver over endelige legemer først gennemgås, herunder forskellige typer af legemer og overvejelser omkring valg af basis i relation til implementation. Herefter præciseres forudsætninger for hvilke kurver der er egnet til kryptografisk brug De i Suite B anbefalede såkaldte NIST kurver og domæneparametre vil blive gennemgået, diskuteret og forsøgt verificeret via forskellige metoder. Efterfølgende vil en række protokoller for klassiske kryptografiske anvendelser af EC blive gennemgået. I denne forbindelse vil jeg diskutere og vise forskellige implementationsovervejelser til demonstrationsbrug og give eksempler på disse. Implementationerne vil IKKE være egnet til industristandard og tjener primært illustrative og pædagogiske formål. Kodeeksempler vil primært være programmeret i C#.NET og alle vedlagte eksempler kan afprøves på http://www.christelbach.com En hel anden anvendelsesdimension af elliptiske kurver, nemlig Lenstraβs Elliptiske Kurve Metode(ECM) til primtalsfaktorisering vil ikke blive berørt da det var emnet for min eksamensopgave i modulet KryptologiB 2 1 2 http://demonstrations.wolfram.com/RealEllipticCurves/ http://christel.dk/krypto/Den_elliptiske_faelde-kopi.pdf 6 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 2. Elliptiske kurver over endelige legemer Fp Til kryptografisk brug betragter vi punkter P og Q på en elliptisk kurver over et endeligt legeme. Vi knytter regneoperationer på disse punkter der gør E(Fp) til en gruppe. Et endeligt legeme består af et endeligt sæt af elementer F med to tilhørende operationer kaldet multiplikation og addition. Legemets orden er antallet af elementer i legemet. Antallet af elementer i et endeligt legeme er altid en primtalspotens pn. Skal ordenen være et primtal har vi altså n=1 For ethvert primtal p og positivt heltal n, eksisterer der et endeligt legeme med pn elementer. To endelige legemer med samme orden er isomorfe. Legemet betegnes π½π½ππ hvis ordenen er et primtal og π½π½ππ ππ hvis ordenen er en primtalspotens. Man ser også betegnelsen πΊπΊπΊπΊππ ππ da disse legemer også kan kaldes Galois legemer. Har vi et legeme π½π½ππ ππ kaldes p da karakteristikken af legemet og n kaldes udvidelsesgraden. Vi ser på legemer hvor karakteristikken er et primtal p større end 3. En elliptisk kurve over π½π½ππ er defineret som πΈπΈ(π½π½ππ ) = οΏ½(π₯π₯, π¦π¦): π₯π₯, π¦π¦ β π½π½ππ βπ£π£π£π£π£π£ π¦π¦ 2 = π₯π₯ 3 + π΄π΄π΄π΄ + π΅π΅οΏ½ βͺ {πͺπͺ} hvor diskriminanten 4A3 + 27B2 er forskellig fra nul og A og B ligger i Fp. Betegnelsen πͺπͺ er det neutrale element β identiteten. Kaldes også punktet i uendeligt. Vi har en række additionslove der gælder på en sådan kurve Der gælder at P + πͺπͺ= πͺπͺ+ P = P. Der gælder ligeledes at addition af punkter P+Q = Q+P = R, hvor både P og Q ligger i πΈπΈ(π½π½ππ ) giver et nyt punkt R der også ligger i πΈπΈοΏ½π½π½ππ οΏ½. Man kan desuden vise at punktaddition er associativ. Dvs. at vi har (P+Q)+ R = P + (Q+R). Vi har yderligere at alle punkter har et inverst element β-Pβ således at P + (-P) = πͺπͺ. Dermed er kravene opfyldt for at πΈπΈ(π½π½ππ ) er en endelig gruppe. Vi definerer k*P som P+P+P+β¦+P β i alt k Pβer lagt sammen med punkt addition. 7 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 3. Elliptiske kurver over det endelige legeme F2m Mange standarder for elliptisk kurve kryptografi forlanger at p enten er et ulige primtal eller at pm = q er en potens af 2, altså 2ππ . πΉπΉ2ππ kaldes også binære legemer. Elliptiske kurver over binære legemer vælges på formen Nonsupersingulær: π¦π¦ 2 + π₯π₯π₯π₯ = π₯π₯ 3 + π΄π΄π₯π₯ 2 + π΅π΅ hvor A er 0 eller 1, B!=0, Eller supersingulær: π¦π¦ 2 + π¦π¦ = π₯π₯ 3 + π΄π΄π₯π₯ + π΅π΅ . Vi skal dog senere se at den supersingulære version ikke kan anvendes til kryptografisk brug og man vil derfor udelukkende bruger kurver på den nonsupersingulære form. Koblitz har foreslået en metode hvor man bruger en elliptisk kurve over F2 (der jo ikke indeholder mere end 4 punkter) mens man lader punkterne ligge på E over πΉπΉ2ππ for et primtal m. Det betyder at man ved at anvende en såkaldt βfrobenius mappingβ (der er en homomorfi af πΈπΈ(πΉπΉ2ππ ) på sig selv) kan få lette regneoperationer og ikke mindst let kan beregne antallet af punkter på kurven. Disse kurver kaldes Koblitz kurver eller anormale binære kurver. En af årsagerne til at man er særligt interesseret i denne gruppe πΈπΈ(πΉπΉ2ππ ) er desuden at især punkt dobling er simpel i det tilfælde. Implementationsmæssigt gør det en stor forskel hvor lang tid de enkelte processer tager og hvor mange iterationer der skal til. I en guide 3 til implementation findes en række eksempler på hvordan punktaddition og skalarmultiplikation kan optimeres på binære legemer. πΉπΉ2ππ kan beskrives med såvel polynomial basis som normal basis.jf.[3] Dette kan også betragtes som et binært endeligt legeme der kan ses som et vektor rum af m'te dimension over legemet F2, der består af elementerne 1 og 0. Dvs. elementerne i πΉπΉ2ππ kan skrives på formen ππ0 πΌπΌ0 + ππ1 πΌπΌ1 + ππ2 πΌπΌ02 + β― + ππππ β1 πΌπΌππ β1 hvor ππππ β {0,1} Vi har altså en basis {πΌπΌ0 , πΌπΌ1 , πΌπΌ2 , β¦ , πΌπΌππ β1 } af πΉπΉ2ππ over πΉπΉ2 Polynomial basis repræsentation , Reduktionspolynomium Et irreducibelt polynomium af grad m over πΉπΉ2 definerer en polynomial basis repræsentation af πΉπΉ2ππ Et ireducibelt polynomium af grad m over F2 kan ikke faktoriseres op som et produkt af to polynomier af lavere grad. Et sådant polyomium kan skrives på formen ππ(π₯π₯) = π₯π₯ ππ + π‘π‘ππ β1 π₯π₯ ππ β1 + β― + π‘π‘2 π₯π₯ 2 + π‘π‘1 π₯π₯ + π‘π‘0 hvor π‘π‘ππ β {0,1} for i=0,1,2β¦m-1. 3 Companion document Mathematical Routines for NIST Prime Elliptic Curves 8 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 Elementer i legemet: Det endelige legeme πΉπΉ2ππ betsår af alle polynomier af grad mindre end m. Dette kan skrives således: πΉπΉ2ππ = οΏ½ππππ β1 π₯π₯ ππ β1 + β― + ππ1 π₯π₯ + ππ0 βΆ ππππ β {0,1}οΏ½ Vi kan for det enkelte element ππππ β1 π₯π₯ ππ β1 + β― + ππ1 π₯π₯ + ππ0 anvende den kortere form (ππππ β1 β¦ ππ1 ππ0 ). Altså en bitstreng af længde m. Vi får altså dermed bitstrenge og dette er implementationsmæssigt nyttigt ved operationer på elementer i legemet. Vi kan f. eks repræsentere elementerne i πΉπΉ24 således 0000, 0001, 0010, 0011, 0100, 0101, 0110, 0111, 1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111. Polynomiumsdivisions eksempel (x6 + x5 + x2+1) mod (x4+x+1) = x3+x2+x+1 fordi (x6 + x5 + x2+1) divideret med (x4+x+1) er lig med x2+x med rest x3-x2-x+1 4. ECDLP, Elliptisk kurve diskret logaritme problem Digital signatur og andre kryptografiske protokoller med elliptiske kurver er baseret på det underlæggende antagne svære problem, at beregne det såkaldte diskrete logaritmeproblem for elliptiske kurver. Dette problem kan kort beskrives således: Givet en elliptisk kurve over et endeligt legeme πΉπΉππ , et punkt P på kurven af orden n, ππ β πΈπΈ(πΉπΉππ ) og et andet punkt på kurven ππ = π‘π‘π‘π‘ hvor 0 β€ π‘π‘ β€ ππ β 1 Find t. Det er ikke trivielt på det endelige legeme at beregne hvordan et punkt er et resultat af en ukendt skalar multiplikation af et andet punkt. 5. Egnede og uegnede kurver og domæneparametre Når vi evaluerer en kurves egnethed og det legeme hvorpå den er defineret i forhold til kryptografisk brug, er der især to parametre vi er interesseret i. Den ene er hvor hurtig den er at regne på β af hensyn til performance, og den anden er eventuelle egenskaber ved konstruktionen der gør det sårbart over for angreb. Men der er også helt grundlæggende egenskaber for at vi overhovedet kan få veldefinerede grupper med konsistente additionslove. Vi har desuden til kryptografisk brug behov for et basispunkt G Diskriminanten Helt grundlæggende må diskriminanten på kurven ikke være 0. 9 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 Er diskriminanten 0 svarer det til at flere rødder er ens. Hvis vi skriver højre side på kurven på formen X3 + AX + B som produktet af dets rødder (X-r1)(X-r2)(X-r3) (kan også være komplekse rødder) så er diskriminanten D= 4A3+27B2β 0 hvis og kun hvis rødderne r1,r2 og r3 er forskellig. Hvis de ikke er forskellige har kurven såkaldte singulære punkter og det går galt med additionslovene hvis der findes sådanne punkter. Se evt. bilag B3. Supersingulære kurver En familie af kurver hvis orden, dvs. antallet af punkter på kurven, er #E(Fp)=p+1. Disse kurver har vist sig særligt sårbare over for angreb, herunder det såkaldte MOV angreb og kan ikke bruges til kryptografisk brug. Supersingulære kurver over binære legemer har som tidligere nævnt formen π¦π¦ 2 + π¦π¦ = π₯π₯ 3 + π΄π΄π₯π₯ + π΅π΅ . Anormale kurver En kurve kaldes anormal hvis dets orden et primtal p er af samme størrelse som det underlæggende legeme Fp , altså #E(Fp)=p. Der findes en hurtig metode jf. [9] s 328 til at løse ECDLP på kurver af en sådan orden. Anormale binære kurver β Koblitz kurver Kurver over F2m er, som før nævnt i modsætning til anormale kurver over Fp, meget attraktive pga. af de effektive muligheder for fx addition. Binære legemer af sammensat orden Kurver over binære legemer af orden 2m hvor m er et produkt af to primtal har vist sig sårbare over for et angreb ved hjælp af en såkaldt βWeil Descentβ og skal derfor også undgås til kryptografisk brug. Næsten primtalsorden Hvis antallet af punkter på kurven er et produkt af små primtal er systemet sårbart over for Pohlig-Hellman angreb.jf [4] s 183. Det betyder at #E(Fp) skal være divisibel med et tilstrækkeligt stort primtal, altså at ordenen er et primtal (forskellig fra p) eller et såkaldt næsten-primtal tal s hvor faktorerne er q*n for n meget lille , fx 1,2,3 eller 4 og q større end 2^160 iflg. [5]. Desuden må s ikke dele qk-1 for k mindre end 20. Basepunktet som generator Basepunktet G behøver iflg. Koblitz [4]strengt taget ikke være en generator for gruppen, men skal kunne generere en undergruppe hvor det diskrete logaritmeproblem ikke er nemt. Det er tilfældet hvis ordenen af punktet G er et næsten primtal, dvs. kan deles med et primtal der er sammenligneligt med #E(Fp) . Hvis vi sørger for at #E(Fp) er et stort primtal vil ethvert punkt på kurven (på nær πͺπͺ) være en generator . 10 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 Pseudo-randomisering For at fremtidssikre ECC systemer skal domæneparametrene udvælges randomiseret. Det vil her sige så randomiseret som en computer nu er i stand til. Med andre ord skal udfaldene statistisk set fordele sig jævnt uden sporbare mønstre. Det kalder vi pseudo-randomiseret. Randomiseringen sikrer dels mod at parametervalg vil være blandt eventuelle fremtidige fundne særligt sårbare parametre, men det vil også statistisk set gøre sårbarhed overfor forskellige allerede kendte angrebstyper ubetydelig. Efterfølgende kan man så undersøge om de tilfældigt udvalgte parametre lever op til ovenstående. Tilfældigheden vil også sikre at parametrene og de valgte kurver ikke er konstrueret så de med fuldt overlæg indeholder skjulte sårbarheder der bagefter kan bruges af konstruktøren. Randomiseringen skal være bevislig og af kryptografisk valid kvalitet. Domæneparameter generering og validering Disse ovenstående forudsætninger skal altså være opfyldt for at kurver og øvrige domæneparametre er velegnede til kryptografisk brug. En algoritme til sikring af at disse forudsætninger er til stede kan bl.a. ses i artiklen [14]af bl.a. Johnson, Menezes og Vanstone. Det er ligeledes en integreret del af FIPS-186-3 standarden at domæne parametre skabes og valideres efter specifikke algoritmer. Mere herom under Suite B. Anbefalinger og NIST Ifølge Rosing [4]er de kurver der er mest velegnede til kryptografisk brug, kurver over binære Galois legemer. Dvs. kurver på F2n, med andre ord kurver med karakteristikken 2, og udvidelsesgraden n, og det da kun hvis de ikke er supersingulære. De skal altså være af formen: y2 + xy = x3 + Ax2 + B, B må ikke være nul., A kan godt være nul. Som det vil fremgå under relevant afsnit er de anbefalede såkaldte NIST kurver repræsenteret både med Koblitz kurver og random kurver på binære legemer men også kurver på kort Weierstrass form på primlegemer. Man vil bemærke i specifikationen til disse at udvidelsesgraden på de binære legemer netop er et primtal. Ligeledes er antallet af punkter på kurverne angivet for kurver over primlegemer og de ses at være forskellige fra p og p+1. Som vi vil se senere er det let at beregne antallet af punkter på binære legemer. Også antallet af punkter på NIST kurverne over de binære legemer vil vise sig at være forskellig fra p og p+1. Det er nu oplagt at det er vigtigt at tjekke antallet af punkter på kurven før den kan erklæres egnet til kryptografisk brug. 11 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 6. Antal punkter på kurven Som nævnt har vi behov for at kende gruppen orden, det vil sige antallet af punkter på kurven for at sikre at dette antal lever op til ovennævnte betingelser for ikke at gøre systemet sårbart. Punkttælling er et stort genstandsområde inden for kryptologi. Har vi en elliptisk kurver på kort Weierstrass form mod p vil vi ved gennemløb af x værdier for x=0 til x=p-1 løbe igennem antallet af mulige punkter på kurven. Alle de værdier for S, hvor S= x3-Ax+B, x = 0,1,2,β¦p-1, som giver et kvadrattal, giver da punkterne på kurven. Da cirka halvdelen af alle heltal er kvadrattal modulus p (jf. senere afsnit om Kvadratisk rest ), og der for hvert kvadrattal findes to løsninger y og -y, vil antallet af punkter på kurven ikke være meget forskellig fra p. Hasse indkredser det lidt mere præcist med denne sætning Hasses sætning Antallet N af punkter på en kurve E, #E(Fp) vil være inden for intervallet #E(Fp)=p+1-t hvor |t|<= 2*sqrt(p) Eksempel Vi kan da straks f. eks udtale os om antallet at punkter på f. eks E(Fp) hvor p=6277101735386680763835789423207666416083908700390324961279 Altså er #E(Fp) = 6277101735386680763835789423207666416083908700390324961290-t hvor| t|<2*sqrtp(p), At beregne kvadratroden af et stort tal kræver nærmere overvejelser da der ikke er indbygget en kvadradrodsmetode i BigInteger i C#. En genvej kan være at beregne e^log(p)/2 Math.Exp(BigInteger.Log(p) / 2) Problemet er at det ikke giver et præcist tal men blot 7,922816251426 * 1028 En implementation kunne være baseret på Newton Raphson metoden, hvor vi beregner kvadratroden som en rekursiv beregning over g af (n/g + g)/2. Koden kan ses i bilag B7. Denne algoritme kan ikke beregne kvadratroden af et tal mod p, her er der behov for andre overvejelser. Dette er vist i afsnit om dette emne side: 34 Et kommercielt API βExtreme.Numericsβ tilbyder alternativt en ekstrem let løsning med using Extreme.Mathematics; BigInteger calc = BigInteger.Sqrt(p); Kvadratroden af p afrundet til nærmeste hele tal giver: 79228162514264337593543950336 vi har da at| t|< 158456325028528675187087900670 Dvs antallet af punkter skal iflg. Hasse ligge mellem p+1-t og p+1+t 6277101735386680763835789423049210091055380025203237060610 og 6277101735386680763835789423366122741112437375577412861950 Anvender vi en standardiseret NIST kurve (jf. senere afsnit om Suite B) er antallet af punkter på kurven allerede givet: 12 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 I specifikationen er dette tal r givet som: 6277101735386680763835789423176059013767194773182842284081 Hvilket ses netop at ligge pænt i dette interval. Selv om t har en betragtelig størrelse er det meget mindre end p der eksponentielt er i ordnen 6,3*1057 hvor t eksponentielt kan skrives: 1,6*1029 Hasses sætning giver et resultat der naturligvis stadig er ret upræcist, hvis vi har behov for at finde det helt nøjagtige antal punkter. Det er klart at man kan gennemløbe alle mulige x værdier og lede efter matchende kvadrattal. Det er en meget ineffektiv algoritme der løses i tiden O(p) Antallet af punkter på binære kurver #π¬π¬(ππππππ ) På Koblitz kurver hvor A=0 har vi iflg. [9] s 313, nemme udregninger af antal punkter på kurven. Det kan findes som #E(F2k) = 2k + 1 - ((-1+sqrt(-7))/2)k - ((-1-sqrt(-7))/2)k hvor de to parenteser repræsenterer komplekse rødder i polynomiet Z2+Z + 2. Altså en meget let måde at beregne gruppens orden. Eksempel: #E(F243)= 2^43 + 1 - ((-1+sqrt(-7))/2)^43 - ((-1-sqrt(-7))/2)^43= 8796092023492 På E(F2163) har vi et resultat der let beregnes i fx Maple således: simplify(2^163 + 1 ((-1+sqrt(-7))/2)^163 - ((-1-sqrt(-7))/2)^163) #E(F2163)= 11692013098647223345629473816263631617836683539492 for k=233 er antallet af punkter: 13803492693581127574869511724554051042283763955449008505312348098965372 for k= 283 er antallet af punkter: 15541351137805832567355695254588151253139246935172245297183499990119263318 817690415492 for k=409 er antallet af punkter: 13221119375804971979038306160655420796568093659285624385692975800915228451 56996764202693033831109832056385466362470925434684 for k=571 er antallet af punkter 77290750460345166893907037818639746885978546594128699973144705029030382845 79120849072535914090826847338826851203301405845094699896266469247718729686 468370014222934741106692 Schoofs algoritme En af de mest almindelige metoder til punkttælling er Schoofs algoritme. Den kan beregne antallet af punkter i tiden O((log p)^6) β altså en polynomial tids algoritme. Algoritmen er siden blevet optimeret af en række personer og denne kaldes SEA algoritmen. Den grundlæggende ide er at forsøge at finde antallet af punkter på kurven modulus t for tilstrækkeligt mange små t og så rekonstruere den ønskede orden ved hjælp af den kinesiske restsætning. Det er uden for denne opgaves 13 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 område at dykke nærmere ned i Schoofs algoritme. Man vil kunne se flere detaljer i [6]s 351. Kompleks multiplikation (CM) metode En anden tilgang til problemet er at vælge ordenen først og så generere en kurve med denne orden. Det er fx muligt via den såkaldte βkompleks multiplikationsmetodeβ CM. Ideen er jf. [14] følgende: vi lader E være en elliptisk kurve af orden N over Fq. Vi beregner et Z=4q-(q+1-N)2 og omskriver dette til DV2 hvor D skal være kvadratfrit. Man siger da at kurven E har kompleks multiplikation med D. Kender kan D for en given kurve kan man effektivt beregne kurvens orden. CM metoden giver en måde hvorpå man først konstruerer et D for hvilket der eksisterer et E over Fq, med en orden der er et næsten-primtal N , altså produktet n*h af et stort primtal n og et meget lille h forskellig fra 1, og dermed at N er forskellig fra q. Yderligere må n ikke dele qk β 1 for k mellem 1 og 20. Herfra vil koefficienterne i kurven kunne konstrueres. Metoden er kun velegnet for små værdier af D. Til gengæld skulle metoden være særdeles velegnet netop for disse værdier, og overgår i effektivitet langt punkttælling på kurver over primlegemer for legemer af størrelsesordnen 160 bit, mens metoden ikke kan konkurrere med andre metoder på kurver over binære legemer. Jf [5]s 179 Detaljerede algoritmer er givet i IEEE-1386 [13] Jeg har kun en version draft 14 tilgængelig og her er metoden sammensat af følgende algoritmer. Processen er først at finde en relevant værdi for D, dernæst at finde en nær-primtalsorden 4 for kurven og slutteligt at konstruerer kurve og punkt. Altså først findes et kvadratfrit D der kan være CM diskriminant for p. I [13] afsnit A.14.2.2 har vi en algoritme for test af CM diskriminanter. A.14.2.3. Indeholder en algoritme til at finde en nær-primtals orden I A14.2 følger en algoritme til, ud fra ovenstående output, at konstruere en kurve med de ønskede egenskaber. Anvendes CM metoden over GF(p) kaldes den da også Atkin-Morain metoden. Der findes en rigtig fin detaljeret og praktisk gennemgang af metoden og de nødvendige mellemregninger med gode eksempler i [6] ss. 358-368 Complex multiplikation β gennemregnet eksempel Det er som nævnt muligt at vælge en ønsket orden, N=h*r og herefter legeme. h er en lille cofakor og r et stort primtal (jf Pohlig-Hellman angrebet). Der skal findes et D så bl.a. Z=4*p-(p+1-N)^2 kan skrives som DV2 for kvadratfrit D. Desuden skal en række kongruensbetingelser opfyldes: p mod 8 tjekkes og værdien af K=floor(sqrt(p)+1)2/r) beregnes. Så kan der konstrueres en kurve med den komplekse diskriminant D (sqrt(-D)) der opfylder betingelserne. Jo mindre D jo lettere at finde kurve. For små D findes en tabel for A og B β startværdier 4 Et tal der enten et stort primtal p eller at faktorerne er et meget stort p og et meget lille q. 1,2 eller 3 fx 14 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 D A B 1 1 0 2 -30 56 3 0 1 7 -35 98 11 -264 1694 β¦ β¦ β¦ For større D er der en længere algoritme der kan følges Eksempel 1: Forsøgsvist sættes N=2*631 og legemets størrelse til p=1249, vi beregner da Z=4*1249-(1249+1-1262)^2=4852. 4852 faktoriseres til 22*1213. Det giver et stort D , der ganske vist opfylder kongruensbetingelserne, men er ikke så velegnet pga af Dβs størrelse. Eksempel 2: N=3*1399=4197, p=4273, dvs Z=4*4273-(4274-4197)2=11163. Faktoriseret: 3*612 Det er svært at ramme en Z værdi der giver DV2 for passende værdier da de fleste tal har mange små faktorer, men ovenstående er et heldigt eksempel Vi tjekker p mod 8, 4273 mod 8=1 og værdien af K=floor(sqrt(p)+1)2/r)= floor((sqrt(4273)+1)2/1399)=3 Og vi har* at If p = 1 (mod 8) og K = 2 or 3, så er mulige værdier af D = 1, 2, 3, 5, 6, 10, 11, 13, 14, 17, 19, 21, Dvs D=3 og vi har E(F4273):Y2=X3+1 og dermed har vi at kurven måske har ordenen #(Efp)=4197 Det ses straks at punktet (0,1) er en løsning og en gennemregning viser at punktet desværre kun er genererer 6 punkter på kurven: (2,3)(0,1)(4272,0)(0,4272)(2,4270),O. Vi skal derfor se på en faktor på Bβ jf 14.4.2 Derfor skal findes en faktor t*B. Ex: t=88 og punktet P:(1673,322) er punktets orden 1399, for punktet P: (14,456) er ordene 4197, så E(F4273):Y2=X3+88 kan bruges. Mange værdier af t giver fornuftig brugbar kurve, mange andre værdier giver dog ikke det ønskede. Men det er muligt relativ let i dette eksempel at finde flere match, f. eks: t=1374 P:239,98 giver ordenen 4197 7. Angreb - Måder at finde n for nP= Q Der findes forskellige måder at forsøge at løse ECDLP på for at ECC system. Nogle af systemerne udnytter uhensigtsmæssigheder i domæneparametre, andre er statistiske. De første kan man forsøge at gardere sig imod ved velvalgte kurver og legemer, de andre kan man forsøge at gardere sig imod ved at arbejde på så store 15 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 legemer med tilstrækkeligt stort antal punkter på kurverne at det tager tid og regnekraft udenfor det mulige. Herunder forsøgt meget kort at ridse ideen bag et par af de centrale angrebsmåder op. Denne oversigt er på ingen måde udtømmende og beskrivelserne er meget udetaljerede. Området er naturligvis genstand for meget stor interesse og der udgives vedvarende artikler med forbedring af eksisterende metoder og ind imellem helt nye metoder. Weil pairring og MOV attack Meget kort kan principperne bag Weil pairring og MOV attack beskrives således: Der findes en størrelse em kaldes Weil-pairingen, der er en måde at beregne en skalarværdi for to punkter P og Q i E(Fp) af orden m således at em(P,Q)m=1. Denne størrelse kan også kaldes den mβte enhedsrod. Jeg vil ikke gå nærmere ind i hvordan weil-pairingen beregnes, det kræver en lidt længere forklaring, men blot eksemplificere. Detaljer kan fx findes hos Silverman[9] s.322. Finder vi fx ud af at Weil-pairingen af to punkter P og Q på E(F631) er e5(P,Q)=242 betyder det at 2425=1 i F631 Har vi desuden at f.eks Pβ=3*P og Qβ=4*Q og at vi har beregnet e5(Pβ,Qβ)=512 findes yderligere den egenskab at e5(P,Q)12 =24212= 512=e5(Pβ,Qβ)=e5(3P,4Q) Sådanne egenskaber kan vi bruge til at løse det ECDLP med via den såkaldte MOV algoritme. Ideen er at transformere ECDLP i Fp til at løse DLP i F*pk. MOV algoritmen β efter Menezes, Okamoto og Vanstone, ser ud som følger for to punkter P og Q hvor Q=nP på E(Fp) for ukendt n. Lad P have primtalsorden j større end sqrt(p)+1 1. Beregn antallet af punkter N på E(Fpk). Vi har at j deler N fordi E(Fp) har et punkt af orden j. 2. vælg et tilfældigt punkt T der ligger i E(Fpk) men ikke i E(Fp) 3. beregn Tβ=(N/j)*T. Hvis Tβ= πͺπͺ vælg et andet T. Ellers er Tβ et punkt af ordenen j. 4. beregn Weil-pairingen for følgende punkter a=ej(P,Tβ) der vil ligge i F*pk . og tilsvarende for b = ej(Q,Tβ) 5. Find en løsning n til b=an (med andre ord løs DLP i F*pk .) 6. Vi har da at Q=nP I tilfælde af supersingulære kurver eller anormale kurver giver algoritmen simple løsninger, generelt kan DLP løses f.eks ved hjælp af index metoden. Jf [9]s.162 og se evt. her 5 5 http://en.wikipedia.org/wiki/Index_calculus_algorithm 16 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 Pollards Rho metode Pollards Rho metode er normalt en metode til at faktorisere et tal n =pq for p og q to store primtal. Men metoden er også relevant forhold til at finde n for Q=nP Ideen bag Pollards Rho metode er mod n at finde to forskellige talpar (a1,b1) og (a2,b2) så a1*P + b1*Q = a2*P + b2*Q da vi så har at (a1-a2)*P =(b2-b1)*Q=(b2-b1)*t*P og dermed at (a1-a2) =(b2-b1)*t mod n. t kan da beregnes som t= (a1-a2)* (b2-b1)-1 mod n Metoden er så at konstruere en funktion der laver tilfældige kombinationer af talpar indtil et match findes. Et lille eksempel jf [5]. Hvis vi har E(F229): Y2=X3+x+44 og har P=(5,116) med primtalorden 239 og Q=(155,166)) hvor Q= nP for ukendt n. Finder man så ved hjælp af iterationer over tilfældige kombinationer f.eks at 192P+24Q=213P+104Q=(57,105), da har vi at t=(192-213)*(104-24)-1 mod 239=176. Altså at 176*Q=P. Metoden er statistisk da der ikke gives nogen garanti for match, men match kan forventes at findes i tiden O(sqrt(N)), N gruppens orden. Pohlig β Hellman metode Denne metode virker hvis vi har at ordenen N af punktet P er et sammensat tal som vi kan faktorisere. Vi har en gruppe baseret på en elliptisk kurve E over Fp og punkterne P og Q hvor Q=nP for et ukendt n. Antag at faktoriseringen af N er følgende ππ = ππ0 ππ0 β ππ1 ππ1 β ππ2 ππ2 β β¦ .β ππππ ππ ππ Hvis vi da har at for et q med præcis den potens e der deler N kan vi skrive n som en q-base ekspansion (var fx q=2 og e=1 ville det svare til en binær ekspansion) Vi vil da forsøge med alle faktorerne i N ved at finde n modulus hvert ππππ ππ ππ og efterfølgende bruge den kinesiske restsætning 6 til at finde n mod N. Vi beregner for alle faktorpotenserne en mængde af punkter T som et skalarprodukt af alle værdier af j mellem 0 og q-1 og N/q*P for at finde de forskellige værdier for n Washington [2] viser et eksempel for E(F599) med punkter P=(60,19 og Q=(277,239) hvor ordenen af P;N=600 der faktoriseres til 23*3*52. Ideen er så at beregne n mod 8, 3 og 25 og kombinere disse. Han får følgende kongruenser n= 2 mod 8,x=2 mod 3 og x=16 mod 25. Det giver til sammen n=266 mod 600 hvorfor n=266. Denne metode kan man altså gardere sig imod ved at sikre at ordenen af punktet er et primtal. 6 http://mathworld.wolfram.com/ChineseRemainderTheorem.html 17 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 Pohlig-Hellmann angreb gennemregnet Eksempel på kurve hvor punktets orden ikke er af primtals orden. E(F5437):Y2=X3 β 3X + 4483, Base point example P: (10,4) Orden af punkt P er N= 890 Man kan ved at regne på kurve eksempelvis se at 8P giver (1298,210) med orden 445. Et kvalificeret gæt på gruppens orden: 5340, da 6*890= 5340og 12*445=5340, 5437-5340=97 og tallet faktoriseres således 5340=22*3*5*89 Da punkternes orden skal gå op i gruppens orden og gruppens orden ifgl Hasse ikke er meget forskellig fra antallet af elementer i legemet er det et rimeligt bud. Vi vil da forsøge at udføre et Pohlig β Hellmann attack på ECDLP i denne gruppe Vi har et Q=(3210,4634)=k*P for ukendt k Punktet P=(10,4)βs orden N= er 890= 2*5*89 Vi har et Q=(3210,4634)=k*P for ukendt k, så vi skal i stedet forsøget at finde k for kP mod 2, mod 5 og mod 89. Det er klart det er sværest at finde det mod 89 β og dette problem skaleres op jo større primfaktorer gruppens orden er sammensat af. Vi beregner elementerne T for hver faktorportens i N. For k mod 2 Beregn T={j(N/q)*P for 0<=j<=q-1}, her er q så lig med 2 Dvs T={O,890/2*P}= {O,(4085,0)} , vi vil så finde N/q*Q =445*( 3210,4634)=O dvs: Vi har altså 0*(N/2*P) og dermed at k0=0 Dvs Q1=Q-0P=Q. Dvs k=0 mod 2 (med andre ord et lige tal) For k mod 5 Beregn T={j(N/q)*P for 0<=j<=q-1}, her er q så lig med 5 og N/q=178 så vi har T={O,178P,356 P,534P,712P}= T={O, (3474,2391),(2641,4651),( 2641,786),(3474,3046)} N/5*Q=178*Q=(2641,4651) og vi ser at det er det samme som det tredieelement i T listen ovenfor og at det svarer til N/5*Q= 2*N/5*P altså k0=2, Det vil sige k=2 mod 5 For k mod 89 18 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 Beregn T={j(N/q)*P for 0<=j<=q-1}, her er q så lig med 89 og N/q=890/89=10 så vi har T={O,10P,20P,30P,40P,50P,60P,70P,β¦β¦39*10P,40*10P,41*10P,42*10P,β¦..,87*10P,8 8*10P }= T={O, (3820,4000),( 5098,1859),( 3664, 2503),β¦β¦(819,5180)β¦β¦.} N/89*Q=10*Q=(819,5180) . Det kan vi ved mange lange beregninger se er det samme som det element i T listen hvor j=42,altså 420*P ovenfor og det svarer til N/89*Q= 42*N/89*P altså k0=42, Det vil sige k=42 mod 89 Vi har derfor følgende kongruenser:k=0 mod 2, k=2 mod 5, og k=42 mod 89. Det løses med kinesisk restsætning til k=42. Som eksemplet viser giver større primtalsfaktorer længere beregninger, og det er da også grunden til at angrebet er velegnet især for punkter sammensat af små primtalspotenser. For et beskytte sig mod Pohlig-Hellman angrebet skal kan man også vælge punkter af sammensat orden hvor ordenen er sammensat af en stort primtal og men meget lille co faktor. 8. Suite B Suite B 7er en amerikansk standard udgivet af National Security Agency(NSA) for sikker kommunikation på niveauet SECRET (svarende til dansk klassifikation HEMMELIGT) . Standarden er godkendt af NIST der er den amerikanske standardiseringsinstitut β National Institute of Standards and Technology. Der findes også en Suite A. Den er beregnet til særlig beskyttelse af sensitiv information (TOP SECRET) og indeholder fortrolige algoritmer. Denne standard vil ikke blive offentliggjort. Suite B indeholder en lang række dokumenter vedr. standarder for protokoller og algoritmer herunder bl.a. andet følgende dokumenter vedr. kryptografi med Elliptiske kurver. De refererer desuden til de af NIST anbefalede elliptiske kurver til kryptografisk brug. FIPS-186-3 Elliptic Curve Digital Signature Algorithm (ECDSA) β FIPS PUB 186-3 (using the curves with 256 and 384-bit prime moduli) Implementationsguide til FIPS-186-3 Suite B Implementers' Guide to FIPS 186-3 (ECDSA) - February 2010 Matematiske rutiner til NIST kurver Companion document Mathematical Routines for NIST Prime Elliptic Curves 7 http://www.nsa.gov/ia/programs/suiteb_cryptography/ 19 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 NIST anbefalinger, standard IEEE P1363-Annex A (kommercielt produkt β 149$) 8 Suite B indeholder bl.a. anbefaling eller krav om man vil, til hvilke domæneparametre herunder hvilke kurver anvendes til kryptografisk brug i FIPS186-3 appendix D. Jeg vil i denne gennemgang ikke se nærmere på protokolkrav på Suite B niveau og vil primært undersøge og anvende de anbefalede såkaldte NIST kurver til demonstrationsbrug. Implementationsguide og de optimerede matematiske rutiner er tilføjet for nylig og er generelt ikke anvendt her, men visse steder kommenteret i forbindelse med implementationsovervejelser. NIST anbefalinger Legemer NIST anbefaler følgende endelige legemer. 5 primlegemer og 5 binære legemer. Primlegemer for Fp for følgende værdier af p: ππ = 2192 β 264 β 1 = 6277101735386680763835789423207666416083908700390324961279 ππ = 2224 β 296 + 1 = 26959946667150639794667015087019630673557916260026308143510066298881 ππ = 2256 β 2224 + 2 192 + 296 β 1 = 115792089210356248762697446949407573530086143415290314195533631308867097853951 ππ = 2384 β 2128 β 2 96 + 232 β 1 = 394020061963944792122790401001436138050797392704654466679482934042457217714968703290472660 88258938001861606973112319 ππ = 2521 β 1 = 686479766013060971498190079908139321726943530014330540939446345918554318339765605212255964 0661454554977296311391480858037121987999716643812574028291115057151 Disse primmoduli er angivet på en speciel form kaldet generaliseret Mersenne form. Beregninger på modulus på denne form giver beregningsmæssige fordele. Et optimeret kryptosystem vil med stor fordel kunne implementere artimetik der udnytter disse frem for 8 https://sbwsweb.ieee.org/ecustomercme_enu/start.swe?SWECmd=GotoView&SWEView=Catalog+Vi ew+(eSales)_Standards_IEEE&mem_type=Customer&SWEHo=sbwsweb.ieee.org&SWETS=1192713 65 20 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 standard implementation der ville virke på ethvert primtal. Detaljer omkring denne optimering vil fremgå af guiden 9hørende til Suite B, samt af FIPS186-3. Ideen er overordnet set at en binær baseret ekspansion giver særlige fordele hvor beregninger kan foretages i forenklet binære operationer. Fx er modulus for kurven P-192 skrevet som p = 2 192 β 2 64 β 1. Det betyder at ethvert tal mindre end p2 kan skrives på formen A=A5*2320 + A4*2256+A3*2192+A2*2128+A1*264+A0 Her vil hvert Ai så være et 64 bit tal, og det kan da betragtes som en konkatenering af 64-bit ord således A=(A5||A4||A3||A2||A1||A0)). Modulus beregninger vil da kunne beregnes som en sum af små tal reduceret modulus p Vil vi f.eks beregne B = A mod p har vi at B= T + S1 + S2 + S3 mod p hvor T=(A2||A1||A0), S1=(A3||A3), S2=(A4||A4||0), S3 =(A5||A5||A5). Tilsvarende teknik virker på de andre primlegemer. Optimering på NIST Kurver β numerisk eksempel Matematiske rutiner på p192 Beregn r= a mod p192 r kan da beregnes som t + s1 + s2+s3 og ved efterfølgende subtraktion af op til tre multiplum af p192 Så lad os tage et eksempel hvor a er repræsenteret ved 64 bit enheder med værdien 2305 (altså a6,a5,a4,a3,a2,a1,a0)=(0,0,0,2,3,0,5) Vi har da at T er (a2 ||a1||a0) = 305 Og S1=(a3||a3), s2=(a4||a4||0), S3 =(a5||a5||a5). Dvs: T=305, S1=22, S2=000, S3=000 T + S1+S2+S3= 327 der beregnes til at være: Så r= t + s1 + s2+s3 = 327= 3*2^(2*64)+ 2*2^(1*64) +7*2^(0*64) = 1020847100762815390427017310442723737607 Hvis vi i stedet beregner det βnormaltβ: a= 2305 angives som 64 bit giver: 2*2^(3*64)+ 3*2^(2*64)+ 0*2^(1*64) +5*2^(0*64)= 12554203470773361528692425947178148222594834711223373660165 192 64 Hvis vi modulerer det med ππ=2 β2 β1 = 6277101735386680763835789423207666416083908700390324961279 Får vi > 12554203470773361528692425947178148222594834711223373660165 mod 6277101735386680763835789423207666416083908700390324961279; Hvilket i Maple præcist giver 1020847100762815390427017310442723737607. 9 Companion document Mathematical Routines for NIST Prime Elliptic Curves 21 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 Det ses altså at være langt enklere at regne via de optimerede rutiner. Binære legemer F2163= F11692013098647223345629478661730264157247460343808 F2233= F13803492693581127574869511724554050904902217944340773110325048447598592 F2283= F15541351137805832567355695254588151253139254712417116170014499277911234281641667985408 F2409= F1322111937580497197903830616065542079656809365928562438569297590548811582472622691650378420879430569 695182424050046716608512 F2571= F7729075046034516689390703781863974688597854659412869997314470502903038284579120849072387533163845155 924927232063004354354730157322085975311485817346934161497393961629646848 Man vil her bemærke at det netop er disse legemer jeg beregnede antallet af punkter for i afsnittet under Elliptiske kurver over binære legemer. NIST kurver På disse legemer specificeres så kurver med tilfældigt valgte parameter der opfylder en række krav. På primlegemerne specificeres en kurve på hvert legeme. På de binære legemer specificeres både en tilfældig valgt kurve og en Koblitz kurve pr legeme. Kurvespecifikation kaldes også domæneparametre . Følgende værdier afgives for at muliggøre kryptografisk brug. Først for kurver over primlegemer; værdien af henholdes vis A og B for den elliptiske kurve på den korte Weierstrass form: Y2=X3 + AX + B, samt koordinaterne for et basepunkt G - Gx og Gy. Desuden oplyses forskellige andre værdier til kontrol af kurvens egnethed, herunder antallet af punkter på kurven (kurvens orden) og to sammenhængende kontrolværdier, et seed S og et output c til verifikation af at kurven faktisk opfylder kravet om at være tilfældig. For kurver over binære legemer gives et reduktionspolynomium af grad m, koefficienterne A og B for en kurve på formen: y2 + XY = X3+AX2+B, koordinaterne for at basepunkt G, Gx og Gy samt punktets orden. Dvs det t for hvilket tG=πͺπͺ Valg af reduktionspolynomium. Ved anvendelse af polynomialbasis repræsentation for πΉπΉ2ππ giver det en række muligheder for valg af reduktionspolynomium. Det forholder sig dog sådan at der findes en række meget konkrete anbefalinger for valg af disse. Ifølge IEEE 1363-2000 , FIPS-186-2 og ANSI X9.62 vælges så enkle reduktionspolynomier som muligt efter følgende princip: Hvis der findes et ireducibelt trinomium af grad m over F2, ππ ππ + ππ ππ + 1 , vælges dette, og da med så lille en værdi af k som muligt. Hvis dette ikke findes vælges der i stedet et pentanomium. ππ ππ + ππππ 3 + +ππππ 2 + ππππ 1 + 1 med følgende kriterier for valg af k værdier. k3 vælges så lille som muligt og for dette valg så lille et k2 som muligt, og for disse værdier af k3 og k2 vælges så lille et k1 som muligt. 22 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 Dette betyder for ovennævnte binære legemer ifølge Doche[1] 10, følgende valg af reduktionspolynomier: F2163 ο ππ163 + ππ 7 + +ππ 6 + ππ 3 + 1 F2233 ο ππ 233 + ππ 74 + 1 F2283 ο ππ 283 + ππ12 + +ππ 7 + ππ 5 + 1 F2409 ο ππ 409 + ππ 87 + 1 F2571 ο ππ 571 + ππ10 + +ππ 5 + ππ 2 + 1 9. Generering og verifikation af domæne parametre Et af de centrale aspekter ved sikkerheden bag brug af EC til kryptografi er sikring af at kurverne som nævnt er valgt tilfældigt således at en udbyder af en krypteringsservice ikke kan vælge sig parametre der muliggør forskellige kendte angreb. Ifølge NIST og algoritmen 4.17 [5] genereres A og B på baggrund af et valgt Fp ved hjælp af en hash funktion således at outputtet ikke kan være forhåndsvalgt ud fra en antagelse om at hash funktionen er en envejsfunktion med uforudsigeligt og entydigt resultat. Her er algoritmen beskrevet med SHA1 som det skal være ifølge fips-186-3 Input: primtal p og en 160 bit hashfunktion H Output: et seed S og A og B for den elliptiske kurve E på kort Weierstrass form. 1. sæt t=loft(log2p), s = floor(t-1)/160, v= t-s*160 2. Vælg tilfældig bitstreng S af længde g>= 160 bit 3. beregn h=sha1(S), og lad r0 være bitstrengen af længde v bit ved at tage de v bit længst til højre af h 4. lad R0 være bitstrengen der er resultatet ved at sætte den bit længst til venstre til 0. 5. lad z være det tal hvis binære repræsentation er S 6. for i=1;i<=s;i++ 1. lad si være g bit streng-repræsentationen af tallet (z+i) mod 2g 2. Beregn Ri = H(si) 7. Lad R være strengkonkateneringen af Ri værdierne : R=R0||R1||R2||β¦.||Rs 8. lad r være det tal hvis binære repræsentation er R 9. hvis r=0 eller hvis 4r + 27 = 0 mod p tilbage til 2. o g vælg ny bitstreng 10. Vælg tilfældig A og B i Fp forskellig fra 0 så r*B2=A3 11. returner S,A og B. 10 Tabel s 216, kap 11.2 Finite fields of characteristic 2. Handbook of Elliptic and Hyperelliptic Curve Cryptography 23 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 De af NIST anbefalede kurver er alle genereret ved hjælp af SHA-1 Man kunne godt stille spørgsmål ved kvaliteten af dette valg, idet SHA-1 er kompromitteret. For at en hashfunktion kan betegnes som værdifuld skal entydigheden være sikker. Da ingen hashfunktioner af endelig længde pr konstruktion kan være kollisionsfri skal i praksis være så kollisionsfrie som muligt, og endnu vigtigere, det må ikke være muligt at forudsige resultatet af funktionen, så der f.eks. kan konstrueres en kollision På Crypto-2004 viste Xiaoyun Wang, Yiqun Lisa Yin, and Hongbo Yu at det er muligt at generere kollisioner væsentlig hurtigere end hidtil antaget med SHA-1. Ifølge Bruce Schneier 11 reduceres til 2^69 operationer frem for 2^80 I den seneste version af standarden, fips-180-3 fra juni 2009, er de anbefalede kurver fortsat genereret med et specificeret 160 bit seed og SHA-1 anvendt til at dokumentere at parametrene er valgt pseudo-randomiseret. Det er altså en teoretisk mulighed at de af NIST anbefalede kurver til Suite B standarden er konstrueret så nogen har sikret sig parametre med for dem kendte genveje til angreb. Man kunne også stille spørgsmål ved sikkerheden i at anvende domæneparametre der er offentliggjorte og forlangt anvendt af kun den ene part i en kommunikation hvor den eneste sikkerhed for tilfældighed er en brudt hash algoritme. Omvendt har de anbefalede kurver nu i en årrække været offentligt tilgængelige og er blevet nøje gransket af utallige personer og eventuelt indbyggede svagheder måtte forventes at være fundet. Ønsker man at konstruere sine egne domæneparametre undgår man naturligvis at andre har indbygget et eller flere, af dem kendte, svagheder, omvendt vil da restere et arbejde med sikring af at kurverne lever op til kendte krav og kan modstå kendte angreb. Desuden vil den klassiske problemstilling altid lure i baggrunden β at når man anvender hjemmekonstruerede parametre ikke er gennemprøvede på samme måde som kendte standarder, er der altid risiko for at overse oplagte problemer, ikke blot i konstruktionen, valg og test men naturligvis også i implementation. Verifikation NIST kurve eksempel over primlegeme, kaldet P-192 E(Fp) A=-3 11 http://www.schneier.com/blog/archives/2005/02/sha1_broken.html 24 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 B er angivet som: B= 2455155546008943817740293915197451784769108058161191238065 p = 2^192-2^64-1 =6277101735386680763835789423207666416083908700390324961279 Base punkt G er I fips-186-2 og 3 angivet I hex til : Gx:188da80e b03090f6 7cbf20eb 43a18800 f4ff0afd 82ff1012 Gy:07192b95 ffc8da78 631011ed 6b24cdd5 73f977a1 1e794811 Det giver i decimal form: Gx: 602046282375688656758213480587526111916698976636884684818 Gy: 174050332293622031404857552280219410364023488927386650641 Det kan først efterprøves og bekræftes at punktet faktisk G ligger på kurven idet B kan verificeres at være lig med B=Gy^2 -Gx^3 β (-A)*Gx mod p= (174050332293622031404857552280219410364023488927386650641)^2- (602046282375688656758213480587526111916698976636884684818)^3-(-3)*( 602046282375688656758213480587526111916698976636884684818) mod 6277101735386680763835789423207666416083908700390324961279 = 2455155546008943817740293915197451784769108058161191238065 At kurven virkelig er pseudo-random skulle så kunne verificeres ved hjælp af det angivne seed S til en hashbaseret algoritme og sammenligne det med det angivne output c af denne. c tjener yderligere til at bekræfte at domæneparameteren, koefficienten B, opfylder kravet B2*c=-27(mod p ) Jeg vil derfor her ved hjælp af algoritmen angivet i appendix 6.5 fips-180-3, også specificeret i [5] s 176 forsøge at verificere at c og B er korrekte via 160 bit hashalgoritmen SHA-1. Verifikation af pseudo-randomisering Givet 160-bit seedet s, kan man verificere at koefficienterne A og B er beregnet fra den hashfunktionen SHA1 som følger Lad l være bitlængden af p, og definer v = ( l - 1) /160 (floor) w = l - 160v - 1 1. Beregn h := SHA-1(s). 2. Lad h0 være bitstrengen fremkommet ved at tage de w bil længst til højre af h 3. Lad z være heltallet hvis binære ekspansion er givet ved 160 bit strengen s 4. For i fra 1 til v do 4.1 Definer 160-bit strengen si to til at være den binære ekspanstion af (z + i) mod (2160 ). 4.2 Beregn hi :=SHA-1(si). 25 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 5. Lad h være bitstrengen fremkommet ved strengkonkatenering af h0 , h1, . . . , hv som følger: h = h0 || h1 || . . . || hv. 6. Lad c være det heltal hvis binære ekspansion er givet ved bitstrengen h 7. Verificer at b2*c= -27 (mod p). Sha1 hashing af hexværdier Det viser sig til at det ikke er helt lige meget hvordan man tager hashværdien af de angivne hexværdier. Det er ikke specificeret hvordan hexværdien skal fortolkes og hvordan encodingen foregår. SHA1 er ganske vist standardiseret i Fips men mange forskellige implementationer er mulige og afhængig af valg af programmeringssprog. Det er fx afgørende at seedet ikke fortolkes som en tekststreng. Det kan dog heller ikke blot oversættes til et stort heltal. Efter en række forsøg er det lykkes at finde en fortolkning der giver det rigtige resultat β ved at parse hexværdierne til et bytearray der så hashes blok for blok. Herunder et eksempel. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Globalization; using System.Security.Cryptography; namespace hashhex { class Program { public static byte[] FromHex(string s) { byte[] ba = new byte[s.Length / 2]; for (int i = 0; i < ba.Length; i++) { ba[i] = byte.Parse(s.Substring(2 * i, 2), NumberStyles.HexNumber); } return ba; } public static string HexSHA1(String s) { HashAlgorithm alg = new SHA1Managed(); byte[] b = FromHex(s.Replace(" ", "")); alg.TransformFinalBlock(b, 0, b.Length); return BitConverter.ToString(alg.Hash).Replace("-", ""); } public static void Main(string[] args) { Console.WriteLine(HexSHA1("bd713447 99d5c7fc dc45b59f a3b9ab8f 6a948bc5")); Console.WriteLine(HexSHA1("bd713447 99d5c7fc dc45b59f a3b9ab8f 6a948bc6")); Console.ReadKey(); } } } Denne implementation herover virker, mens mit første forsøg - en implementation som vist i uddrag herunder, ikke virker . Den i hex angivne værdi s oversættes til et stort helttal, dette tal parses til et bytearray og sha1 værdien at disse printes ud i binært format. 26 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 private void button1_Click(object sender, EventArgs e) { BigInteger num = BigInteger.Parse(textBox1.Text); byte[] data = num.ToByteArray(); byte[] result; StringBuilder sb = new StringBuilder(); SHA1 sha = new SHA1CryptoServiceProvider(); result = sha.ComputeHash(data); for (int i = result.Length - 1; i >= 0; i--) { sb.Append(Convert.ToString(result[i], 2).PadLeft(8, '0')); } } textBox2.Text = sb.ToString().TrimStart('0'); At man skal være overordentlig varsom med hvilken implementation af sha1 der anvendes, kan også vises i et lille kuriosum herunder: PHPβs implementation af sha1 giver ingen fejlmeddelelser, men dog resultater, hvis man tager sha1 værdien af store tal. I stedet for som dokumentationen anfører hashværdi af tekststrenge β og det bliver her meget tydeligt at funktionen ikke kan anvendes til kryptografisk brug. Kun de første 14 digitale cifre har betydning for hashværdien - Her ses et forsøg på at beregne hashværdien af S sammenlignet med S+1 og anden værdi der er sammenlignelig i decimal form. <?php echo sha1(275585503993527016686210752207080241786546919125);?> </br> <?php echo sha1(275585503993527016686210752207080241786546919126);?> </br> <?php echo sha1(275585503993527000000000000000000000000000000000);?> </br> 831f335f6b0dbd2e21167573824933a2e9038e15 831f335f6b0dbd2e21167573824933a2e9038e15 831f335f6b0dbd2e21167573824933a2e9038e15 Heller ikke sha1 værdien af de angivne seeds fortolket som tekststrenge giver noget brugbart med PHP. Undervejs i disse beregninger har jeg undersøgt mange forskellige implementationer af sha1 hvoraf de færreste har givet det resultat der skulle til for at bekræfte ovenstående. Det vil derfor være nødvendigt at sikre sig en sha1 implementation der kan håndtere hexværdier og i øvrigt er implementeret henhold til suite B for at være sikker på at den er korrekt implementeret. Ifølge Certicom http://www.certicom.com/index.php/net lever sikkerheds APIβet inkluderet i .NET ikke op til FIPS standard. Man vil i stedet kunne anskaffe sig et særligt βCerticom API, security.NET with fipsβ. Det kunne eventuelt give den nødvendige sikkerhed for korrekt hashvalidering. Verifikation af P-192 S : 3045ae6f c8422f64 ed579528 d38120ea e12196d5 27 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 output c er på forhånd angivet som: c:3099d2bb bfcb2538 542dcd5f b078b6ef 5f3d6fe2 c745de65 p er 6277101735386680763835789423207666416083908700390324961279 Bitlængden l af p er by design 192. Den kan også beregnes som l= Log2( p) = 192 Dvs v= (192-1)/160 =1 W= l-160*v β 1= 192-160-1= 31 S er angivet i hex og det ses at der er 5 blokke a 8x4 bit altså 160 bit. S er her udtrykt i binær form: S: 3045ae6f c8422f64 ed579528 d38120ea e12196d5 sha1(s)=7f6da10026c7ff92c5ac2e890bd59b44b099d2bb 01111111 01101101 10100001 00000000 00100110 11000111 11111111 10010010 11000101 10101100 00101110 10001001 00001011 11010101 10011011 01000100 10110000 10011001 11010010 10111011 R0 er de 31 bit længst til højre for i = 1 til v (men v = 1 så for i =1): si= z + i dvs s1=z+1 mod 2^160 s1=275585503993527016686210752207080241786546919125+1 mod 2^160 Idet 2^160 = 1461501637330902918203684832716283019655932542976 er meget større end s får moduleringen ingen indflydelse på beregningen s1 =3045ae6f c8422f64 ed579528 d38120ea e12196d6 = sha1(s1)=bfcb2538542dcd5fb078b6ef5f3d6fe2c745de65 R1 = SHA1(s1)= 10111111 11001011 00100101 00111000 01010100 00101101 11001101 01011111 10110000 01111000 10110110 11101111 01011111 00111101 01101111 11100010 11000111 01000101 11011110 01100101 Og da r = R0 || R1 (hvor || skal forstås som strengkonkatenering) C omsat til binært tal er: 00110000 00111000 10110110 01000101 10011001 01010100 11101111 11011110 11010010 10111011 10111111 11001011 00100101 00101101 11001101 01011111 10110000 01111000 01011111 00111101 01101111 11100010 11000111 01100101 Den første markerede del af tallet er de 31 mindst betydende cifre :R0, direkte fra beregningen sha1(S) 28 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 Ydermere skulle kunne verificeres på om r*b2=a3 mod p, og er det ikke det, kan randomisering afvises. Da r kunne verificeres at være identisk med c er tilbage blot at tjekke at c*b2= a3 mod p c på decimal form: 1191689908718309326471930603292001425137626342642504031845 Vi har at den elliptiske kurve er angivet med følgende værdier for a og b: a=-3 b= 2455155546008943817740293915197451784769108058161191238065 Og får derfor følgende regnestykke Først via vores beregnede r og efterfølgende for det i standarden angivne r r*b2= 1191689908718309326471930603292001425137626342642504031845* 24551555460089438177402939151974517847691080581611912380652 mod 6277101735386680763835789423207666416083908700390324961279= 6277101735386680763835789423207666416083908700390324961252 a3=(-3)3 mod 6277101735386680763835789423207666416083908700390324961279= 6277101735386680763835789423207666416083908700390324961252 Hvilket tydeligvist er det samme. Verifikationen af randomiseringen var således bundet op på en korrekt implementation af SHA1. Yderligere verifikationsovervejelser: Det er naturligvis afgørende at r er fremkommet ved hjælp af en hash funktion og kan bekræftes via det angivne seed, da en accepttest der alene baserer sig på at verificere at det allerede angivne r bekræfter af r*b2 = a3 mod p er værdiløs da man nemt kan konstruere et sådant r r skal da blot angives til at være r = a3 /b2 mod p, hvilket let beregnes. Eksempel - At konstruere r for P-224 ππ = 2224 β 296 + 1 dvs. p=26959946667150639794667015087019630673557916260026308143510066298881 b=b4050a85 0c04b3ab f5413256 5044b0b7 d7bfd8ba 270b3943 2355ffb4 som i decimalform er: 18958286285566608000408668544493926415504680968679321075787234672564. 29 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 Først beregnes a3 mod p= (-3)3 mod 26959946667150639794667015087019630673557916260026308143510066298881= 26959946667150639794667015087019630673557916260026308143510066298854 b2 mod p = 418022388386432022296331202075632536960789719528665395361463976209 = 9585649763196999776159690989286240671136085803543320687376622326267 i specifikationen er r da også angivet til at være: r= 5b056c7e 11dd68f4 0469ee7f 3c7a7d74 f7d12111 6506d031 218291fb i decimalform: 9585649763196999776159690989286240671136085803543320687376622326267 Hvilket ses at være det samme som det beregnede. Så med mindre det kan bekræftes at S ο r vha [11]side 64 og [5]side 176 er r værdien ikke validerende. Hele sikkerheden i valideringen er altså baseret på at det ikke er muligt at skabe et S så rο S, og dette hænger naturligvis på hashfunktionen. Test af domæneparametre for P-224: S= bd713447 99d5c7fc dc45b59f a3b9ab8f 6a948bc5 sha1(s)= 2f7923f33d5eab4215c2fc265b056c7e11dd68f4 binært ο 00101111 01111001 00100011 11110011 00111101 01011110 10101011 01000010 00010101 11000010 11111100 00100110 01011011 00000101 01101100 01111110 00010001 11011101 01101000 11110100 224-1/160=1, v = 224-1*160= 64 bits Så R0 er de 64 bagerste bits: 01011011 00000101 01101100 01111110 00010001 11011101 01101000 11110100 cβs værdi I hex: R0 + R1 01011011 00000100 11110111 00100001 00000101 01101001 11010001 10000010 01101100 11101110 00100001 10010001 01111110 00010001 11011101 01101000 11110100 01111111 00111100 01111010 01111101 01110100 00010001 01100101 00000110 11010000 00110001 11111011 Det ses at det matcher! R1 30 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 S1= bd713447 99d5c7fc dc45b59f a3b9ab8f 6a948bc5+1= bd713447 99d5c7fc dc45b59f a3b9ab8f 6a948bc6 Sha1(s1)= 0469ee7f3c7a7d74f7d121116506d031218291fb I binært format: 00000100 01101001 11101110 01111111 00111100 01111010 01111101 01110100 11110111 11010001 00100001 00010001 01100101 00000110 11010000 00110001 00100001 10000010 10010001 11111011 Altså kan domæne parameter verificeres for P-224 Test af domæne parametre for P-521 S: d09e8800 291cb853 96cc6717 393284aa a0da64ba Sha1(s)= 191089dcebc9e37dfc2e3c3f0058e2b48bfa5f42 ο binært 00011001 00010000 10001001 11011100 11101011 11001001 11100011 01111101 11111100 00101110 00111100 00111111 00000000 01011000 11100010 10110100 10001011 11111010 01011111 01000010 521-1/160=3, v = 521-3*160= 41 bits Cβs værdi I hex: 0b4 8bfa5f42 0a349495 39d2bdfc 264eeeeb 077688e4 4fbf0ad8 f6d0edb3 7bd6b533 28100051 8e19f1b9 ffbe0fe9 ed8a3c22 00b8f875 e523868c 70c1e5bf 55bad637 giver binært det herunder med sort markerede: 01011 01001000 10111111 10100101 11110100 0010 = R0 00001011 01001000 10111111 10100101 11110100 00100000 10100011 01001001 01001001 01010011 10011101 00101011 11011111 11000010 01100100 11101110 11101110 10110000 01110111 01101000 10001110 01000100 11111011 11110000 10101101 10001111 01101101 00001110 11011011 00110111 10111101 01101011 01010011 00110010 10000001 00000000 00000101 00011000 11100001 10011111 00011011 10011111 11111011 11100000 11111110 10011110 11011000 10100011 11000010 00100000 00001011 10001111 10000111 01011110 01010010 00111000 01101000 11000111 00001100 00011110 01011011 11110101 01011011 10101101 01100011 00000111 = c Som det ses så matcher R0. Sha1(s1)= 0a34949539d2bdfc264eeeeb077688e44fbf0ad8 Binært ο 00001010 00110100 10010100 10010101 00111001 11010010 10111101 11111100 00100110 01001110 11101110 11101011 00000111 01110110 10001000 11100100 01001111 10111111 00001010 11011000 Sha1(s2) = f6d0edb37bd6b533281000518e19f1b9ffbe0fe9 og binært: 31 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 11110110 11010000 11101101 10110011 01111011 11010110 10110101 00110011 00101000 00010000 00000000 01010001 10001110 00011001 11110001 10111001 11111111 10111110 00001111 11101001 Sha1(s3)= ed8a3c2200b8f875e523868c70c1e5bf55bad637 og binært 11101101 10001010 00111100 00100010 00000000 10111000 11111000 01110101 11100101 00100011 10000110 10001100 01110000 11000001 11100101 10111111 01010101 10111010 11010110 00110111 Som det ses er det nødvendigt at foranstille 4 nullere på se sidste 4 bit for at få matchet korrekt. 10. Implementationsovervejelser: Store tal - BigIntegers Da der til sikre løsninger, af såvel nøgleudveksling med EC, kryptering med EC og andre kryptografisk relevante anvendelser, arbejdes med meget store tal hvor punktets orden skal være større end 2^160 (jf. s 172 i [5])er det nødvendigt at kunne håndtere heltal i den størrelsesordnen. 2^160 = 1461501637330902918203684832716283019655932542976 NIST anbefaler brug af kurver hvor domæneparameteren Fp har p værdier helt op til 2^521-1. Her i decimal form for at få et indtryk at størrelsesordnen: 68647976601306097149819007990813932172694353001433054093944634591 85543183397656052122559640661454554977296311391480858037121987999 716643812574028291115057151 Standard datatyper som fx float og double kan ikke rumme tal af denne størrelse og især ikke med den præcision. En Uint64βs maximale værdi er fx: 18446744073709551615 og der er derfor behov for særlige forholdsregler. Rosing [3]konstruerer i sine eksempler i C selv en ny datatype BIGINT baseret på computerens βintβ størrelse i bytes, der er forskelligt om computeren kører 64 bit eller 32 bit. Han implementerer herunder også alle tilhørende nødvendige matematiske rutiner; addition, multiplikation og division med henblik på optimering. Java kommer i standard pakken med et BigInteger objekt og tilhørende regneoperationer. Java er derfor naturligt nok ofte foretrukket til implementation af EC kryptografi Som noget nyt understøtter Miscrosoft.NET nu med frigivelsen af version 4.0 Big Integers og i øvrigt også Complex numbers med bibliotektet System.Numerics. For bedre performance er det helt grundlæggende afgørende at BigInteger implementeres så disse matematiske standardrutiner er optimerede. 32 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 Der findes desuden et kommercielt produkt - βExtreme Optimization Numerical Libraries for .NETβ der indeholder metoder der bl.a. er optimeret til meget store og komplekse beregninger. http://www.extremeoptimization.com/ Jeg har i mine eksempler primært valgt at anvende Miscrosoft.NETβs BigInterger men visse steder også anvendt indbyggede Extreme.Numerics samt matematik programmet Maple til mindre eksempler. Modulær multiplikativ invers Euklid Vælger vi at arbejde på et primlegeme vil vi i en lang række tilfælde være nødt til at beregne det inverse element til et tal a, eller populært sat dividere med a i et modulært univers. Elementet a har en invers hvis og kun hvis a* x = 1 mod p. På et primlegeme er dette netop tilfældet. At beregne a-1 mod p i realiteten betyder at finde løsningen til a* x = 1 mod p, og det kan være omkostningsfyldte operationer, da der skal mange mellemregninger til for at finde løsningen. Men da p er et primtal og a har en værdi mellem 1 og p-1 har vi at gcd(a,p )= 1 kan vi finde a-1 mod p ved hjælp af Euklids algoritme hvor a*x + p*y = 1 Men foretager en gentagen division af divisor med rest indtil resten er 0. Et eksempel på Euklid inversionsalgoritme her: Input: primtal p og et a hvor (1<=a<p-1) Output: a^-1 mod p 12. u=a,v=p 13. x1=1,x2=0 14. while(u!=0) 1. q = v/u, r=v-qu, x=x2-qx1 2. v=u,u=r,x2=x1,x1=x 15. return x1 mod p tegnet = skal betragtes som en tildelingsoperator og læses fra højre mod venstre Et lille gennemregnet eksempel kan f.eks. ses her. 12 12 http://www-math.cudenver.edu/~wcherowi/courses/m5410/exeucalg.html 33 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 Divisionsoperationer er beregningsmæssigt krævende og algoritmen kan derfor optimeres ved at erstatte disse divisioner med binære højreshift (>>, et tal divideres med 2 ved at shifte tallet en gang mod højre, 1010110 >> 1 giver således 101011 og 1011 >> 1 = 101 β svarende til heltalsdivision eller Math.floor efter division) Et eksempel på en sådan binær algoritme for inversion i Fp her vist i uddrag i C# fra det vedlagte implementationseksempel private BigInteger ModularBinaryInverse(BigInteger a, BigInteger modp) { BigInteger u = a; BigInteger v = modp; BigInteger r1 = 1; BigInteger r2 = 0; while (u != 1 && v != 1) { while (u.IsEven) { u = u >> 1; if (r1.IsEven) { r1 = r1 >> 1; } else { r1 = (r1 + modp) >> 1; } } while (v.IsEven) { v = v >> 1; if (r2.IsEven) { r2 = r2 >> 1; } else { r2 = (r2 + modp) >> 1; } } if (u >= v) { u = u - v; r1 = r1 - r2; } else { v = v - u; r2 = r2 - r1; } } if (u == 1) { return r1 % modp; } else return r2 % modp; } Populært sagt handler det i forhold til performance om antallet af runder i manegen og kompleksiteten af de beregninger der udføres undervejs. Fermat Et alternativ til Euclids algoritme er at anvende Fermats lille sætning hvilket lyder ap-1 = 1 mod p og en variant heraf a-1=ap-2 mod p Med allerede optimerede regnefunktioner tilstede på bigIntegers i System.Numerics til potensopløftning er det ganske let at beregne dette tal: private BigInteger EasyInverse(BigInteger a, BigInteger modp) { BigInteger result =BigInteger.ModPow(a, modp - 2, modp); return result; } En optimeret implementation af operationer på elliptiske kurver vil typisk undgå modulære inverser i størst muligt omfang. Da det er mere omkostningsfyldt end addition og multiplikation. Kvadratrødder modulus p implementation Man kan fx beregne modulære kvadratrødder med Shanks-Tonelli algoritmen . 13 13 http://www.math.vt.edu/people/brown/doc/sqrts.pdf 34 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 Som nævnt findes der dog en række specialtilfælde der kan lette beregningerne hvis særlige betingelser er opfyldt. Ifølge [6 ] s 101 kan følgende algoritme anvendes. Først tjekkes for om legendresymbolet er 1 (jf. afsnittet om kvadratisk rest) og herefter for en række specielle tilfælde, og afslutningsvist den generelle løsning hvor itereres der over en række værdier for at nærme sig løsningen for L=1 Case: p= 3,5,7 (mod 8) If(p=3,7 (mod 8){ x=a^((p+1)/4) mod p return x} if(p=5(mod 8)){ x=a^((p+3)/8) mod p c=x^2 mod p if(c!=a mod p){x=x*2^((p-1)/4) mod p} return x} Case p=1 (mod 8) Random integer d, så 2<=d<=p-1, d/p = -1 (legendre L = -1) t ulige, p-1= 2^s*t A=a^t mod p D=d^t mod p m=0; for(0<=i<s){ if((A*D^m))^2^(s-1-i) = -1 mod p m=m+2^i} x=a^((t+1)/2)*D^(m/2) mod p return x Jeg har implementeret en løsning inspireret af Shanks og algoritmen herover β kodeuddrag ses herunder. protected void Button1_Click(object sender, EventArgs e) { BigInteger inputa = 0; BigInteger modp = 0; inputa = BigInteger.Parse(inputatxt.Text); modp = BigInteger.Parse(inputptxt.Text); BigInteger x=0; int L = CalcLegendre(inputa,modp); if (L != 1) { resulttxt.Text = "no solution"; } else { x = CalcSquareMod(inputa, modp); resulttxt.Text = x.ToString(); } }//end button 35 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 private BigInteger CalcSquareMod(BigInteger a,BigInteger p){ //int count = 1; BigInteger b = 0; BigInteger c = 0; BigInteger i = 0; BigInteger l = 0; BigInteger k = 0; BigInteger q = 0; BigInteger r = 0; BigInteger s = 0; BigInteger z = 0; BigInteger n = 0; if (((p % 8) == 3) || ((p % 8) == 7)) { r = BigInteger.ModPow(a, (p + 1) / 4, p); return r; } else if ((p % 8) == 5) { r = BigInteger.ModPow(a, (p + 3) / 8, p); q = (r * r) % p; if (q != a) { r = (r * BigInteger.ModPow(2, (p - 1) / 4, p))%p; } return r; } else{ k = p - 1; //find init værdier for s og k så p= 2^s * (2*k + 1) -1 while(k.IsEven){ s++; k /= 2; } k = (k - 1) / 2; //find z så z IKKE er en kvadratisk rest mod p..! z = 2; while (CalcLegendre(z, p) == 1) { z++; } //find init værdier for r,n og c r = BigInteger.ModPow(a,k+1,p); n = BigInteger.ModPow(a,2*k+1,p); c = BigInteger.ModPow(z,2*k+1,p); //find løsning while (n > 1) { //count++; l = s; b = n; for (i = 0; i < l; i++) { if (b == 1) { b = c; s = i; } else { 36 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 } } b = (b * b) % p; } c = (b * b) % p; r = (b * r) % p; n = (c * n) % p; return r; }//end p=1 mod 8 }//end calcSquareMod private int CalcLegendre(BigInteger a,BigInteger p) { //0 hvis p deler a, 1 hvis a er en kvadratisk rest mod p, -1 hvis det er en ikke rest - nonresidue. if ((a % p) == 0) { return 0; } } if (BigInteger.ModPow(a, (p - 1) / 2, p) == 1) { return 1; } return -1; Punktet i uendelig - homogene koordinater Et af problemerne med at håndtere beregninger på elliptiske kurver er punktet I uendelig β det er en svær størrelse at håndtere. Der kan observeres flere forskellige måder at gøre dette på, bl.a. ved hjælp af homogene 14 koordinator der skulle give en matematisk solid basis for implementation. Der ses også en række alternative metoder β en mindre elegant genvej og kodemæssig βlavpraktiskβ løsning kan f. eks være at lade punktet i uendelig være repræsenteret ved et punkt der med sikkerhed ikke er eksisterende på kurven og så lave særlige regler for multiplikation og addition med netop dette punkt. Homogene koordinator I projektive rum Man foretager en projektion fra 3d til 2d Vi har at for R3 minus nulpunktet gælder der at to punkter P = (x, y, z) og Pβ = (xβ, yβ, zβ) er ækvivalente hvis der findes et reelt tal Ξ» forskellig fra nul således P = Ξ»·Pβ, i.e. x = Ξ»xβ, y = Ξ»yβ, z = Ξ»zβ. Vi kan da skrive et element I det projektive plan, dvs en ækvivalens klasse svarende til et almindeligt point (x, y, z) in R3 som [x : y : z]. Punkter på denne form kaldes også homogene koordinator. [x:y:0] er punktet i uendelig, endelig punkter er [x:y:z]= [x/z:y/z:1] Vi vil da homogenesere ligningen for en elliptisk kurve således: Vi tilføjer z indtil alle dele af ligningen har same grad: 14 http://en.wikipedia.org/wiki/Projective_space 37 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 y2=x3 + Ax + B bliver til y2z=x3 + Axz2+Bz3 Beregninger I det projektive rum giver os en måde at arbejde med punktet i uendelig β punktet bliver blot et specialplan i det tredimensionelle rum hvor parallelle linjer mødes. Fordelen ved at arbejde med projektive koordinator er desuden at man slipper for at beregne de omkostningsfyldte multiplikative inverser. Jeg har i mine eksempler valgt den mindre elegante løsning. βDouble and addβ algoritme Da vi meget ofte har behov for at beregne værdien af nP for vilkårligt store n kan vi i stedet for at lave n-1 successive additioner anvende den såkaldte βdouble and addβ algoritme. Den bruger lidt samme princip som hurtig potensopløftning, vi bruger binær ekspansion for tallet n og kan da beregne nP hurtigt. β eksempel n=947 . Det skrives således binært 1110110011 . Det betyder at n=947 = 29+28+27+25+24+21+20 Hvorfor vi har at 947P = P+2P+16P+32P+128P+256P+512P. Det giver 9 fordoblinger og 6 additions, hvilket er meget bedre end 946 additioner. Vi har generelt følgende algoritme fordoblings og additions algoritme: 1. input point P fra E(Fp) og n>=1 2. sæt Q=P og R=O (punktet I uendelig) 3. while n>0{ if n = 1 (mod2) sæt R= R+Q sæt Q=2Q and n=n/2 (floor)} 4.return R (som nu er lig nP) Hurtig potensopløftnings algoritmen En let måde at beregne potenser modulært hvor man benytter den binære repræsentation af potensen Lille eksempel: 511 mod 13 Vi kan skrive 11 som en sum af potenser af 2 β altså binært 11 bliver til 1011, det betyder 11= 5^(23+21+20)= 5^(23)*52*5. Vi reducerer så modulus 13 i hvert skridt og dermed forbliver tallene små. Det giver så 1*12*5= 60 mod 13= 8 38 christelbach.com - all rights reserved © Christel Bach© 11. Kryptografi med Elliptiske Kurver v.1.5 Kryptografisk anvendelse af Elliptiske kurver Principper bag Elliptic Diffie-Hellman nøgle udveksling Elliptiske kurver kan anvendes til på en sikker måde at udveksle en fx en krypteringsnøgle, der typiske efterfølgende anvendes til symmetrisk kryptering. Det er et almindeligt setup, hvis hastighed er vigtigt. Den bagvedliggende ide er asymmetrisk nøgleudveksling, hvor en βbootstrapβ funktion β i dette tilfælde punktaddition på EC, betyder lette beregninger den ene vej og meget svære beregninger den anden vej. Nøgleudveklingen ligner meget den klassiske Diffie-Hellman nøgleudveksling baseret på DLP jf. Bilag B6 og er ganske ligetil. Beregninger til konkrete eksempler i forbindelse med nøgleudveksling kan udføres og efterprøves i de tilhørende eksempelapplikationer. Offentligt tilgængelige parametre og beregninger Domæne parametre vælges og offentliggøres: Stort primtal p, Elliptisk kurve E over Fp og et punkt P i E(Fp) Private beregninger Alice Bob Vælger hemmelig nøgle nB (et heltal) Vælger hemmelig nøgle nA (et heltal) Beregner punktet QA som nA*P Beregner punktet QB som nB*P Offentlig udveksling af værdier Alice sender QA til Bob (åben linie)---ο QA QB ο------Bob sender QB til Alice (åben linie) Yderligere private beregninger Alice Bob Beregner punktet nA*QB Beregner punkter nB*QA Den dermed delte hemmelighed er nA*QB = nA*(nB*P)=nA*nB*P=nB*(nA*P)=nB*QA Sikkerheden ligger således i at det er svært at finde nA*nB*P når nA*P og nB*P er kendt. Essensen i det elliptisk kurve diskrete logaritme problem (ECDLP) Nærmere undersøgelser viser at det er unødvendigt at sende begge koordinator for QA og QB. De kan nøjes med at udveksle punkternes x værdier. jf s 298 [9]. Eksempel på Diffie-Hellman nøgleudveksling med P-192 Alice vælger sin hemmelige nøgle til at være: nA: 45600302345679990129 og beregner nA*P = QAx: 1894528013049453710734019818911225986194117239051331666114 39 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 QAy: 5622611255302448950252315476205327416275270401076249908551 Bob vælger sin hemmelige nøgle til at være: nB:674839290001004592720994 og beregner nB*P= QBx: 5065705273371010596137307787498960801693416542388365582997 QBy: 1398530282572627364052761296018227430013115282736611268301 De udveksler QA og QB gerne offentligt og kan nu hver især beregne den fælles hemmelighed: Alice beregner nA*QB=S1 S1x: 1755344126327670519259343913010319700785343903081333742686 S1y: 2373062010241911390714962920082029611707151511036195566445 Bob beregner nB*QA=S2 S2x: 1755344126327670519259343913010319700785343903081333742686 S2y: 2373062010241911390714962920082029611707151511036195566445 Som det ses er S1=S2 , den fælles hemmelighed til fx symmetrisk kryptering. Hvis elliptiske kurver skal anvendes til nøgleudveksling skal der dog anvendes lidt større kurver . ifølge SuiteB henvises der til NIST 800-56A der angiver kurverne P-256 eller P-384 til dette brug: Jf www.nsa.gov/ia/industry/crypto_suite_b.cfm (nu http://www.nsa.gov/ia/programs/suiteb_cryptography/index.shtml) Den kan findes på : http://csrc.nist.gov/groups/ST/toolkit/documents/SP80056Arev1_3-8-07.pdf Dette dokument fastsætter blandt meget andet en lang række forskellige yderligere protokolmæssige forhold omkring nøgleudveksling, som ikke vil blive beskrevet nærmere her. Principper bag EC ElGamal Public Key kryptosystem Princippet bag ElGamal public key system (jf bilag B6) der er baseret på det diskrete logaritme problem (DLP) kan direkte overføres til elliptiske kurver, altså samme protokol blot baseret på ECDLP. Såvel P som M skal ligge på kurven. Alice Offentligt tilgængelige parametre og beregninger Domæne parametre vælges og offentliggøres: Stort primtal p, elliptisk kurve E over Fp, og et punkt P i E(πΉπΉπΉπΉ) Private Beregninger Bob Alice vælger som privat nøgle nA og beregner offentlig nøgle 40 christelbach.com - all rights reserved © Christel Bach© QA=nA*P Kryptografi med Elliptiske Kurver v.1.5 Offentlig udveksling af værdier Alice publicerer den offentlige nøgle QAο KRYPTERING Private Beregninger Bob vælger en klartekst M. Han vælger et tilfældigt k Han beregner C1=k*P og C2= M + k*QA Offentlig udveksling af værdier ο Bob sender den krypterede besked ( C1, , C2 ) til Alice DEKRYPTERING Alice beregner C2-nA*C1 = M Private beregninger At det giver den korrekte besked M ses ved simpel substitution: C2-nA*C1 = M+k*QA - nA*k*P=M+k*nA*P - nA*k*P=M Man vil kunne nøjes med blot at sende x koordinaten da y jo dermed allerede er fastlagt β op til et fortegn β i praksis om y skal findes i den øvre eller nedre halvdel af p. En patenteret version af ECC benytter netop denne egenskab og sender da blot x og en ekstra bit med fortegnet. En lang række implementationer af ECC er i øvrigt patenteret 15, især af Certicom 16. EC El Gamal har det klare problem at der ikke er nogen oplagte måder at knytte punkter på kurven til klartekst. Koblitz har dog foreslået en metode beskrevet herunder. Menezes og Vanstone har foreslået en modificeret version af ElGamal der præsenteres under afsnittet βMV ElGamal - Menezes β Vanstone varianten af ElGamalβ At repræsentere klartekst med punkter på elliptiske kurver Der er ikke nogle indlysende og ligefremme måder at mappe plaintekst direkte til punkter på en kurve. Problemet er følgende: Da der ikke er nogen polynominal tids algoritme til at fastlægge punkter på en kurve vi det være besværligt forhånd kende punkterne på kurven og knytte beskeder til disse. Der er ingen garanti for at der på kurven findes et punkt så y2 = m3 + A*m + b mod p. Faktisk er sandsynligheden for at det er tilfældet af størrelsesordnen ½ da cirka halvdelen af alle heltal er kvadrattal modulus p. 15 16 http://en.wikipedia.org/wiki/ECC_patents http://certicom.com/ 41 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 Dette kan ses ved følgende ræsonnement. Kvadratisk rest Vi har, at så længe vi beregner kvadratroden modulus et primtal p, findes præcis to løsninger, nemlig b og βb. Antag af p er et primtal p>2. Vi vil da vide hvilke ikke-nul elementer i Fp: {1,2,3,4β¦p-1} der er kvadrattal. Hvis der eksisterer et a i Fp* som er kvadratisk har vi et b2=a og a har som nævnt præcist to kvadratrødder; b,-b.. Kvadrattallene i Fp* kan da alle beregnes som b2 mod p for b= 1,2,3,4,β¦(p-1)/2 idet de resterende tal op til p-1 alle er kongruente med βb for et b mindre end p minus 1 halve. Så præcist halvdelen af elementerne i Fp* er kvadrattal. Kvadrattallene i Fp kaldes kvadratisk rester (Quadradic residues) modulus p. De andre kaldes nonresidues β βikkeresterβ. Der er( p-1)/2 kvadratiske rester i Fp. Legendresymbolet L= a((p-1)/2) mod p Denne SKAL være lig med en, L=1, for at der findes en kvadratisk rest. Legendre symbolet er størrelse der kan antage værdier 0,1 eller -1 afhængig af om a er en kvadratisk rest eller ej. Er den 0 går a op i p. Jf [4]s. 43 Koblitz embedding af klartekst Der findes således en statistisk metode udviklet af Koblitz jf [4]s.179 og [10] s 355 Metoden virker som følger: Antag at det accepteres at der er en lille sandsynlighed for at beskeden ikke kan mappes til et punkt. Denne sandsynlighed udtrykkes ½ ^K. Antag at (m+1)*K < p Beskeden vil da være repræsenteret ved tallet x = m*K + j hvor der testes for løsninger til y= (x3 + Ax + B)1/2 hvor j løber mellem 0 og K-1. Hvis der findes en sådan kvadratrod vil beskeden m kunne embeddes som Pm = (x,y) Beskeden vil kunne læses fra punktet ved at beregne m= x/K (floor) Kryptering med koblitz embedding eksempel Vælges f.eks en tolerance på en promille svarer det til K=10 idet ((1/2)^10)*100 ~ 0.0977 Hvis vi vælger et eksempel med små tal for anskuelighedens skyld skal vi altså f.eks gøre som følger: Antag at p=173, punkt på kurven: P=(23,17) E(Fp): Y2=X3 -3X + 128 Vi har dermed behov for at m*K + K < 173, altså m*10 + 10 < 173 dvs 0<=m<=16 Idet 16*10+10=170 Vi vælger beskeden m =7 x=m*K+j 42 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 7*10 + j=70 + j. Dvs x kan antage værdierne 70,71,72β¦79 Vi behøver derfor kun at loope igennem 10 mulige kandidater for at finde en løsning. Vi leder naturligvis efter et resultat der er et kvadrattal mod q, dvs er en kvadratisk rest mod p. Vi har følgende mulige værdier for Y2 med de mulige x kandidater: 32,62,172,22, 137,4,148,56,80,53 ( i rækkefølge: 4,22,32,53,56,62,80,137,148,172) Det ses straks at y2=4 for x=75 er en løsning. Altså punktet P=(75,2) må da være et punkt på kurven der kan korrespondere beskeden med beskeden m= 7 Beskeden findes igen ved at tage x/K (floor). Vi har da 75/10= 7 Men der er stor sandsynlighed for at flere af de andre værdier er kvadratiske rester modulus 173. Vi finder ved trial-error at 39^2 mod 173 faktisk er 137. Vi vil da også kunne anvende punktet: (74,39) og har fortsat at beskeden findes korrekt 74/10 = 7 Ligeledes findes at 54^2 mod 173 = 148. Så endnu et punkt fundet: (76,54) Vi kan teste mulige kandidater op mod denne variant over eulers ligning hvis resultat er det samme som legendre symbolet: k2=a mod p findes hvis og kun hvis a^((p-1)/2) mod p β‘ 1 altså (Y2)^(172/2) mod 173; og hvis resultatet er 1 har vi en kandidat. Følgende værdier giver -1 ( = 172) mod 173: 32, 62, 80, 53 og er derfor ikke kandidater, det er derimod denne række da deres legendre symbol giver 1; 172, 22, 56, 137,4,148. Vi finder ved denne metode at følgende værdier for y2 vil give en kvadratisk rest der opfylder betingelserne. Det er ikke trivielt at beregne kvadratrødder modulært, men der findes flere forskellige måder. Vi kan iflg Lagrange hvis p β‘ 3 (mod 4) beregne tallet som følger kβ‘+- a^((p+1)/4) mod p Vi tester da først for dette. 173 mod 4 =1. Alternativt har Legendre en løsning hvis if p β‘ 5 (mod 8) {x=a^((p+3)/8) mod p, c=x^2 mod p, if(c!=a mod p){x=x*2^((p1)/4) mod p}return x} Vi har at 173 mod 8 =5 og vil kunne anvende dette specialtilfæle. Vi regner det således for a = 56 p=173, a= 56 43 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 x= 56^((173+3)/8) mod 173 = 109 109^2 mod 173 = 117. og da 117 er forskellig fra 109 beregner vi x= 109* 2^(172/4)mod 173 = 70 og tjekker at 70^2 mod 173 = 56 Ifølge [6] er der ligeledes en række andre special tilfælde der kan gøre det lettere. Jeg implementerede en løsning under afsnittet βKvadratrødder modulus p implementationβ og finder at Sqrt(172) mod 173 = 80, Sqrt(22) mod 173 = 117, Sqrt(56) mod 173 = 70, Sqrt(137) mod 173= 134, Sqrt(148) mod 173 = 119 og Sqrt(4) mod 173= 171 Sidstnævnte er naturligvis det samme som βb. MV ElGamal - Menezes β Vanstone varianten af ElGamal Ifgl[9] s 343 har Menezas og Vanstone udviklet en variant af ElGamal der muliggør anvendelse af EC til kryptering uden at knytte beskeder direkte til punkter og de besværligheder der følger med dette. Man vælger en besked M= m1,m2. og beregner produktet af dette og et punkt på kurven. Protokollen for denne MV-ElGamal variant er vist herunder: Offentligt tilgængelige parametre og beregninger Domæne parametre vælges og offentliggøres: Stort primtal p, Elliptisk kurve E over πΉπΉπΉπΉ og et punkt P i E(Fp) Private Beregninger Alice Bob Alice vælger som privat nøgle nA og beregner Q A = nA β ππ Offentlig udveksling af værdier Alice publicerer den offentlige nøgle Q A ο KRYPTERING Private Beregninger Bob vælger en klartekst m1 og m2 modulus p. Han vælger et tilfældigt k og beregner ππ = k β ππ Han beregner ππ = k β Q A og skriver det som ππ = (xS , yS ) Han sætter c1 = xS β m1 mod ππ c2 = yS β m2 mod ππ Offentlig udveksling af værdier ο Bob sender den krypterede besked (ππ, c1, , c2 ) til Alice DEKRYPTERING Alice beregner T = nA β ππ 44 Private beregninger christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 og skriver ππ = (xT , yT ) Hun sætter m1β² = xT β1 c1 mod ππ mβ²2 = yT β1 c2 mod ππ og har da at m1β² = m1 og at mβ²2 = m2 Vi kan vise at krypteringen virker således Bevis for at π¦π¦β²ππ = π¦π¦ππ og at π¦π¦β²ππ = π¦π¦ππ : β1 Vi har at (mβ²1 , mβ²2 ) = (οΏ½xβ1 T β c1 οΏ½, οΏ½yT β c2 οΏ½) = ((π₯π₯ππβ1 β π₯π₯ππ β ππ1 ), (π¦π¦ππβ1 β π¦π¦ππ β ππ2 )) Vi mangler da blot at vise at T=S ππ = nA β ππ = nA β k β ππ = QA β k = ππ Fordelen ved dette system er at de krypterede beskeder ikke er afhængige af eksistensen af bestemte punkter på kurven. Beskedudvidelse: Sådanne systemer giver en udvidelse af beskedlængden og dermed også behov for at sende mere information pr besked end længden af beskeden. I tilfældet Koblitz får vi en firedobling da der for hver plaintekst m skal anvendes koordinaterne m1,m2 og den krypterede besked c1,c2 består af fire tal da der til hvert c knytter sig to koordinater. Ved i stedet at vælge at beskeden m ingen direkte tilknytning har til punkter på kurven reduceres dette. Jf [9] s.300. Med MV ElGamal vil man kunne nøjes med en fordobling da to beskeder giver fire punkter. Der findes måder at optimere dette yderligere. Herunder et lille gennemregnet eksempel hvor der benyttes P-192: Eksempel: Domæne parametre P-192 Alice vælger sin nøgle nA=42 QAx:4185472242164967416073535207017700391327566827942296643232 QAy:6153697814367168108673891119168116667577085838602601518070 Som besked M vælges: Vibevej2 Oversættelse fra klartekst til ASCII værdier kan let implementeres og et lille eksempel på hvordan er vist i slutningen af dette afsnit. 45 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 oversat til char værdierne i ASCII tabellen 17får vi 86 105 98 101 118 101 106 50 kan normaliseres til m1=086105098101 m2=118101106050 altså en besked M delt i en x og en y koordinat. Det er klart at med denne banale oversættelse fra klartekst til ascii decimaltal, vil M her kun kan antage et begrænset antal værdier og det vil være en sårbarhed der vil være åben over for statistisk analyse. Det vil også være hensigtsmæssigt i forbindelse med optimering af sådan et system, at undersøge hvad der er mest effektivt; - at lave meget lange og store beregninger med meget store tal frem for mindre tal hvor der itereres over flere punkt beregninger. I dette eksempel krypteres kun via et gennemløb. Bob vælger et tilfældigt k=666 og beregner k*P= R Rx=3860888126715376297061837125523468217946653704297671234980 Ry=1713930569144474905671260344111335470105855823395511588834 Han beregner k*QA=S=666*QA= Sx=1708963741076985658615763266160195183172716576861956067757 Sy=863850825861113597072455524978602376084698547032572545089 c1 og c1 skal da beregnes som: da vi opererer med p-192 er p =6277101735386680763835789423207666416083908700390324961279 c1=086105098101*Sx mod p =4125119106641708631008410939537091809177032574604725655082 (Bcalc1) c2=118101106050*Sy mod p =1095172169333449301313221634686671435277573939186130217326 (Bcalc2) Bob sender derfor til Alice følgende: 3860888126715376297061837125523468217946653704297671234980, 1713930569144474905671260344111335470105855823395511588834, 4125119106641708631008410939537091809177032574604725655082, 1095172169333449301313221634686671435277573939186130217326 17 http://en.wikipedia.org/wiki/ASCII - ASCII printable characters 46 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 Alice kan nu læse den hemmelige besked således: T= nA*R=42*R= Tx:1708963741076985658615763266160195183172716576861956067757 Ty:863850825861113597072455524978602376084698547032572545089 hvilket i øvrigt ses at være det samme som Bob's S for k*Qa m1 og m2 vil hun da beregne som m1=(Tx)-1*c1 mod p altså en modulus invers af Tx der kan beregnes til at være: 362597256794625975268988920526302302508782574301183531788 m1=362597256794625975268988920526302302508782574301183531788*c1 modp =86105098101 Ty^-1=4313942180723358294434328075805847763990522353269117465080 m2=4313942180723358294434328075805847763990522353269117465080*c2 mod p =118101106050 m1: 86105098101 normaliseres bagfra til 086 105 098 101 m2: 118101106050 der læses som 118 101 106 050 hvilket ses at være den korrekte besked. Som det ses en det kun en lille del af beregningen der vedrører selve beskeden og man vil altså let kunne transmittere lange beskeder når først kontakt er etableret med domæne parametre og Alices udsendelse af QA og Alices modtagelse af R. Alice behøver kun en gang i forbindelse med dekrypteringen af besked at foretage en modulus invers β nemlig første gang hun skal beregne Tx^-1 og Ty^-1. Alle efterfølgende beskeder beregnes blot som et multiplum af resultatet modulus p. Det er afgørende at k IKKE anvendes igen i efterfølgende beregninger selv om det kunne se ud som at man ved fortsat anvendelse af de samme private nøgler nA og k og offentlige nøgler QA og R i kommunikationen mellem Alice og Bob kun var beregningerne af c1, c2 og m1 og m2 der var nødvendige. men det giver sammenhørende værdipar der vil introducere en stor sårbarhed i systemet. k er altså en engangsnøgle. Fra klartekst til ASCII værdier og fra ASCII til klartekst En tekststreng kan nemt oversættes til talværdier fx med en indbygget ASCII encoding funktion der anvendes her til demonstrationsbrug. Den har som output et bytearray der uden yderligere oversættelse læses direkte i to- eller trecifrede heltal. 47 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 For at være sikker på at en længere ascii encoded streng korrekt oversættes til tekst bagefter kan man separere karaktererne og kryptere dem enkeltvist, man kan anvende en separator eller som her blot sikre at et hvert bogstav altid oversættes til 3 cifre. Tilsvarende kan resultaterne igen opdeles i bidder af 3 og oversættes til karakterer. Kodeuddrag: //oversæt klartekst til ascii decimal tal protected void translate_btn_Click(object sender, EventArgs e) { string m = inputmtxt.Text; string result = ""; byte[] b = Encoding.ASCII.GetBytes(m); foreach (byte c in b) { string cstr = c.ToString(); if (cstr.Length == 2) { cstr = "0" + cstr; } result += cstr; } outasciitxt.Text = result; } //oversæt ascii decimaler til klartekst protected void reversetranslate_btn_Click(object sender, EventArgs e) { //deling af tekststrengen så det går op med tre string m1half = m1txt.Text; string m2half= m2txt.Text; //løsning af nul-som -første-tegn-fejl if (m1half.Length % 3 != 0) { m1half = "0" + m1half; } if (m2half.Length % 3 != 0) { m2half = "0" + m2half; } string enc = m1half+m2half; if (enc.Length % 3 == 0) { string display = ""; for (int i = 0; i <= enc.Length - 2; i += 3) { string subst = enc.Substring(i, 3); int let = Convert.ToInt32(subst); char c = (char)let; display += c.ToString(); } 48 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 } else { } outmtxt.Text = display; outmtxt.Text = "number of digits must be divisible by 3"; } ECDSA β Digital Signatur med Elliptiske kurver Signaturalgoritmen er standardiseret i FIPS-186-3 og IEEE 1363. Faktisk er de tidligere nævnte NIST kurver og domæneparametre netop i FIPS-186-3 angivet med henblik på digital signatur. Protokollen består af fire algoritmer, domæneparameter generering, en nøgle generering, algoritme til signering af dokument og verifikationsalgoritme. Skematisk set kan ECDSA betragtes som herunder Offentligt tilgængelige parametre og beregninger Domæne parametre vælges og offentliggøres: Elliptisk kurve E over πΉπΉπΉπΉ og et punkt P i E(Fp) af stor primtalsorden (dvs stort q hvor q*P=πͺπͺ) Nøglegenerering Alice Enhver Alice vælger som privat signeringsnøgle s , der skal være mindre end q-1 og beregner V = s β ππ Offentlig udveksling af værdier Alice publicerer sin offentlige verifikationsnøgle V ο Signering Private Beregninger Alice vælger et dokument d mod q (feks hashværdien af et dokument) Som engangsnøgle vælges et e mod q Hun beregner R=e*P og sætter S1=rx mod q og -1 S2=(d+s*s1)*e mod q Offentlig udveksling af værdier Alice publicerer signaturen ( s1, , s2 ) ο Verifikation Private beregninger Bob β og enhver anden - kan nu beregne: u1=d*s2-1 mod q og u2=s1* s2-1 mod q 49 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 Vi beregner nu u1*P + u2*V og verificerer at x koordinaten af (u1*P + u2*QA) mod q =s1 At signaturens verifikation virker kan ses ved substitution: u1*P + u2*QA= d*s2-1*P+ s1* s2-1 *s*P= d*((d+s*rx)*e-1)-1*P + rx((d+s*rx)*e-1)-1*s*P= d*e*(d+s*rx)-1*P+rx*e*(d+s*rx)-1*s*P= eP*(d+s*rx/ d+s*rx)=eP. Og da vi netop har at x koordinaten af e, rx =s1 er signaturen verificeret. Ifølge standarden der er specificeret i FIPS-186-2 skal beskeden hashes med en kryptografisk sikker hashfunktion med en bitlængde mindre end q. Hashværdien kan afkortes hvis den skulle være længere. Desuden sikres mod at x koordinaten for Alices nøgle ikke er 0. Der testes i verifikationen ligeledes for om u1*P + u2*V skulle give punktet i uendelig og er det tilfældet afvises signaturen. Der skal naturligvis anvendes et sæt af de specificerede domæneparametre herunder basepunktet Pβs primiske orden. Lille ECDSA eksempel Vi vælger en kurve E(Fp):Y2=X3+231X+473 for p =17389 Vi har punktet P=(11259,11278) ordenen af punktet q =1321, dvs 1321*G=O. Alices hemmelige nøgle s= 542, vi ser at 542 < 1321. Hun beregner verifikationsnøglen V=8689, 1726 Dokumentet d=644 og bruger tilfældig nøgle e=847 Signaturen på dokumentet er da s1 = x koordinaten af (eP)=( 8417,8276), altså 8417 mod 1321, vi har da s1= 491 S2 er (m + s*s1)*e-1 mod q= (644+542*491)*847-1 mod 1321= 266766*170 mod 1321=290 S2=290. Signaturen er dermed (s1,s2)=491,290 Verifikation af signaturen: u1=644*(290) -1 mod 1321 = 1305 u2=491*(290)-1 mod 1321=316 50 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 Beregn 1305*P + 316*V = (9097,8279)+ (10752,10085)= (8417,8276)og x koordinaten 8417 mod 1321 =491. Hvilket også er s1. Dermed er signaturen verificeret. ECDSA eksempel med P-192 Vi anvender P-192 og har da følgende parametre p= 6277101735386680763835789423207666416083908700390324961279 Basepunktets koordinater er Px = 602046282375688656758213480587526111916698976636884684818 Py = 174050332293622031404857552280219410364023488927386650641 og punktets orden er q= 6277101735386680763835789423176059013767194773182842284081 Alice vælger som sin private nøgle s= 2012 Alice beregner og offentliggør sin verifikationsnøgle V=(2922239241191941502284728959322335584196442148729153291377, 1502159992078275043300446768429050252602320077568505599434) Et tænkt dokuments hashværdi viser sig at være d=13700000 Hun vælger et e= 117 og beregner R=eP og får at x koordinaten for den er: R=1527582501009595379995457860700428877881691533865105226913, 4893605161761473125188711747930087679206868472008812551775 Vi har her at x koordinaten er mindre end q, dvs s1=1527582501009595379995457860700428877881691533865105226913 og s2 der beregnet til at være s2=(d+s*s1)*e-1 mod q =( 13700000 + 2012*1527582501009595379995457860700428877881691533865105226913)* 117-1 mod 6277101735386680763835789423176059013767194773182842284081. Vi kan beregne 117-1 mod q til: 858407074924674292490364365562537984788676208298508346541 og får så s2=2341099299562788751111958401647355403058072626470462149990 Signaturen s1,s2 offentliggøres da. Vi kan så verificere signaturen ved at beregne 51 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 u1= d* s2-1 mod q =13700000*s2-1 mod q = 13700000*5389700900305434341950176528763606871832257565524323568776 mod q = 5043957816523352802764515449112470456583857224793495319585 u2= s1* s2-1 mod q =1527582501009595379995457860700428877881691533865105226913*5389700900305 434341950176528763606871832257565524323568776 mod q = 1183029175760643805892065340635084470564090535081852173276 Vi beregner nu u1*P og u2*QA Vi finder at u1*P= (2755168697580953239077556897250970010965048760304207384993, 2244872401584975394146297467936750707360747183849247952249) Og at u2*V= (26937839670117915397077702248718703919341152429677728160, 4290995809728762263188768931302125326828385123373315121812) De to punkter lægges sammen og vi får: 1527582501009595379995457860700428877881691533865105226913, 2244872401584975394146297467936750707360747183849247952249 Og vi ser at x koordinaten er identisk med s1 hvorfor signaturen hermed er verificeret 12. Implementation af MV ElGamal ECC Generelt set har jeg valgt en simplificeret implementation der ikke drager nytte af de fordele der f. eks er nævnt i afsnit 8 for optimerede beregninger på primlegemer, jeg har ikke valgt at implementere homogeniserede koordinator eller andre mere avancerede måder at tilgå emnet på. Alle beregninger foregår med heltal repræsenteret i decimalform, for at fremme forståelsen for hvilke beregninger der foregår. Af samme grund er denne implementation på ingen måde optimeret. Jeg har prioriteret anskuelighed og anvendelse af kendte rutiner. Det er de samme grundlæggende rutiner - punktaddition og punktfordobling på elliptiske kurver, der ligger til grund for de fleste rutiner. 52 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 I samlingen findes både små programmer man kan bruge til delberegninger og et samlet system. Jeg har således lavet β’ β’ Generel EC Calculator: http://christelbach.com/ECCalculator.aspx Kan bruges til addition og fordobling på kurver med selvvalgte parametre, med vilkårligt store tal β’ β’ NIST- kurve beregninger: http://christelbach.com/ecc1.aspx Kan bruges til addition og fordobling på alle NIST kurver baseret på primlegemer. Kan f. eks bruges til nøgleudveksling. β’ β’ Squareroot modulus p: http://christelbach.com/squaremod.aspx Modulær multiplikativ invers: http://christelbach.com/calcmodinverses.aspx Kodeeksempler på to sidste nævnte er allerede vist i tidligere afsnit. β’ MV Elliptic Curve ElGamal encryption/decryption: http://christelbach.com/MVECC.aspx MV Elliptic Curve EC encryption/decryption er en samlet løsning der kan kryptere og dekryptere en indtastet værdi. Den indeholder de fleste rutiner inkluderet i de øvrige applikationer derfor er det den der er vedlagt i Bilag A1 Det er en halvautomatisk løsning hvor man kan se alle skridt undervejs i processen, ligesom man kan vælge sine egne tal eller randomiserede tal β der også vises. Jeg har valgt at kryptere beskeden i kun ET punkt, et gennemløb, og af samme grund er der også grænser for beskedens størrelse. Løsningen er kodet i C#.NET. Det betyder at der ikke vil være nogen nævneværdig forskel på om koden publiseres som standalone windows applikation eller som ASP.NET applikation tilgængelig via internettet. Jeg har valgt at vise mine eksempler i den sidste form af hensyn til tilgængeligheden. Jeg viser kun backend delen, resten er GUI og vil kunne hentes direkte på den angivne hjemmeside. Den del der vedrører validering af input og exception håndtering vil ikke blive berørt. Koden er sine steder ikke for køn, da den indeholder redundans her og der. Især i forbindelse med indlæsning af parametre, da alle de mange enkeltdele af applikationen kan stå alene. Der er basis for en efterfølgende oprydning og finpudsning. Der forestår et arbejde dels med at fjerne redundans, tilføje noget validering og exception handling, opdele beskeden så der iterativt kan krypteres længere beskeder. Ved næste større omorganisering af koden forventer jeg at simplificere løsningen ved lave et kurve objekt der så kan instantieres med passende parametre. 53 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 Koden er vedlagt med kommentarer i bilag A1 og alle eksempler kan som nævnt ses og afvikles på www.christelbach.com . Sitet er hostet af unoeuro.com der som en af de få er begyndt at understøtte .NET 4.0 Løsningen vil senere også blive tilgængelig på www.christel.dk/crypto 13. Pakkeløsninger, biblioteker og andre implementationer Illustrative implementationer af kryptografi med EC Der findes en stor mængde af implementationer publiceret eller offentlig tilgængeligt på nettet. Herunder blot et par udpluk. Rosing har udgivet bogen βImplementing Elliptic Curve Cryptographyβ . Her er al kildekode i C tilgængelig og en række interessant implementationsovervejelser. Ifgl Rosing selv er hans algoritmer dog ikke udviklet med henblik på effektivitet men på anskueliggørelse. Hans implementationer kan dog ikke anbefales ifølge en debat mellem en række debattører på Usenet i Sci.Crypt.. Herunder D. Hankerson - medforfatteren til bogen Guide to Elliptic Curve Cryptography[5]. Jf indlæg: That is the book I *cannot* recommend to read. Rosing encourages all players in the crypto world to pick their own curves at random (even without counting the points on it). That is nonsense, and won't result in secure systems. Bogen giver dog en fornemmelse af hvilke skridt der skal tages I forbindelse med en implementation. Et andet eksempel på illustrativ implementationen kan ses på hjemmesiden tilhørende Klaus Reinhardt, Universitet i Tübingen. Han har flere βlegetøjseksemplerβ på elliptisk kurve kryptografi implementeret i Java liggende her: http://www2-fs.informatik.uni-tuebingen.de/~reinhard/krypto/English/english.html og kildekode kan ses her: http://www2-fs.informatik.uni-tuebingen.de/~reinhard/krypto/java/ Hans løsning er ikke baseret på meget store tal og nærmere studier af hans kode vil vise at punktet i uendeligt er repræsenteret ved tallet 666,666 (!) Der findes desuden en open source implementation skrevet i Pearl her: http://search.cpan.org/~billh/Crypt-ECDSA-0.069/ 54 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 Support af Suite B i .NET Certicom tilbyder en API løsning der muliggør Suite B niveau: βCerticom Security Builder API for .NETβ http://certicom.com/net .NET har siden version 3.5 givet fuld understøttelse af diverse suite B algoritmer Læs mere her på MSDN: http://msdn.microsoft.com/en-us/library/bb332048.aspx To relevante klasser er beskrevet her: Digital Signatur med EC: Elliptic Curve Digital Signature Algorithm (ECDSA). http://msdn.microsoft.com/enus/library/system.security.cryptography.ecdsacng.aspx Diverse kryptografiske operationer med EC Diffie-Hellman http://msdn.microsoft.com/enus/library/system.security.cryptography.ecdiffiehellmancng.aspx Andre løsninger - Bouncy Castle bouncycastle.org stiller et API til rådighed og dokumenterer brug af API til java implementation af EC kryptografi her: http://www.bouncycastle.org/wiki/display/JA1/Using+Elliptic+Curve Eksempel på Digital Signatur med EC via Bouncy Castles API: http://www.java2s.com/Tutorial/Java/0490__Security/DSAwithEllipticCurve.htm 14. ECC versus RSA Det er naturligvis relevant at overveje hvordan performance og sikkerhed på elliptisk kurve kryptografi er sammenlignet med RSA. På rsa.com 18kan man finde et skema over sammenlignelige værdier for nøglelængder. Her er et uddrag med de vigtigste data EC key 112 160 192 256 18 RSA key 430 760 1020 1620 Tid til at bryde Mere end 5 minutter 600 måneder 3 millioner år 1016 år http://www.rsa.com/rsalabs/node.asp?id=2088 55 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 Til sammenligning er universets alder 13,7 109 år Et af de karakteristika der findes ved ECC er at nøglelængen ikke behøver at være nær så lang som en RSA nøgle for at yde den samme grad af sikkerhed. En lang række forhold omkring domæneparametre, implementation, hardware osv., skal dog tages i betragtning. I følge Lenstra og Verheul 19 er en RSA 1024-bit løsning sammenlignelig med en ECC 160-bit. Tallene er dog ikke helt nye og skal derfor tages med forbehold. Det vil selvfølgelig være relevant på optimerede implementationer af begge disse public key systemer at foretage benchmark test, men da nærværende implementation ikke er foretaget med henblik på optimering giver det ikke noget validt sammenligningsgrundlag. 15. Danske standarder på området for digital signatur og sikker kommunikation: Da Suite B jo er en amerikansk standardpakke udstukket af National Security Agency kunne det være interessant at se hvilke standarder de danske myndigheder har sat for sikkert kommunikation. Det allernyeste på det danske sikkerhedsområde er den spritnye danske såkaldte digitale signatur nemID. Det ligger uden for denne opgaves rammer at diskutere protokollen den er implementeret under, men relevant ville være om den bagvedliggende skulle være implementeret via RSA eller elliptiske kurver. Jeg har derfor d. 17.07.2010 rettet forespørgsel til nemID for at høre i detaljer hvilken digital signatur standard der anvendes. Jf Bilag C1. Dette resulterede i svar d. 19.07.2010 hvor der bliver gjort rede for en RSA løsning β Konkret kan jeg oplyse, at certifikater til personer udstedes på baggrund af 2048 bit RSA-nøgler med SHA-256 som hash funktion, mens CA'ets rodnøgler er baseret på 4096 bit RSA-nøgler, også med SHA-256 som hash funktion. β Der synes altså ikke at være offentlige digitale signaturer baseret på ECCDSA i sigte i Danmark. Det har ikke været muligt at finde publicerede detaljerede standarder der er sammenlignelige med Suite B med den danske myndigheder som afsender. 19 Artikel: βSelecting Cryptographic Key Sizesβ fra Journal of Cryptology 14, 2001: www.win.tue.nl/~klenstra/key.pdf 56 christelbach.com - all rights reserved © Christel Bach© 16. Kryptografi med Elliptiske Kurver v.1.5 Afrunding og konklusion Jeg har efter at have foretaget mange nedslag i den matematiske baggrund for elliptiske kurve kryptografi konstateret at emnet på ingen måde er trivielt, at en opgave af denne type med formidlingsperspektivet for øje, gør at jeg højst formår at kratte lidt i overfladen. Den matematiske dybde i emnet elliptiske kurver er et stort om komplekst område med forgreninger ud i mange andre discipliner. Opgaven kan sine steder virke udpenslet i overdreven grad. Andre steder ville man formentlig gerne have set mere dybde end bredde, men såvel kompleksitetsgrad som formidlingsperspektivet har været begrænsende for mine valg. Men det vil forhåbentlig være muligt her at danne sig et indtryk af hvordan man kan gøre kryptografisk brug af et så interessant emne som elliptiske kurver. Efterskrift Det har været en lang proces over flere år hvor der arbejdsmæssigt ofte ikke har været plads til at fordybe sig i dette emne område. Det har betydet utallige genopfriskninger undervejs af allerede erhvervet viden β og det har sænket tempoet noget, og ind imellem også været desillusionerende. Da jeg har undersøgt emnet kryptering med elliptiske kurver gennem så lang tid har mængden af materialer også hobet sig op så det har været vanskeligt at prioritere og vælge fra. Ustandseligt har jeg fundet nye spændende artikler, men også de helt centrale artikler og standarder er blevet opdateret undervejs i nye udgivelser. Meget har skullet skrives om flere gange og størstedelen af opgaven er dermed blevet til inden for de sidste 3 måneder. Opgaven bærer derfor måske præg af ikke at være skåret helt så skarpt og præcist som man kunne ønske sig. Det der for alvor satte skub i processen igen var da vi på Erhvervsakademi Århus(tidligere Erhvervsakademiet - Århus Købmandsskole) fik godkendt professionsbacheloruddannelserne i Webudvikling og Softwareudvikling og dermed også fagmodulet Sikkerhed. Det har personligt givet et relevant perspektiv på opgaven. Jeg har i det forgangne semester undervist i modulet Sikkerhed. Kryptologi og kryptografi har naturligvis kun spillet en mindre rolle, niveauet og emnets størrelse taget i betragtning jf. studieordning bilag C2, men det har været motiverende at arbejde med sikkerhedsrelaterede emner og have et formidlingsperspektiv på opgaven. 57 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 Efter velafsluttet semester og eksaminer i faget var der ligesom kun en ting tilbage. At få skrevet denne opgave. Her er den så. Jeg troede at jeg nu ville være færdig med emnet Elliptiske Kurver β men konstaterer at jeg dårligt er begyndt. ¤ 58 christelbach.com - all rights reserved © Christel Bach© 17. Kryptografi med Elliptiske Kurver v.1.5 Litteratur henvisninger Litteratur [1 ]Handbook of elliptic and hyperelliptic curve cryptography af Cohen Frey, Avanzi, Doche, Lange, Nguyen, og Vercauteren. [2 ]Eliptic Curves, Number Theory and Cryptography af Lawrence C. Washington [3 ]Implementing Elliptic Curve Cryptography af Michael Rosing [4 ]A Course in Number Theory and Cryptography. 2.Ed af Neal Koblitz [5 ]Guide to Elliptic Curve Cryptography af Darrel Hankerson, Alfred Menezes og Scott Vanstone [6 ]Prime Numbers, A Computational Perspective af Richard Cradell og Carl Pomerance [7 ]Number Theory, A programmer's Guide af Mark Herkommer [ 8]Advances in Elliptic Curve Cryptography af Blacke, Seroussi og Smart, London Mathematical Society 2005. notes 317 [9] An introduction to Mathematical Cryptography af Hoffstein, Pipher og Silverman [10] Introduction to cryptography with coding theory, 2ed. af Trappe og Washington Artikler: [11]FIPS PUB 186-2 app 6 : recommended elliptic curves for federal government use. Nyere version FIPS-186-3 er visse steder anvendt i stedet. [12]NIST-SP-800-56 samt csrc.nist.gov/groups/ST/toolkit/documents/dss/NISTReCur.doc [13] IEEE P1363 A. [ 14]The Elliptic Curve Digital Signature Algorithm (ECDSA) by Don Johnson, Alfred Menezes & Scott Vanstone 59 christelbach.com - all rights reserved © Christel Bach© BILAG 18. Kryptografi med Elliptiske Kurver v.1.5 Oversigt over bilag: Kildekode til implementation af elliptisk kurve kryptografi Bilag A1: kryptering/dekryptering med MV ElGamal EC Supplerende matematisk pædagogisk materiale Bilag B1: om algebraiske strukturer Bilag B1A:Om isomorfier og afbildninger Bilag B2: Grundlæggende om elliptiske kurver i R Bilag B3: Diskriminanten og singulære punkter Bilag B4: Mathematica visualisering Bilag B5:Punktaddition i R, scriptkode Bilag B6:ElGamal og DLP Bilag B7:Kvadratroden af store tal Bilag B8:RSA protokol m implementationseksempel Bilag B9: Tidskompleksitet med eksempler på elliptiske kurver Øvrige bilag: Bilag C1: danske standarder, dialog med nemID Bilag C2: studieordning for modulet βSecurityβ 19. Kildekode til implementation af elliptisk kurve kryptografi MV ElGamal ECC Bilag A1 Kryptering og dekryptering af beskeder med NIST kurver baseret på primlegemer og kurven Y^2=X^3+AX+B i C#.NET Kildekoden her implementeres med passende kontroller i brugergrænsefladen. 60 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 Løsning kan downloades i kildekode, og testes som webapplikation på www.christelbach.com using using using using using using using using using using System; System.Collections.Generic; System.Linq; System.Web; System.Web.UI; System.Web.UI.WebControls; System.Numerics; System.Text; System.Security.Cryptography; System.Globalization; namespace MVECCryptosystem { public partial class WebForm1 : System.Web.UI.Page { //domæneparametre for NIST kurver BigInteger curv1inputB = BigInteger.Parse("2455155546008943817740293915197451784769108058161191238065"); BigInteger curv1modp = BigInteger.Parse("6277101735386680763835789423207666416083908700390324961279"); BigInteger curv1inputx1 = BigInteger.Parse("602046282375688656758213480587526111916698976636884684818"); BigInteger curv1inputy1 = BigInteger.Parse("174050332293622031404857552280219410364023488927386650641"); BigInteger curv2inputB = BigInteger.Parse("1895828628556660800040866854449392641550468096867932107578723 4672564"); BigInteger curv2modp = BigInteger.Parse("2695994666715063979466701508701963067355791626002630814351006 6298881"); BigInteger curv2inputx1 = BigInteger.Parse("1927792911356629307111030803469948802683193421945244015664978 4352033"); BigInteger curv2inputy1 = BigInteger.Parse("1992680875803447097019797437088874918420599199060394953763734 3198772"); BigInteger curv3inputB = BigInteger.Parse("4105836372515214212932612978004726840911444101599372555483525 6314039467401291"); BigInteger curv3modp = BigInteger.Parse("1157920892103562487626974469494075735300861434152903141955336 31308867097853951"); BigInteger curv3inputx1 = BigInteger.Parse("4843956129390645175905258525279791420276294952604174799584408 0717082404635286"); BigInteger curv3inputy1 = BigInteger.Parse("3613425095674979579858512791958788195661110667298501507187719 8253568414405109"); BigInteger curv4inputB = BigInteger.Parse("2758019355995970587784901184038904809305690585636156852142870 7301988689241309860865136260764883745107765439761230575"); BigInteger curv4modp = BigInteger.Parse("3940200619639447921227904010014361380507973927046544666794829 3404245721771496870329047266088258938001861606973112319"); 61 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 BigInteger curv4inputx1 = BigInteger.Parse("2624703509579968926862315674456698189185292349110921338781561 5900925518854738050089022388053975719786650872476732087"); BigInteger curv4inputy1 = BigInteger.Parse("8325710961489029985546751289520108179287853048861315594709205 902480503199884419224438643760392947333078086511627871"); BigInteger curv5inputB = BigInteger.Parse("1093849038073734274511112390766805569936207598951683748994586 3944959531161507350160137087375737596232485921322967063133094384525315910129121 42327488478985984"); BigInteger curv5modp = BigInteger.Parse("6864797660130609714981900799081393217269435300143305409394463 4591855431833976560521225596406614545549772963113914808580371219879997166438125 74028291115057151"); BigInteger curv5inputx1 = BigInteger.Parse("2661740802050217063228768716723360960729859168756973147706671 3684188029449964278084915450806277719023520942412250655586621571135455709168141 61637315895999846"); BigInteger curv5inputy1 = BigInteger.Parse("3757180025770020463545507224491183603594455134769762486694567 7796155444774405563166912344050129455395621444445372894285225856667291965808101 24344277578376784"); BigInteger inputB, modp, inputx1, inputy1; BigInteger inputA = -3; protected void Page_Load(object sender, EventArgs e) { } protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e) { } //beregner et pseudo random n protected void Button1_Click(object sender, EventArgs e) { ntext.Text = pseudorandom(); } protected void GetCurve() { if (curveselectlist.SelectedValue == "192") { inputB = curv1inputB; modp = curv1modp; inputx1 = curv1inputx1; inputy1 = curv1inputy1; } else if (curveselectlist.SelectedValue == "224") { inputB = curv2inputB; modp = curv2modp; inputx1 = curv2inputx1; 62 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 inputy1 = curv2inputy1; } else if (curveselectlist.SelectedValue == "256") { inputB = curv3inputB; modp = curv3modp; inputx1 = curv3inputx1; inputy1 = curv3inputy1; } else if (curveselectlist.SelectedValue == "384") { inputB = curv4inputB; modp = curv4modp; inputx1 = curv4inputx1; inputy1 = curv4inputy1; } else if (curveselectlist.SelectedValue == "521") { inputB = curv5inputB; modp = curv5modp; inputx1 = curv5inputx1; inputy1 = curv5inputy1; } else { inputB = 42; modp = 42; inputx1 = 42; inputy1 = 42; } } //beregner Q=nG, G er basepunktet med koordinater fra NIST kurve protected void Button2_Click(object sender, EventArgs e) { //læs domæneparametre ind for kurven GetCurve(); BigInteger n = BigInteger.Parse(ntext.Text); //n i brugergrænsefladen bool bcheck = false; //tjekker at punktet kan ligge på kurven BigInteger calB = calcCurveB(inputA, inputx1, inputy1, modp); if (calB == inputB) { bcheck = true; } modp); if (bcheck == true) { bchecklbl.Text = ""; BigInteger[] Res = calculatenP(inputx1, inputy1, n, inputA, } else { 63 Qx3text.Text = Res[0].ToString(); Qy3text.Text = Res[1].ToString(); bchecklbl.Text = "your point was not on curve"; Qx3text.Text = ""; Qy3text.Text = ""; christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 } } //beregner B værdien for angivet punt for at tjekke for hvilken B værdi punktet kan ligge på kurven private BigInteger calcCurveB(BigInteger parA, BigInteger coorx, BigInteger coory, BigInteger fieldp) { BigInteger parB BigInteger.ModPow(coorx, 3, // B=y^2 -x^3 if (parB < 0) { parB = parB } return parB; } = (BigInteger.ModPow(coory, 2, fieldp) fieldp) - parA * coorx) % fieldp; A*x mod N + fieldp; //beregner lambda 1 for punktaddition - P + Q for P og Q forskellige private BigInteger calcLambda1(BigInteger y2, BigInteger y1, BigInteger x2, BigInteger x1, BigInteger modspace) { BigInteger lam1; if ((x2 - x1) == 1 || ((x2 - x1) == -1)) { lam1 = ((y2 - y1) / (x2 - x1)) % modspace; } else { lam1 = (y2 - y1) * CalcInverse((x2 - x1), modspace); } if (lam1 < 0) { lam1 = lam1 + modspace; } return lam1; } //beregner lambda 2 for punktaddition for to ens P - det samme som punktfordobling P + P eller 2*P private BigInteger calcLambda2(BigInteger x1, BigInteger y1, BigInteger A, BigInteger modp) { BigInteger lam2; if (((2 * y1).Sign == -1) && ((3 * x1 * x1 + A).Sign == -1) || (((2 * y1).Sign == 1) && ((3 * x1 * x1 + A).Sign == 1))) { lam2 = ((3 * x1 * x1 + A) * CalcInverse((2 * y1), modp)) % modp; } else { lam2 = (-(3 * x1 * x1 + A) * CalcInverse((2 * y1), modp)) % modp; } if (lam2 < 0) { lam2 = lam2 + modp; } return lam2; 64 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 } //beregner x værdi for punktaddition private BigInteger calcXFinal(BigInteger Lambda, BigInteger x1, BigInteger x2, BigInteger modp) { BigInteger bigX = (Lambda * Lambda - x1 - x2) % modp; if (bigX < 0) { bigX = bigX + modp; } return bigX; } //beregner y værdi for punktaddition private BigInteger calcYFinal(BigInteger Lambda, BigInteger x1, BigInteger x3, BigInteger y1, BigInteger modp) { BigInteger bigY = ((Lambda * (x1 - x3)) - y1) % modp;//tjek her if (bigY < 0) { bigY = bigY + modp; } return bigY; } //beregner invers af et tal num modulus modp private BigInteger CalcInverse(BigInteger num, BigInteger modp) { BigInteger x = 1; BigInteger y = 0; BigInteger a = modp; BigInteger b = num; BigInteger q, t; BigInteger res; while (b != 0) { t = b; //q2 = Math.floor(a/t); q = BigInteger.Divide(a, t); b = a - q * t; a = t; t = x; x = y - q * t; y = t; } if (y < 0) { res = y + modp; } else { res = y; } return res; } //alternativ metode til beregning af invers private BigInteger BinaryInverse(BigInteger a, BigInteger modp) { 65 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 BigInteger u = a; BigInteger v = modp; BigInteger r1 = 1; BigInteger r2 = 0; while (u != 1 && v != 1) { while (u.IsEven) { u = u >> 1; if (r1.IsEven) { r1 = r1 >> 1; } else { r1 = (r1 + modp) >> 1; } } while (v.IsEven) { v = v >> 1; if (r2.IsEven) { r2 = r2 >> 1; } else { r2 = (r2 + modp) >> 1; } r2 - r1; } } } if (u >= v) { u = u - v; r1 = r1 - r2; } else { v = v - u; r2 = } if (u == 1) { return r1 % modp; } else return r2 % modp; //double points private BigInteger[] doublePoints(BigInteger x, BigInteger y, BigInteger A, BigInteger modp) { BigInteger l2 = (calcLambda2(x, y, A, modp)) % modp; //dontpanic.Text = l2.ToString(); BigInteger resl2x3 = (calcXFinal(l2, x, x, modp)) % modp; BigInteger resl2y3 = (calcYFinal(l2, x, resl2x3, y, modp)) % modp; } BigInteger[] resPoint = { resl2x3, resl2y3 }; return resPoint; //add points private BigInteger[] addPoints(BigInteger x1, BigInteger y1, BigInteger x2, BigInteger y2, BigInteger modp) { //håndtering af punktet i uendelig BigInteger[] resPoint = { 0, 0 }; if (x1 == 0 && y1 == 0) { resPoint[0] = x2; resPoint[1] = y2; return resPoint; } else if (x2 == 0 && y2 == 0) { resPoint[0] = x1; resPoint[1] = y1; return resPoint; } else if ((x1 == x2) && (y1 != y2)) { resPoint[0] = 0; resPoint[1] = 0; return resPoint; } else { 66 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 BigInteger lam1 = 0; BigInteger taeller = (y2 - y1); BigInteger naevner = (x2 - x1); if (naevner == 1) { lam1 = (y2 - y1) % modp; } else if (naevner < 0) { naevner = naevner + modp; } lam1 = (y2 - y1) * CalcInverse(naevner, modp); if (lam1 < { lam1 = } BigInteger BigInteger 0) lam1 + modp; finallam = lam1; ny = y1 - (finallam * x1); BigInteger x3 = ((finallam * finallam) - x1 - x2) % modp; BigInteger y3 = (-((finallam * x3) + ny)) % modp; if (y3 < 0) { y3 = y3 + modp; } resPoint[0] = x3; resPoint[1] = y3; return resPoint; } } //double and add algorithm private BigInteger[] calculatenP(BigInteger x, BigInteger y, BigInteger n, BigInteger A, BigInteger modp) { BigInteger[] Q = { x, y }; BigInteger[] R = { 0, 0 }; while (n > 0) { BigInteger t = BigInteger.ModPow(n, 1, 2); if ((t) == 1) { R = addPoints(Q[0], Q[1], R[0], R[1], modp); } Q = doublePoints(Q[0], Q[1], A, modp); n = n / 2; } BigInteger[] resPoint = { R[0], R[1] }; return resPoint; 67 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 } //random generator private static BigInteger GetRandom(int bitsize) { RandomNumberGenerator ran = RNGCryptoServiceProvider.Create(); int bytesize = bitsize / 8; byte[] ranbytes = new Byte[bytesize]; //ex: Byte[20] giver 8 bit * 20 = 160 bit //ex: Byte[2] giver 8 bit * 2 = 16 bit //ex: Byte[128] giver 8 bit * 128 = 1024 bit //fill byte array med kryptografisk stærke tilfældige bytes ran.GetBytes(ranbytes); } //hæld random bytes i et bigInteger BigInteger mynum = new BigInteger(ranbytes); return mynum; //oversæt klartekst til ascii decimal tal protected void translate_btn_Click(object sender, EventArgs e) { string m = inputmtxt.Text; string result = ""; byte[] b = Encoding.ASCII.GetBytes(m); foreach (byte c in b) { string cstr = c.ToString(); if (cstr.Length == 2) { cstr = "0" + cstr; } result += cstr; } } outasciitxt.Text = result; //BigInteger enc = BigInteger.Parse(result); //oversæt ascii decimaler til klartekst protected void reversetranslate_btn_Click(object sender, EventArgs e) { //deler strengen i hele multiplum af 3 og korrigerer for "0-fejl" string m1half = m1txt.Text; string m2half= m2txt.Text; if (m1half.Length % 3 != 0) { m1half = "0" + m1half; } if (m2half.Length % 3 != 0) { m2half = "0" + m2half; } string enc = m1half+m2half; //string enc = inputasciitxt.Text; if (enc.Length % 3 == 0) { string display = ""; 68 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 for (int i = 0; i <= enc.Length - 2; i += 3) { string subst = enc.Substring(i, 3); int let = Convert.ToInt32(subst); char c = (char)let; display += c.ToString(); } outmtxt.Text = display; } else { } outmtxt.Text = "number of digits must be divisible by 3"; } protected void encrypt_btn_Click(object sender, EventArgs e) { //BigInteger rank= BigInteger.Parse(inputk.Text); //calculate R = k*G //inlæs domæneparametre for kurven GetCurve(); BigInteger k = BigInteger.Parse(inputk.Text); //k i brugergrænsefladen bool bcheck = false; //tjekker at punktet kan ligge på kurven BigInteger calB = calcCurveB(inputA, inputx1, inputy1, modp); if (calB == inputB) { bcheck = true; } modp); if (bcheck == true) { bchecklbl.Text = ""; BigInteger[] Res = calculatenP(inputx1, inputy1, k, inputA, } else { } rxtxt.Text = Res[0].ToString(); rytxt.Text = Res[1].ToString(); bchecklbl.Text = "your point was not on curve"; rxtxt.Text = ""; rytxt.Text = ""; //calculate S=k*Q BigInteger altx1 = BigInteger.Parse(Qx3text.Text); //eget indtastede x punkt nederst på siden BigInteger alty1 = BigInteger.Parse(Qy3text.Text); //eget indtastede y punkt nederst på siden bool bcheck2 = false; 69 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 BigInteger sx = 0; BigInteger sy= 0; //tjekker at punktet kan ligge på kurven BigInteger calB2 = calcCurveB(inputA, altx1, alty1, modp); if (calB == inputB) { bcheck2 = true; } if (bcheck2 == true) { bchecklbl.Text = ""; BigInteger[] Res = calculatenP(altx1, alty1, k, inputA, modp); sx = Res[0]; sy = Res[1]; } else { bchecklbl.Text = "your point was not on curve"; } //besked indlæses //sikrer at strengen deles to dele i chuncks af 3 string mes = outasciitxt.Text; int let = (mes.Length)/3; int halfsize = (let / 2) * 3; string strm1 = mes.Substring(0, halfsize); string strm2 = mes.Substring(halfsize, mes.Length - halfsize); //c1 og c2 BigInteger BigInteger BigInteger BigInteger delen af krypteringen beregnes m1 = BigInteger.Parse(strm1); m2= BigInteger.Parse(strm2); c1 = (sx * m1) % modp; c2 = (sy * m2) % modp; c1txt.Text = c1.ToString(); c2txt.Text = c2.ToString(); } //random k protected void rand_k_Click(object sender, EventArgs e) { inputk.Text = pseudorandom(); } //pseudorandom funktion tester for bit størrelse protected string pseudorandom() { int bitsize = 192; if (curveselectlist.SelectedValue == "192") { bitsize = 192; else if (curveselectlist.SelectedValue == "224") { bitsize = else if (curveselectlist.SelectedValue == "256") { bitsize = else if (curveselectlist.SelectedValue == "384") { bitsize = else if (curveselectlist.SelectedValue == "521") { bitsize = else { bitsize = 16; } } 70 } 224; 256; 384; 521; } } } } BigInteger roll = GetRandom(bitsize); if (roll < 0) { roll = roll * (-1); } return roll.ToString(); christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 protected void decrypt_btn_Click(object sender, EventArgs e) { //calculate T = n*R //indlæsning af domæneværdier GetCurve(); //indlæsning af privat nøgle BigInteger n = BigInteger.Parse(ntext.Text); //n i brugergrænsefladen //indlæsning af den krypterede værdi R BigInteger rx1 = BigInteger.Parse(rxtxt.Text); BigInteger ry1 = BigInteger.Parse(rytxt.Text); bool bcheck3 = false; BigInteger tx = 0; BigInteger ty= 0; //tjekker at punktet kan ligge på kurven BigInteger calB3 = calcCurveB(inputA, rx1, ry1, modp); if (calB3 == inputB) { bcheck3 = true; } if (bcheck3 == true) { bchecklbl.Text = ""; BigInteger[] Res = calculatenP(rx1, ry1, n, inputA, modp); //værdi for T tx = Res[0]; ty = Res[1]; } else { bchecklbl.Text = "your point was not on curve"; //execption mangler for manglende værdi af T } //beregning for dekryptering m1 og m2 BigInteger txinv = CalcInverse(tx,modp); BigInteger tyinv = CalcInverse(ty,modp); //indlæsning af de krypterede c værdier BigInteger c1=BigInteger.Parse(c1txt.Text); BigInteger c2=BigInteger.Parse(c2txt.Text); //beregning af m værdierne BigInteger decm1=(txinv*c1)% modp; BigInteger decm2=(tyinv*c2)% modp; //udprint af m værdierne m1txt.Text = decm1.ToString(); m2txt.Text = decm2.ToString(); } } 71 } christelbach.com - all rights reserved © Christel Bach© 72 Kryptografi med Elliptiske Kurver v.1.5 christelbach.com - all rights reserved © Christel Bach© 20. Kryptografi med Elliptiske Kurver v.1.5 Supplerende pædagogiske matematiske bilag Bilag B1 Kort oversigt over algebraiske strukturer: Ring(+,*,e) Ikke tom mængde med både addition(+) og multiplikation(*). Der gælder for disse: +: kommutativ, associativ, neutralt element *:associativ, distributiv, behøver ikke være kommutativ eller have neutralt element. Legeme(+,*,e, a-1) En ring der også er kommutativ og har neutralt element for både * og + +:kommutativ, associativ, neutralt element *:kommutativ, associativ, distributiv, neutralt element, invers (pånær for 0) Gruppe(¤,e,a-1) Ikke tom mængde med en operator(¤) neutralt element og invers ¤:Associativ, neutralt element, inverst element Begreber: Kommutativ: a ¤ b = b ¤ a. a,b, i algebraisk struktur ο og a¤b ligger I same struktur Associativ: (x ¤ y) ¤ z = x ¤ (y ¤ z) Distributiv: x * (y + z) = (x * y) + (x * z) Inverst element: a¤b = b¤a = e Neutralt element e vil sige: e ¤ a = a ¤ e = a, hvor ¤ blot betyder en operator. Eks: 1*a=a*1=a og 0+a=a+0=a. 1 er altså her et neutral element under multiplikation og 0 under addition. Eksempel på gruppe: (Z + ) Eksempel på legeme: (F7) (på engelsk Field) er Fp for p et primtal. Det består af alle naturlige tal inklusiv nul og primtallet p-1. 0.1.2.3β¦.p-1. Her altså 0,1,2,3,4,5,6 Eksempel på Ring (Z, +,*) og (Z/Zn, +,*), (Z[X], +,*) Z[X] forstås som en polynomiumsring hvor koefficienterne ligger i Z (a0+a1X+a2X2+β¦anXn) 73 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 Bilag B1A Homomorfi β endomorfi -isomorfi homomorfi : en afbildning af en algebraisk struktur på en måde så strukturen er bevaret endomorfi: En endomorfi på E er en homomorfi givet ved rationelle funktioner En homomorfi på elliptisk kurve over et lukket legeme er en afbildning af dette over i sig selv? οΏ½ ) β πΈπΈ(πΎπΎ οΏ½) πΌπΌ: πΈπΈ(πΎπΎ Således at πΌπΌ(ππ1 + ππ2) = πΌπΌ(ππ1) + πΌπΌ(ππ2) Hvis funktionen πΌπΌ(ππ) = 2ππ altså en punktfordobling, er der tale om en endomorfi isomorfi: en homomorfi der er bijektiv automorfi : en endomorfi der også er en isomorfi Isomorfe grupper er i algebraisk forstand ens. Afbildinger Injektiv: En til en afbildning β entydig β ikke to elementer afbildes i samme element Surjektiv: Hele A afbildes ind i hele B Bijektiv: entydig korrespondance mellem alle elementer i A og B http://www.mathsisfun.com/sets/images/function-mapping.gif 74 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 Bilag B2: Grundlæggende om Elliptiske kurver β uddrag fra min eksamensopgave , Kryptologi B, om Lenstras Elliptiske kurve metode (ECM) En elliptisk kurve kan antage denne såkaldt korte Weierstrass form: y 2 = x3 β Ax + B (0.1) Er kurverne defineret på de reelle tal får vi afbildninger som f.eks nedenstående: Kurven er genereret i Maple med følgende kommando: > restart:with(plots):with(numtheory):with(algcurves): > implicitplot([y^2=x^3-5*x+4,y^2=x^3-2*x+12,y^2=x^35*x+5,y^2=x^3-5*x+3],x=-5..7,y=75 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 10..10,numpoints=6000,color=[blue,green,cyan,red], legend=[E1,E2,E3,E4]); Vi for langer dog at kurven skal være glat, dvs rødderne i kubikken skal være forskellige dvs diskriminanten d ikke må være nul, dvs d= ((r1 β r2 )(r1 β r3 )(r2 β r3 ))3 = β(4 A3 + 27 B 2 ) β 0 Addition af to punkter P og Q kan visualiseres således: I grove træk er metoden altså følgende: Linien der forbinder de to punkter forlænges til den skærer kurven et tredie sted og denne spejles. Adderes i stedet P+P vælges tangentlinien i punktet P og denne forlænges ligeledes til den skærer kurven og reflekteres. Anvender vi den korte Weierstrass form (0.1) vil punktet P+Q få koordinater der beregnes som følger: P+Q: x1 β x2 og y1 β y2 , altså P er forskellig fra Q så har vi at: (0.2) x3 = m 2 β x1 β x2 , y3 = m( x1 β x3 ) β y1 hvor m er hældningen: m =β y2 y1 / x2 β x1 Hvis P og Q er sammenfaldende, dog y1 β 0 : 2P: x3 m 2 β 2 x1 , y3 = m( x1 β x3 ) β y1 hvor hældningen i stedet beregnes som (0.3) = m 3 x12 + A / 2 y1 tangenten i punktet= 76 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 Vi opererer ligeledes med et punkt i uendelig β , repræsenteret ved en lodret linie. Der gælder at P+Q= β , hvis x1 = x2 men y1 β y2 . Der gælder ligeledes at P+ β ,=P for alle P. Punkterne på den elliptiske kurve opfylder betingelserne for en additiv abelsk gruppe med identitetselement β . Gruppen består altså af mængden af punkter (x,y) der ligger i K x K som ligger på kurven samt et punkt i uendelig, som jeg fra nu af vil benævne O Når vi arbejder med grupper på Elliptiske kurver over et endeligt felt Fp er der naturligvis ikke længere tale om en sammenhængende visuel glat kurve , men nærmere en βpunktskyβ F.eks kan y 2 mod 23 = x 3 + 4x + 3 mod 23 visualiseres således: Skalarmultiplikation af punkter er grundlæggende for elliptiske kurvers kryptografiske anvendelse. Et punkt P multipluceret med et tal k resulterer I et nyt punkt på kurven Q = kP. Skalar multiplikation udføres ved en kombination af punkt addition og punktfordobling Eksempel: Q= 11P = 2((2(2P)) + P) + P 77 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 Bilag B3 Diskriminanten og singulære punkter Til sammenligning ses her to kurver E5 og E6 der begge har diskiminanten lige med 0. De karakteriske punkter hvor kurven har knæk kaldes singulære punkter. > restart:with(plots):with(numtheory):with(algcurves): > implicitplot([y^2=x^3-7*x+3,y^2=x^3-7*x+9,y^2=x^35*x+5,y^2=x^3-7*x-12,y^2=x^3-3*x+2, y^2=x^3],x=-5..7,y=10..10,numpoints=60000,color=[blue,green,cyan,red,black,o range], legend=[E1,E2,E3,E4,E5,E6]); 78 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 Bilag B4 Mathematica visualisering I Mathematica kan elliptiske kurver visualiseres således: Manipulate[{F, G} = { x^3 - a y^2 + b x y^2 + c x^2 y, A x + B}; Plot3D[{F, G}, {x, -8, 10}, {y, -30, 30}, PlotRange -> All, PlotStyle -> {LightBlue, Green}, MeshFunctions -> Function @@@ {{{x, y, z}, (F - G)}}, Mesh -> {{0}}, MeshStyle -> Directive[{Red, Thick}], Epilog -> {Inset[ Graphics[ Text[Style[ Column[{"intersection curve", Row[{a y^2, " = ", x^3 + b x y^2 + c x^2 y - A x - B}]}, Center], {12, 12}, Black]], ImageSize -> 240], {Center, Top}], Inset[ Graphics[ Text[Style[ Column[{"surface", Row[{Style["z", Italic], " = ", F}]}], {12, 12}, Black]], ImageSize -> 200], {0.3, .1}], Inset[Graphics[ Text[Style[ Column[{"plane", Row[{Style["z", Italic], " = ", G}]}], {12, 12}, Black]], ImageSize -> 150], {0.85, .1}]}, Axes -> None, PlotPoints -> 45, Boxed -> False, ImageSize -> {375, 375}, SphericalRegion -> True, ViewAngle -> \[Pi]/6], Style["parameters of the plane", Bold], Style[Row[{"z = A x + B"}], Bold], {{A, 11, "A (rotation)"}, -10, 25, 0.5, Appearance -> "Labeled", ImageSize -> Tiny}, {{B, 12, "B (translation)"}, -20, 50, .01, Appearance -> "Labeled", ImageSize -> Tiny}, Style["\nparameters of the surface", Bold], Style["z = \!\(\*SuperscriptBox[\"x\", \"2\"]\)-a \ \!\(\*SuperscriptBox[\"y\", \"2\"]\)+b x \!\(\*SuperscriptBox[\"y\", \ \"2\"]\) + c \!\(\*SuperscriptBox[\"x\", \"2\"]\) y", Bold], {{a, -1, "a"}, -2, 2, 0.01, Appearance -> "Labeled", ImageSize -> Tiny}, {{b, 0, "b"}, -2, 2, 0.05, Appearance -> "Labeled", ImageSize -> Tiny}, {{c, 0, "c"}, -5, 5, 0.2, Appearance -> "Labeled", ImageSize -> Tiny}, Delimiter, TrackedSymbols -> Manipulate, ControlPlacement -> Left, SynchronousUpdating -> False] http://demonstrations.wolfram.com/RealEllipticCurves/ 79 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 Bilag B5 Punktaddition på R β kode eksempel i javascript Simpelt demonstationseksempel på R, med værdier max 'integer' størrelse: Der konstrueres passende felter i html dokument der matcher id'erne i denne kode. Denne meget lille løsning tester IKKE for om punkterne overhovedet ligger på kurven - det er på eget ansvar. Det er kun i tilfældet P1=p2 hvor y1 er forskellig fra nul at kurvens koefficienter direkte indgår i additionsberegningen - og derfor der fejlkilden skal findes. fgl placeres i eksternt javascript: window.onload= initForm; function initForm(){ document.getElementById("ok").onclick = calcPoint; } function calcPoint(){ var x1= parseInt(document.getElementById("xx1").value); var y1= parseInt(document.getElementById("yy1").value); var x2= parseInt(document.getElementById("xx2").value); var y2= parseInt(document.getElementById("yy2").value); if((x2-x1) != 0 ){ var m = (y2-y1)/(x2-x1); var x3 = (m*m)-x1-x2; var y3= m*(x1-x3)-y1; document.getElementById("r1").innerHTML="P3, (x3,y3) er "+x3+","+y3; } else if (((x2-x1) == 0) && ((y2-y1) != 0)){ alert("det er farligt at dividere med nul, P1 + P2 giver punktet i uendelig");} else if ((x2-x1)==0 && (y2-y1)==0){ if(y2 != 0){ var A= parseInt(document.getElementById("AA").value); var m = ((3*x1*x1)+A)/(2*y1); var x3 = (m*m)-2*x1; var y3= m*(x1-x3)-y1; document.getElementById("r1").innerHTML="P3, (x3,y3) er "+x3+","+y3; } else{ alert("P1 + P2 giver punktet i uendelig"); document.getElementById("r1").innerHTML="eternal sunshine in a spotless mind"; } } else{ alert("noget gik helt galt"); document.getElementById("r1").innerHTML="42"; } return false; 80 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 Multiplicativ invers modulus p - kodeeksempel i javascript JavaScript der implementerer euclids algoritme til at finde modulært invers Anvend passende html elementer og referer til eksternt script med følgende: window.onload= initForm; function initForm(){ document.getElementById("ok").onclick = calcInverse; } function calcInverse(){ var n= parseInt(document.getElementById("nn").value); var p= parseInt(document.getElementById("pp").value); var x = 1; var y = 0; var a=p; var b=n; var q,t; var res; while (b != 0) { t q b a t x y } if(y<0){ res= y+p; } else{ res=y; } = = = = = = = b; Math.floor(a/t); a - q*t; t; x; y - q*t; t; document.getElementById("r1").innerHTML="a^-1 return false; er "+res; } 81 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 BILAG B6 ElGamal og DLP ElGamal protokollen giver en generel sikker måde at udveksle beskeder på ved hjælp af offentligt tilgængelige nøgler og åbne linier. Protokollen baserer sig på en matematisk trapdoor funktion. I Den klassiske ElGamal er denne Det Diskrete Logaritmeproblem(DLP)over et endeligt legeme Fp. Altså populært sagt baseret på at det er nemt at beregne gn mod p = x (hvor x er forskellig fra 0), men svært at aflede n for kendte værdier af g p, og x.. p skal være et primtal og g skal være en primitiv rod 20 i Fp. Vi skriver også at x= logg (h) Protokollen ser ud som følger: Offentligt tilgængelige parametre og beregninger Domæne parametre vælges og offentliggøres: Stort primtal p, og et element g, en primitiv rod i πΉπΉπΉπΉ Private Beregninger Alice Bob Alice vælger som privat nøgle a For 1<=nA<=p-1og beregner offentlig nøgle a A=g mod p Offentlig udveksling af værdier Alice publicerer den offentlige nøgle Aο KRYPTERING Private Beregninger Bob vælger en klartekst m. Han vælger et tilfældigt k Han beregner c1=gk mod p og c2= mAk mod p og Offentlig udveksling af værdier ο Bob sender den krypterede besked ( c1, , c2 ) til Alice DEKRYPTERING Alice beregner a -1 ((c1) ) *c2 mod p = m Private beregninger Det kan man nemt verificere ved substitution giver det ønskede m således: a -1 a -1 k*a -1 a k ((c1) ) *c2 mod p = ((gk) ) * m*Ak mod p = ((g ) * m* (g ) mod p = k*a -1 ((g ) * m* (ga*k) mod p =m 20 dvs dets orden skal være p-1. Vi har at en primitiv rod er en generator for Fp*, dvs g(p-1)=1 mod p (fermats lille sætning) Med andre ord alle elementerne kan skrives på formen g0,g1,g2,g3,β¦g(p-2). Eks: Vi har at i Z17 er ord(3)= 16 idet 316=1. 82 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 Bilag B7: Kvadratroden af store tal public static BigInteger Sqrt(BigInteger n) { BigInteger rootn = n; int count = 0; int bitLength = 1; while (rootn / 2 != 0) { rootn /= 2; bitLength++; } bitLength = (bitLength + 1) / 2; rootn = n >> bitLength; BigInteger lastRoot = BigInteger.Zero; do { if (lastRoot > rootn) { if (count++ > 1000) { return rootn; } } lastRoot = rootn; rootn = (BigInteger.Divide(n, rootn) + rootn) >> 1; } while (!((rootn ^ lastRoot).ToString() == "0")); return rootn; } Bilag B8: RSA protokol og implementation Bob Private Nøgler Alice Private beregninger β’ Vælg hemmelige primtal p og q. Beregn p*q=N . β’ Beregn phi=(p-1)*(q-1) β’ Vælg et e så gcd(e,phi)=1 Offentligt Bob publiserer N og e ο Kryptering 83 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 Private beregninger β’ Hemmelig besked tallet m<N. Brug Bobβs offentlige nøgle (N,e) til at beregne β’ me mod N = c Decryption Offentligt ο Send c til Bob over en åben linie Private beregninger β’ Beregn d så e*d=1 (mod phi) β’ ( er lig med e-1 mod phi β kun muligt fordi han kender p og q) β’ Beregn cd mod N . Det giver beskeden m Hvorfor virker det? Fordi der er svært at beregne m, selv om du kender me, e og N (DLP) Fordi det er svært at finde p og q selv om du kender N, og dermed svært at beregne phi, og dermed svært at finde et d så ed=1 mod phi. Hvis først man får faktoriseret N, er det nemt at finde phi og dermed rimelig simpelt at beregne d= e-1 mod phi. e-1 mod phi findes KUN når gcd(e,phi)=1. Med andre ord modulær multiplikativ invers eksisterer kun hvis e og phi er indbyrdes primiske. Matematisk bevis cd mod N = (me)d mod N= medmod N = medmod pq = m fordi ed=1 mod (p-1)(q-1) betyder at ed=1+k(p-1)(q-1), har vi at medmod pq= m1+k(p-1)(q-1), mod pq=m*(m(p-1)(q1) k ) . og da vi ifgl euler har at m(p-1)(q-1)=1 mod pq når gcd(m,pq)=1 får vi at m*(m(p-1)(q1) k ) =m*1k mod pq = m Lille implementationseksempel på RSA: using using using using using using using using System; System.Collections.Generic; System.Linq; System.Web; System.Web.UI; System.Web.UI.WebControls; System.Numerics; System.Security.Cryptography; namespace rsatoy { public partial class _Default : System.Web.UI.Page { BigInteger N; BigInteger phi; 84 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 BigInteger efactor; BigInteger rann, ranb; protected void Button3_Click(object sender, EventArgs e) { BigInteger ranp = makeprime(); inputp.Text = ranp.ToString(); } protected void Button4_Click(object sender, EventArgs e) { BigInteger ranq = makeprime(); inputq.Text = ranq.ToString(); } protected BigInteger makeprime(){ bool isprime = false; } while(isprime == false){ rann= randomize(); ranb=randomize(); isprime= primalitytest(rann, ranb); } Trace.Write("rann equals " + rann); return rann; protected BigInteger randomize() { int size = Convert.ToInt32(intbit.Text); return GetRandom(size); //return GetRandom(8); } //random generator private static BigInteger GetRandom(int bitsize) { RandomNumberGenerator ran = RNGCryptoServiceProvider.Create(); int bytesize = bitsize / 8; byte[] ranbytes = new Byte[bytesize]; //ex: Byte[20] giver 8 bit * 20 = 160 bit //ex: Byte[128] giver 8 bit * 128 = 1024 bit ran.GetBytes(ranbytes); } //hæld random bytes i et bigInteger BigInteger mynum = new BigInteger(ranbytes); if (mynum < 0) { mynum = mynum * (-1); } return mynum; //Miller Rabin primtalstest statistisk metode protected bool primalitytest(BigInteger n, BigInteger b){ BigInteger i, q, r, t; if (n.IsEven) 85 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 { return false; } if (BigInteger.GreatestCommonDivisor(b, n) > 1) { return false; } q = n - 1; for (t = 0; q.IsEven; t++) { q >>= 1; } } if ((r = BigInteger.ModPow(b, q, n)) != 1) { for (i = 0; i < t - 1; i++) { if (r != n - 1) { r = (r * r) % n; } else { break; } } } if (r == 1 || r == n - 1) { return true; } else { return false; } //beregner invers af et tal num modulus modp private BigInteger CalcInverse(BigInteger num, BigInteger modp) { BigInteger x = 1; BigInteger y = 0; BigInteger a = modp; BigInteger b = num; BigInteger q, t; BigInteger res; while (b != 0) { t = b; //q2 = Math.floor(a/t); q = BigInteger.Divide(a, t); b = a - q * t; a = t; t = x; x = y - q * t; y = t; } if (y < 0) { res = y + modp; } else { res = y; 86 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 } return res; } protected void Button1_Click(object sender, EventArgs e) { BigInteger p = BigInteger.Parse(inputp.Text); BigInteger q = BigInteger.Parse(inputq.Text); N = p * q; genN.Text = N.ToString(); phi = (p - 1) * (q - 1); showphi.Text = phi.ToString(); efactor = makeprime(); BigInteger gcd = BigInteger.GreatestCommonDivisor(phi, efactor); if (gcd == 1) { gene.Text = efactor.ToString(); } else { } gene.Text = "something went wrong, try again"; } protected void Button5_Click(object sender, EventArgs e) { BigInteger mes = BigInteger.Parse(inputm.Text); BigInteger keyN = BigInteger.Parse(genN.Text); if (mes < keyN) { BigInteger efac = BigInteger.Parse(gene.Text); BigInteger ciffer = BigInteger.ModPow(mes, efac, keyN); genc.Text = ciffer.ToString(); } else { genc.Text = "message must be smaller than N"; } } protected void Button6_Click(object sender, EventArgs e) { BigInteger efac = BigInteger.Parse(gene.Text); BigInteger p = BigInteger.Parse(inputp.Text); BigInteger q = BigInteger.Parse(inputq.Text); phi = (p - 1) * (q - 1); BigInteger d = CalcInverse(efac, phi); gend.Text = d.ToString(); N = p * q; 87 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 BigInteger c = BigInteger.Parse(genc.Text); BigInteger clear = BigInteger.ModPow(c, d, N); genm.Text = clear.ToString(); } } } Bilag B9 Tidskomplexitet med regneeksempler på elliptiske kurver Tidskomplexiteter O(1) Konstant tid. Oprationens varighed er uafhængig af mængden af input. O(N) Tiden for operationen vokser lineært med mængden af input. O(N2) Kvadratisk tid. Tre gange så meget input giver ni gange så lang behandlingstid. O(log2 N) Logaritmisk tid. Tidsforbruget stiger logaritmisk med mængden af input. O((log n)k) Polylogaritmisk tid. Potens af Logaritmisk tid for en kontant k. O(Nt) for Polynominal tid. -endeligt tal t - ex: O(N8).Tiden vokser med fast eksponent. O(tN) - Eksponential tid - endeligt tal t ex O(8N). Tiden vokser eksponentielt med mængden. MIPS β antal millioner instruktioner pr sekund 2010 tal: Intel Core i7 Extreem Edition i980EE 3.3 GHz - 147,600 MIPS Computeralderens barndom 1972: IBM system 370 - model 158-3 - 1 MIPS jf http://en.wikipedia.org/wiki/File:PPTMooresLawai.jpg Tid Universets alder er 13,7 Mia år, det kan beregnes til at være 432.330.242.400.000.000 sekunder. Jf http://www.calculateme.com/Time/Years/ToSeconds.htm 88 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 Beregninger af up-to-date hurtig intel core: 147600 MIPS *S = 63811943778240000000000000000 instruktioner siden bigbang Alle efterfølgende beregninger af tidskompleksitet er naturligvis op til en konstant faktor. Eksempel: At lede efter kvadrattal O(p) hvor p = 6277101735386680763835789423207666416083908700390324961279 Antag at vi skal undersøge alle værdier af x op til p for lede efter matchende kvadrattal(finde punkter på en elliptisk kurve). Det er en meget ineffektiv algoritme der løses i tiden O(p) jf side 12 i rapporten. Antag at der skal 100 instruktioner til for at undersøge ovenstående og man kan beregne med følgende hastighed 147,600 MIPS, og derfor har vi at der kan beregnes meget groft 1476 M kvadrattals beregninger pr sekund Dvs vi har da 6277101735386680763835789423207666416083908700390324961279 instruktioner/1.476.000.000 instruktioner pr sekund = 4.252778954*10^48 sekunder. Universets alder er 432.330.242.400.000.000 sekunder altså Det er 9.836875927*10^30 gange universets alder. Med andre ord en ret ineffektiv algoritme Eksempel: Antallet af punkter der beregnes med Schoofs algoritme tidskompleksitet Polylogaritmisk tid: O((log p)^6) ~=192^6 =50.096.498.540.544 (-da jeg går ud fra der er tale om logaritme med grundtallet 2.) Hvilket ses at være betydelig kortere tid end O(p) Kan man med optimering klemme den ned på O(logp)^5 er tallet 260.919.263.232 Altså en fuldstændig realistisk størrelse at beregne. Eksempel β Pollards Rho metode: Side 15. pollards rho metode kan løses i tiden O(sqrt(N)) hvor N er gruppens orden. Vi har fx #E(F2^163)= 11692013098647223345629473816263631617836683539492 Jf s 12. Dvs Pollards Rho metode kan finde en løsning for n for Q=nP i tiden Sqrt(11692013098647223345629473816263631617836683539492)= 3.419.358.580.004.036.860.274.165 ~ 3,4*10^24 Man skal altså til enhver tid sørge for at ikke bare gruppens orden men kvadratroden af gruppens orden har en størrelse så det ikke er attraktivt at anvende Pollards Rho metode til at løse ECDLP Antag at vi skal bruge 1000 operationer pr tilfældige paring og test af dette pars eventuelle match. 89 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 Vi har så 147600000 parringer pr sekund. Med andre ord vil løsning kunne forventes at findes efter 2.3*10^16sekunder hvilket synes sikkert i betragtning af at 4.3*10^17 - er universets alder. Kan man lave en tabel over tP på en NIST kurve? Da alle domæneparametre jo er kendte? Nej Tidskomplexiteten ved at genneregne hver eneste værdi for hvert eneste punkt er jo O(N) og der vil tage O(N) tid, og ikke nok med det, det vil tage enorme mængder af storage kapacitet at gemme informationerne for slet ikke at snakke om at slå op i disse bjerge af data. 21. Øvrige bilag: Bilag C1: Danske standarder forespørgsel er sendt til [email protected] - nemID 17.07 2010 Spørgsmål til implementation af nemID - valg af digital signatur standard? Jeg forstår på udmeldinger i pressen af der anvendes niveau 4 i fips-140-2 men der synes ikke at være tilgængelig information om hvilken bagvedliggende digital signatur standard der anvendes jf. fips_1863.pdf Jeg vil derfor høre om det er muligt at få nærmere information om dette og har en række spørgsmål herunder jeg håber I kan være behjælpelige med. Anvendes der RSA til den digitale signatur og hvis ja hvilken nøglelængde er der da tale om?: 1024 eller fx 2048? Hvilken hash funktion benyttes til verifikation? Eller anvendes der i stedet Elliptisk kurve cryptografi til den digitale signatur (ECDSA) ? Hvis ja, hvilke kurver er valgt - er de valgt blandt de i NSAs Suite B - NIST anbefalede kurver (NIST-IEEE Standard 1363-2000), og hvis ja, hvilke bitlængde er der valgt? Hvilke øvrige public domæne parametre anvendes? Hvordan finder verifikation for domæneparametre og pseudorandomisering sted? Hvordan forholder implementationen generelt sig til de i Suite B, - FIPS-186-3 beskreven Digital signatur standarder? Hvis det ikke er muligt at få disse oplysninger, er det så en del af sikkerhedsproceduren ikke at offentliggøre domæneparametre og hvilken bagvedliggende kryptologi der baseres på? 90 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 Den amerikanske standard Suite B anvendes efterhånden bredt og en del af troværdigheden til systemet er baseret på at standardvalg og specifikation er offentliggjorte. Det er i mange internationale sammenhænge et krav at en kryptografisk løsning lever op til suiteB standarder, og jeg er derfor interesseret i hvilke overvejelser en dansk offentlig løsning har gjort sig i denne retning. Jeg håber meget I kan hjælpe og takker mange gange på forhånd refs: http://csrc.nist.gov/publications/fips/fips140-2/fips1402.pdf http://csrc.nist.gov/publications/fips/fips186-3/fips_186-3.pdf med venlig hilsen Christel Bach Lektor i Design, Interaktion og Sikkerhed Erhvervsakademi Århus Svar fra Ministeriet for Videnskab, Teknologi og Udvikling 19.07.2010 Kære Christel Bach, Tak for din henvendelse. NemID udstedes, ligesom den gamle digitale signatur, i henhold til de såkaldte OCES certifikatpolitikker, der findes offentligt tilgængelige på https://www.signatursekretariatet.dk/certifikatpolitikker.html. Via OCES certifikatpolitikkerne er der etableret en standard for certifikatudbydernes håndtering af certifikaterne og for indholdet i disse. Certifikatpolitikkerne, der har været til høring hos alle interesserede parter, udstikker det sikkerhedsniveau, der som minimum skal overholdes, hvis certifikatudbyderne vil kalde sig OCES-CA. Konkret kan jeg oplyse, at certifikater til personer udstedes på baggrund af 2048 bit RSAnøgler med SHA-256 som hash funktion, mens CA'ets rodnøgler er baseret på 4096 bit RSAnøgler, også med SHA-256 som hash funktion. Derudover kan du læse videre i "OCES-personcertifikatpolitik version 4.0" via ovenstående link, som er den version, NemID til det offentlige udstedes i henhold til. Jeg håber det var svar på dit spørgsmål, ellers er du velkommen til at vende tilbage. Med venlig hilsen Morten Steen Tambour Jacobsen Fuldmægtig, Cand.polyt. Center for Digital Signatur Direkte telefon: + 45 3337 9131 E-mail: [email protected] Ministeriet for Videnskab, Teknologi og Udvikling IT- og Telestyrelsen Holsteinsgade 63 DK-2100 København Ø Telefon: +45 3545 0000 Fax: +45 3545 0010 91 christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 E-mail: [email protected] www.itst.dk Bilag C2 Studieordning Studieordning for modulet βSecurityβ, et valgmodul under uddannelserne Professionsbachelor i Webudvikling og Professionsbachelor i Softwareudvikling ved Erhvervsakademi Århus. 4.9 Security (optional module) (10 ECTS) Purpose The purpose is to make the student able to implement security analysis, propose solutions and action plans, conducting implementation of resolutions and participate in the ongoing management. Objectives Knowledge Operating system security The objective is that the student must: β’ have knowledge of principles for access control in operating systems β’ be able to explain how to maintain the operating system, in terms of updates and "disaster recovery" Security Techniques The objective is that the student must: β’ be able to explain the general principles of cryptography, including symmetric and asymmetric encryption as well as the difference between weak and strong encryption keys β’ β’ β’ β’ 92 be able to explain other security techniques more or less based on cryptographic principles, including Digital Signature Certificates and Message Digest be aware of some widely used cryptographic standards (e.g. AES and RSA) be able to explain the use of VPN have extensive knowledge of security used on the World Wide Web, including SSL and SSH christelbach.com - all rights reserved © Christel Bach© Kryptografi med Elliptiske Kurver v.1.5 Wireless Security The objective is that the student must: β’ have knowledge of the specific threats and problems in wireless communications β’ be able to explain how best to secure wireless communications, including the use of encryption, MAC address validation and authentication Firewalls The objective is that student must: β’ be able to explain the operation of various types of firewalls, including filtering routers and application firewalls β’ have knowledge of IDS - Intrusion Detection Systems Application Security The objective is that student must: β’ know the general, overall threats that should be taken into account in applications, and implement solutions to counter these threats Skills Security Analysis The objective is that the student must: β’ be able to explain and categorize the major security threats and the related safety techniques β’ β’ β’ be able to prepare plans for physical security, redundant systems, backup strategies and monitoring mechanisms to detect security breaches be able to prepare a security policy be able to conduct a security assessment, including: o identifying the IT system's assets and defining the requirements for their protection o identifying threats o risk analysis o implementing parts of the security system o preparing an action plan for what to do at a security breach Operating system security The objective is that the student must: β’ be able to provide guidelines for how to achieve good password protection β’ be able to develop guidelines for controlling access to files and resources Application Security The objective is that student must: β’ be able to identify the need to incorporate application-specific safety programs Competences The student will gain competences in: β’ monitoring developments within the security area in order to identify new threats and the products and techniques for tackling these and already existing threats β’ 93 implementing / advising on the development of solid security applications christelbach.com - all rights reserved © Christel Bach© 94 Kryptografi med Elliptiske Kurver v.1.5 christelbach.com - all rights reserved ©
© Copyright 2024