#use"crylib.ml";; #use"input.ml";; (* 256 let elp = string2b "229500277050608625993474245800043011528976370184242823976442202301427069754458277";; let elg = string2b "235904997254757621614154876419281664977623142819935605632326954106419292386253811";; *) (* 512 let elp = string2b "15605363929042755209046665304099197223210373276845019820891569084726887581036880369656018957732037239020430224927588233081335399981533814273492290736058832897";; let elg = string2b "27000849334831685078645196798126575749989567606330763905938790006067435364133987395057682617561834079516930584360952784679947216374978830214988492852704522252";; *) (* 768 let elp = string2b "47155586469714363644226831639249035538858492412368563058875431082706148151130267416976915979688411795972298661525327627694240744234715725244368200840318882031585803964929622239800112891448269109761160527615585288184730516055561395671461";; let elg = string2b "40721021096050344568506846352670585455535389679993171587890673941358986510795151591184568488374837240757725473554117245866943417093452032920835746873766641958946478559868983923067266002403786682126479477538261580646795453255963637119441";; *) let elp = string2b "101152656002160984543137359165211317347458181604488198109047040521449165155732055723075853565905416906688736717665356151300025996994863146868719276175515990218556247909411695921176327134622881172601609551190494172880769648316264864777106279323934795421549601993662013199830920305842328434282382107039089568415622441";; let elg = string2b "178193123729243119330799440395943262109391770905018503117784487580081367066241315591281735479802092683088367773622837595722084763171128016703529196406390971954888440311730656915014479815074248224581835638406214919899205076854012585299774785970243558898274504312420609211176922106776972454951270720492526482576413700";; (* 1024 let elp = string2b "101152656002160984543137359165211317347458181604488198109047040521449165155732055723075853565905416906688736717665356151300025996994863146868719276175515990218556247909411695921176327134622881172601609551190494172880769648316264864777106279323934795421549601993662013199830920305842328434282382107039089568415622441";; let elg = string2b "178193123729243119330799440395943262109391770905018503117784487580081367066241315591281735479802092683088367773622837595722084763171128016703529196406390971954888440311730656915014479815074248224581835638406214919899205076854012585299774785970243558898274504312420609211176922106776972454951270720492526482576413700";; *) type elgamalkey = { elgamal_p: big_int; elgamal_g: big_int; mutable elgamal_y: big_int; mutable elgamal_x: big_int; mutable elgamal_b: big_int };; let myekey = { elgamal_p = elp; elgamal_g = elg; elgamal_y = b0; elgamal_x = b0; elgamal_b = b0 };; let elgamalcompletekey ek = ek.elgamal_x <- bdiv ek.elgamal_p b3; ek.elgamal_y <- bpowmod ek.elgamal_g ek.elgamal_x ek.elgamal_p; ek.elgamal_b <- bmult (bdiv ek.elgamal_p b3) b2;; elgamalcompletekey myekey;; let elgamalencrypt m ek = let bb = bpowmod ek.elgamal_g ek.elgamal_b ek.elgamal_p in let right = bpowmod ek.elgamal_y ek.elgamal_b ek.elgamal_p in let c = (bmult right m) % ek.elgamal_p in (bb, c);; let elgamalencrypt' m ek = let bb = bpowmod ek.elgamal_g ek.elgamal_b ek.elgamal_p in let right = bpowmod ek.elgamal_y ek.elgamal_b ek.elgamal_p in let c = (bmult' right m) %% ek.elgamal_p in .< (bb, .~ c) >.;; let elgamaldecrypt (bb,c) ek = let p1a = bsub (bpred ek.elgamal_p) ek.elgamal_x in let left = bpowmod bb p1a ek.elgamal_p in (bmult left c) % ek.elgamal_p;; let elgamaldecrypt' bbc ek = let p1a = bsub (bpred ek.elgamal_p) ek.elgamal_x in .< let (bb,c) = .~ bbc in let left = .~(bpowmod' .. p1a ek.elgamal_p) in (bmult left c) % ek.elgamal_p >.;; let c = elgamalencrypt m511 myekey;; Trx.init_times();; let u1 = Trx.time more "u1" (fun () -> elgamaldecrypt c myekey);; let s1 = Trx.time less "s1" (fun () -> . .~(elgamaldecrypt' .. myekey)>.);; let co = Trx.time less "co" (fun () -> .! s1);; let s2 = Trx.time more "s2" (fun () -> co c);; Trx.print_times();;