# L6 Laboratorio saioa: RSA zifratzea # (Aritmetika Modularra: berreketa modularra) # # "numbers" paketea instalatzeko: install.packages("numbers") # "numbers" paketea kargatzeko: library("numbers") # laguntza eskatzeko: library(help="numbers") # Mezuen kodeketarako eta RSA-zifratzerako R funtzio # hauek bereziki interesatzen zaizkigu: # Berreketa modularra kalkulatzeko: modpower(65,43,85) #[1] 10 # Lehenengo berreketa kalkulatuz gero, zenbaki handiegi bat lortzen da... berreketa<-65^43 berreketa format(berreketa, scientific=FALSE) # "902140823020221853069382267866204722292810765838240893757986389015590648938496" # Orain R ez da gai modulua kalkulatzeko... mod(berreketa,85) ## Hizkien ASCII kodeak kalkulatzeko: ## Hizkiz hizki edo hitz osoa kolpetik strtoi(charToRaw("k"),16L) strtoi(charToRaw("a"),16L) strtoi(charToRaw("i"),16L) strtoi(charToRaw("x"),16L) strtoi(charToRaw("o"),16L) strtoi(charToRaw("kaixo"),16L) #[1] 107 97 105 120 111 ## Orain ASCII kodeetatik hizkietara ## Kodez kode edo kode-bektore bat kolpetik rawToChar(as.raw(107)) rawToChar(as.raw(97)) rawToChar(as.raw(105)) rawToChar(as.raw(120)) rawToChar(as.raw(111)) hitza<-c(107,97,105,120,111) rawToChar(as.raw(hitza)) # [1] "kaixo" ################################################################## # 1.Ariketa. Kodetzea / deskodetzea # Parametro moduan txt karaktere string-a jaso eta dagozkion ASCII kodeak # itzultzen dituen funtzioa. kodetu <- function(txt) { return(strtoi(charToRaw(txt),16L)) } ## Probak: testu1<-"kaixo" kodebektore1<-kodetu(testu1) kodebektore1 # 107 97 105 120 111 testu2<-"KAIXO" kodebektore2<-kodetu(testu2) kodebektore2 # 75 65 73 88 79 testu3<-"Zer moduz?" kodebektore3<-kodetu(testu3) kodebektore3 # 90 101 114 32 109 111 100 117 122 63 ########################################################################### # Parametro moduan ASCII kodeak jaso eta dagokion txt karaktere string-a # itzultzen duen funtzioa. deskodetu <- function(kodetxt) { return(rawToChar(as.raw(kodetxt))) } # Probak: txt1<-deskodetu(kodebektore1) txt1 # "kaixo" txt2<-deskodetu(kodebektore2) txt2 # "KAIXO" txt3<-deskodetu(kodebektore3) txt3 # "Zer moduz?" ##################################################### # 2. Ariketa. Zifratzea / deszifratzea # Parametro moduan ASCII kodeez osatutako bektore bat jaso eta dagokion # bektore zifratua itzuliko du # Bektorearen luzera kalkulatu, eta osagaiak banan bana hartu eta # haien berreketa kalkulatu behar da, beste bektore batean emaitza gordetzeko zifratu <- function(kodebektorea,r,n) { luzera<-length(kodebektorea) bektoreberria<-c() for(i in 1:luzera){ bektoreberria[i] = modpower(kodebektorea[i],r,n) } return(bektoreberria) } # Probak: # Erabiliko ditugun gakoak: # n=9797, r=7, s=2743 hitzazifratua<- zifratu(kodetu("ordenagailua"),3,31753) hitzazifratua bektorezifratu1<-zifratu(kodebektore1,7,9797) bektorezifratu1 # 2792 5432 4668 4973 7969 bektorezifratu2<-zifratu(kodebektore2,7,9797) bektorezifratu2 # 7976 4764 2565 8540 4974 bektorezifratu3<-zifratu(kodebektore3,7,9797) bektorezifratu3 # 375 2222 7721 3675 493 7969 6261 8564 4122 4604 ##################################################### # Parametro moduan bektore zifratu bat jaso eta dagozkion # ASCII kodeak itzuliko du # Bektorearen luzera kalkulatu, eta osagaiak banan bana hartu eta # haien berreketa kalkulatu behar da, beste bektore batean emaitza gordetzeko deszifratu <- function(bektorezifratu,s,n) { luzera<-length(bektorezifratu) bektoredeszifratua<-c() for(i in 1:luzera){ bektoredeszifratua[i] = modpower(bektorezifratu[i],s,n) } return(deskodetu(bektoredeszifratua)) } # Probak: jasotakohitza<-c(210339,240990,222525,22389,54107,22389,64672,207507) jasotakohitzadeszifratua<-deszifratu(jasotakohitza,56753,284849) jasotakohitzadeszifratua deszifratua1<-deszifratu(bektorezifratu1,2743,9797) deszifratua1 # 107 97 105 120 111 deszifratua2<-deszifratu(bektorezifratu2,2743,9797) deszifratua2 # 75 65 73 88 79 deszifratua3<-deszifratu(bektorezifratu3,2743,9797) deszifratua3 # 90 101 114 32 109 111 100 117 122 63 ############################################################# # Dena kolpetik egin dezakegu. # RSA_gakoak(97,101) zenbaki lehenetatik lortutako gakoekin: # n=9797, r=7, s=2743 n<-9797 r<-7 s<-2743 testuberria<-"ea hau ondo doan..." testuberri_zifratua <- zifratu(kodetu(testuberria),r,n) testuberri_zifratua # 2222 5432 3675 1177 5432 8564 3675 7969 9305 6261 7969 # 3675 6261 7969 5432 9305 3037 3037 3037 testuberri_errekuperatua <- deskodetu(deszifratu(testuberri_zifratua,s,n)) testuberri_errekuperatua # "ea hau ondo doan..." ## Bai!! Prozesu osoa ondo joan da!! #################################################################### ## Probak beste gako batzuekin: # RSA_gakoak(17,23) zenbaki lehenetatik lortutako gakoekin: # n=391, r=3, s=235 n<-391 r<-3 s<-235 testuberria<-"ea hau ondo doan..." testuberri_zifratua <- zifratu(kodetu(testuberria),r,n) testuberri_zifratua # 16 79 315 348 79 77 315 304 36 213 304 315 213 304 # 79 36 368 368 368 testuberri_errekuperatua <- deskodetu(deszifratu(testuberri_zifratua,s,n)) testuberri_errekuperatua # "ea hau ondo doan..." #################################################################### ## Probak beste gako batzuekin: # RSA_gakoak(307,397) zenbaki lehenetatik lortutako gakoekin: # n=121879, r=5, s=96941 n<-121879 r<-5 s<-96941 testuberria<-"ea hau ondo doan..." testuberri_zifratua <- zifratu(kodetu(testuberria),r,n) testuberri_zifratua # 108694 111554 37707 79728 111554 32684 37707 78527 8940 71808 # 78527 37707 71808 78527 111554 8940 109345 109345 109345 testuberri_errekuperatua <- deskodetu(deszifratu(testuberri_zifratua,s,n)) testuberri_errekuperatua # "ea hau ondo doan..." #################################################################### ## Probak beste gako batzuekin: # RSA_gakoak(5,17) zenbaki lehenetatik lortutako gakoekin: # n=85, r=3, s=43 n<-85 r<-3 s<-43 testuberria<-"ea hau ondo doan..." testuberri_zifratua <- zifratu(kodetu(testuberria),r,n) testuberri_zifratua # 16 28 43 59 28 43 43 66 70 60 66 43 60 66 28 70 11 11 11 testuberri_errekuperatua <- deskodetu(deszifratu(testuberri_zifratua,s,n)) testuberri_errekuperatua # "\020\f \023\f \032\031\017\032 \017\032\f\031..." # Ez da jatorrizko mezua errekuperatu... # Eta "kaixo" mezua ondo deszifratuko da? testuberria<-"kaixo" testuberri_zifratua <- zifratu(kodetu(testuberria),r,n) testuberri_zifratua # 23 28 10 35 66 testuberri_errekuperatua <- deskodetu(deszifratu(testuberri_zifratua,s,n)) testuberri_errekuperatua # "\026\f\024#\032" # Zer gertatu da? Zein da arazoa?? ######################################################## ## 3. Jolasa ## ## L5 laboratorioko lehen_erlatibo_txiki() eta RSA_gakoak() funtzioak behar ditugu lehen_erlatibo_txiki <- function(m) { zbki<-2; while(GCD(m,zbki)!=1) ## L4 laboko zkh funtzioa erabil daiteke { zbki<-zbki+1; }; return(zbki); } RSA_gakoak <- function(p,q) { if(p!=q){ n<-p*q m<-(p-1)*(q-1) r<-lehen_erlatibo_txiki(m) s<-modinv(r,m) gakoak<-cat("Gako publikoa: n: ",n,"r: ",r,"Gako pribatua. s: ",s,"\n") return(gakoak) } else{ print("p eta q ezin dira berdinak izan") return() } } # Amaiak Aitorri mezu zifratu bat bidaliko dio. #----------------------------------------------------------------- # Hartzailea Aitor da. # Aitorrek bere gakoak kalkulatu ditu: # Bi zenbaki lehen aukeratu ditu, 500 eta 600 artekoak, adibidez Primes(500,600) # 503 509 521 523 541 547 557 563 569 571 577 587 593 599 # p=521 eta q=577 aukeratu ditu, adibidez # Gakoak kalkulatzeko funtzioari dei egin eta bere gakoak kalkulatu ditu: RSA_gakoak(521,577) # Gako publikoa. n= 300617 r= 7 Gako pribatua, s= 213943 # Aitorrek bere gako publikoa ezagutzera eman du arbelean. n<-300617 r<-7 #-------------------------------------------------------- # Bidaltzailea Amaia da. # Amaiak mezua pentsatu du testuberria<-"Epa Aitor!!" # Aitorrentzat denez, Aitorren gako publikoa erabiliz zifratuko du testuberri_zifratua <- zifratu(kodetu(testuberria),r,n) testuberri_zifratua # 118828 36552 205535 117119 35268 177089 257926 139977 204463 271504 271504 # Mezu zifratua arbelean idatzi du Amaiak, Aitorren gakoen aldamenean. #----------------------------------------------------------- # Aitorrek mezua deszifratuko du. # Horretarako, bere gako pribatua erabiliko du. s<-213943 # Arbeleko kode zifratuekin bektore bat osatuko du: arbelekoa<-c(118828,36552,205535,117119,35268,177089,257926,139977,204463,271504,271504) # Eta deszifratu eta deskodetuko du testuberri_errekuperatua <- deskodetu(deszifratu(arbelekoa,s,n)) testuberri_errekuperatua # "Epa Aitor!!" ## Bai!! Prozesu osoa ondo joan da!! Deszifratu da #----------------------------------------------------------------------- # Inork ez du ikusi, baina tximino bat sartu da gelan # Arbeleko informazioa ikusi du: # Gako publikoa:n<-300617, r<-7 # Mezu zifratua # 118828 36552 205535 117119 35268 177089 257926 139977 204463 271504 271504 # Gako pribatua kalkulatu du primeFactors(n) # 521 577 # p eta q ezagututa, gakoak kalkulatu ditu: RSA_gakoak(521,577) # Gako publikoa. n= 300617 r= 7 Gako pribatua, s= 213943 # Lortu du gako pribatua! Kriptografia sistemak porrot egin du! tximinoak_harrapatua<-c(118828,36552,205535,117119,35268,177089,257926,139977,204463,271504,271504) testuberri_errekuperatua <- deskodetu(deszifratu(tximinoak_harrapatua,s,n)) testuberri_errekuperatua # Tximinoak mezua deszifratu du... ## ## Arbeleko jokoa martxan jartzeko moduan zaude. Aukeratu zure gako publiko eta pribatuak. ## 1.- Hartzaile. ## Hartzaile izateko: Idatzi zure izena eta zure gako publikoa. Norbaitek zuri mezu zifratu ## bat bidaltzeko zain geratzen zara. Arbelean norbaitek mezua idazten dizunean, deszifratu ## zure gako pribatuarekin. Ondo joan da prozesua? ## Ez erabili gako handiegiak, arbelean idazteko... ## 2.- Bidaltzaile ## Bidaltzaile izateko, beste norbaitek arbelean idatzitako gako publikoa erabiliz mezu motz ## bat pentsatu, zifratu eta arbelean idatz ezazu. Berak deszifratuko du. ## Gako handiekin eta mezu luzeagoekin jolas egin nahi baduzu, posta elektronikoz egin dezakezu. ## Horrela zenbaki handien trukea errazagoa izango da. primeactors(76127) primeFactors(25199) RSA_gakoak(113, 223) krakeatutakomezua<-c(2792,5432,4668,4973,7969) deszifratu(krakeatutakomezua,4973,25199)