# Homework 8 FCS # 1 ## a) (A mod C * B mod C) mod C $[(12358 mod 29101)(1854 mod 29101)(14303 mod 29101)] mod 29101 = 25,392$ ## b) $12358 * 1854 * 14303 = 327706502796$ $327706502796$ mod $29101 = 25,392$ # 2 Diffie-Hellman protocol. ```python= def ex2(): P = 23 G = 9 print('The Value of P is :%d'%(P)) print('The Value of G is :%d'%(G)) # Alice will choose the private key a a = 4 print('The Private Key a for Alice is :%d'%(a)) # gets the generated key x = int(pow(G,a,P)) # Bob will choose the private key b b = 3 print('The Private Key b for Bob is :%d'%(b)) # gets the generated key y = int(pow(G,b,P)) # Secret key for Alice ka = int(pow(y,a,P)) # Secret key for Bob kb = int(pow(x,b,P)) print('Secret key for the Alice is : %d'%(ka)) print('Secret Key for the Bob is : %d'%(kb)) ''' The Value of P is :23 The Value of G is :9 The Private Key a for Alice is :4 The Private Key b for Bob is :3 Secret key for the Alice is : 9 Secret Key for the Bob is : 9 ''' ``` # 3 ```python= def ex3(): p = 71 q = 89 n = p * q e = 3 phi = (p - 1) * (q - 1) d = modInverse(e, phi) # private RSA key m1 = 5416 m1_signed = pow(m1, d, n) m2 = 2397 m2_signed = pow(m2, d, n) m3 = (m1 * m2) % n m3_signed = pow(m3, d, n) forged_signature = (m1_signed * m2_signed) % n print(f"Signature on m1 ( {m1} ) = {m1_signed}") print(f"Signature on m1 ( {m2} ) = {m2_signed}") print(f"Signature on m1 ( {m3} ) = {m3_signed}") print(f"Product of 1st two signatures = ( {m1_signed} * {m2_signed}) mod {n} = {forged_signature}") if m3_signed == forged_signature: print("Shown to be the same.") else: print("Unable to show third signature equal to product of 1st two signatures.") ''' Signature on m1 ( 5416 ) = 1876 Signature on m1 ( 2397 ) = 2206 Signature on m1 ( 2926 ) = 5830 Product of 1st two signatures = ( 1876 * 2206) mod 6319 = 5830 Shown to be the same. ''' ``` # 4 ```python= import random def rabin_miller(n): if n == 2 or n == 3: return True if n % 2 == 0 or n < 2: return False s = n - 1 t = 0 while s % 2 == 0: s = s // 2 t = t + 1 for count in range (0, 10): a = random.randint(2, n-1) x = pow(a, s, n) # a^s mod n if x != 1: i = 0 while x != (n - 1): if i == t - 1 : return False else: i = i + 1 x = pow(x, 2, n) # x^2 mod n return True def gcd(a, b): while a != b: if a > b: a = a - b else: b = b - a return a def modInverse(a, b): # Find modular inverse of a mod b # Wijaya, H. (2020). Google Colaboratory. # Extended Euclidean Algorithm for Finding Modular Inverse. if gcd(a, b) != 1: return None m = b x0, x1 = 1, 0 y0, y1 = 0, 1 while b != 0: q = a // b x0, x1 = x1, (x0 - q * x1) y0, y1 = y1, (y0 - q * y1) a, b = b, (a - q * b) return x0 % m def Gen(minPrime): while True: temp = random.randrange(minPrime, 100*minPrime) if rabin_miller(temp): q = temp # check if 2*q + 1 is prime or not if rabin_miller(2*q + 1): p = 2*q + 1 # p is a safe prime break else: q = None n = p * q phi = (p - 1) * (q - 1) # Generate public exponent, e while True: # such that e = random.randrange(2, phi) # 1 < e < phi & if gcd(e, phi) == 1: # gcd(e, phi) = 1 break # Compute private exponent, d = e^-1 mod phi d = modInverse(e, phi) return (n, e), (p, q, phi, d) def Enc(pubKey, msg): n, e = pubKey ctxt = pow(msg, e, n) return ctxt def Dec(privKey, ctxt): p, q, phi, d = privKey msg = pow(ctxt, d, p*q) return msg ``` # 5 An adversary can deduce the that a large minimum prime is used, given only the execution time of encrypting it. A longer encryption time is required when using a large key size. This means, for good security (e.g. 2048 bits or more), it will be very resource intensive to perform RSA encryption. Also, it takes a longer time to generate the keys when using a larger minPrime (resulting in larger n). ```python= def ex5(): min_prime_ls = [ 27271, 199957836325857837831079889994460955264807, 1372700919823709432465276597450786841849939150768666389468639836138410690084638911314691944127177813, 64418860678769753220216145153813492780772705889433966153663723284601684280647782579593019845358246623345580817057679212052080123782339072897264205151162401096069968341352071573932206373344077504813413, ] msgList = [ 37123, 43690, 65535, 87758383, 4294967295, 9264398173, 549755813887, ] for minPrime in min_prime_ls: for msg in msgList: print("minPrime = ", minPrime) print("msg:", msg) # Generate public/private key pair # where p, q > minPrime start = timeit.default_timer() pubKey, privKey = Gen(minPrime) end = timeit.default_timer() print(end - start, "seconds to generate keys\n") # Encryption Timing Attack total_time = 0 for i in range(3): start = timeit.default_timer() C = Enc(pubKey, msg) end = timeit.default_timer() total_time = total_time + ((end - start) * 1000) print(f"{i+1}. Took", '{0:.6f}'.format((end - start) * 1000), "ms to encrypt message.") print("Length:", pubKey[0].bit_length(), "bits. n:", pubKey[0]) print("Average encryption time = ", '{0:.6f}'.format(total_time/3), "ms.") # Decryption M = Dec(privKey, C) print("Decrypted plaintext message = ", M) ``` ``` # Results minPrime = 27271 msg: 37123 0.0004988999999999966 seconds to generate keys 1. Took 0.011800 ms to encrypt message. 2. Took 0.012300 ms to encrypt message. 3. Took 0.011700 ms to encrypt message. Length: 44 bits. n: 11688624587503 Average encryption time = 0.011933 ms. Decrypted plaintext message = 37123 minPrime = 27271 msg: 43690 0.001720299999999994 seconds to generate keys 1. Took 0.011000 ms to encrypt message. 2. Took 0.009700 ms to encrypt message. 3. Took 0.009600 ms to encrypt message. Length: 41 bits. n: 1822679832403 Average encryption time = 0.010100 ms. Decrypted plaintext message = 43690 minPrime = 27271 msg: 65535 0.00027240000000000597 seconds to generate keys 1. Took 0.016900 ms to encrypt message. 2. Took 0.098400 ms to encrypt message. 3. Took 0.010500 ms to encrypt message. Length: 43 bits. n: 5186964738511 Average encryption time = 0.041933 ms. Decrypted plaintext message = 65535 minPrime = 27271 msg: 87758383 0.001753599999999994 seconds to generate keys 1. Took 0.012700 ms to encrypt message. 2. Took 0.012100 ms to encrypt message. 3. Took 0.012300 ms to encrypt message. Length: 44 bits. n: 11660501809153 Average encryption time = 0.012367 ms. Decrypted plaintext message = 87758383 minPrime = 27271 msg: 4294967295 0.0009258000000000044 seconds to generate keys 1. Took 0.011600 ms to encrypt message. 2. Took 0.012300 ms to encrypt message. 3. Took 0.040700 ms to encrypt message. Length: 43 bits. n: 5174179376941 Average encryption time = 0.021533 ms. Decrypted plaintext message = 4294967295 minPrime = 27271 msg: 9264398173 0.0002954000000000012 seconds to generate keys 1. Took 0.010300 ms to encrypt message. 2. Took 0.011300 ms to encrypt message. 3. Took 0.013000 ms to encrypt message. Length: 42 bits. n: 2917181235403 Average encryption time = 0.011533 ms. Decrypted plaintext message = 9264398173 minPrime = 27271 msg: 549755813887 0.0004906000000000077 seconds to generate keys 1. Took 0.064000 ms to encrypt message. 2. Took 0.092000 ms to encrypt message. 3. Took 0.018600 ms to encrypt message. Length: 43 bits. n: 6322377755431 Average encryption time = 0.058200 ms. Decrypted plaintext message = 549755813887 minPrime = 199957836325857837831079889994460955264807 msg: 37123 0.6049641 seconds to generate keys 1. Took 0.182700 ms to encrypt message. 2. Took 0.179100 ms to encrypt message. 3. Took 0.178300 ms to encrypt message. Length: 288 bits. n: 381430450895436613203665552181658378559328301036156641957590727764000362472937206244253 Average encryption time = 0.180033 ms. Decrypted plaintext message = 37123 minPrime = 199957836325857837831079889994460955264807 msg: 43690 0.8159945 seconds to generate keys 1. Took 0.176300 ms to encrypt message. 2. Took 0.175100 ms to encrypt message. 3. Took 0.175700 ms to encrypt message. Length: 281 bits. n: 2240825371063244318871566962468441072782473826390679585557244152418397492888596441651 Average encryption time = 0.175700 ms. Decrypted plaintext message = 43690 minPrime = 199957836325857837831079889994460955264807 msg: 65535 0.30565089999999984 seconds to generate keys 1. Took 0.184700 ms to encrypt message. 2. Took 0.179700 ms to encrypt message. 3. Took 0.178700 ms to encrypt message. Length: 288 bits. n: 407610227126057578729100084757205994198340113597896282444126762942984550429090997468031 Average encryption time = 0.181033 ms. Decrypted plaintext message = 65535 minPrime = 199957836325857837831079889994460955264807 msg: 87758383 0.9811128999999998 seconds to generate keys 1. Took 0.185400 ms to encrypt message. 2. Took 0.176900 ms to encrypt message. 3. Took 0.181900 ms to encrypt message. Length: 288 bits. n: 290592048704749728023513109016057171504182442200607886487652974250832274169091467777141 Average encryption time = 0.181400 ms. Decrypted plaintext message = 87758383 minPrime = 199957836325857837831079889994460955264807 msg: 4294967295 0.5714883999999998 seconds to generate keys 1. Took 0.279500 ms to encrypt message. 2. Took 0.212600 ms to encrypt message. 3. Took 0.188000 ms to encrypt message. Length: 289 bits. n: 517365450007968134382300543012493790059722965432885439763729533706281249218262313203601 Average encryption time = 0.226700 ms. Decrypted plaintext message = 4294967295 minPrime = 199957836325857837831079889994460955264807 msg: 9264398173 0.006764800000000015 seconds to generate keys 1. Took 0.173500 ms to encrypt message. 2. Took 0.172700 ms to encrypt message. 3. Took 0.173600 ms to encrypt message. Length: 281 bits. n: 3420802810107971515111050767125098998663968014261552080676091299922667445561409693801 Average encryption time = 0.173267 ms. Decrypted plaintext message = 9264398173 minPrime = 199957836325857837831079889994460955264807 msg: 549755813887 0.20825960000000032 seconds to generate keys 1. Took 0.181700 ms to encrypt message. 2. Took 0.178300 ms to encrypt message. 3. Took 0.177200 ms to encrypt message. Length: 289 bits. n: 773520209062281239410497717468499532506879896044163266473801269315035057732750220605131 Average encryption time = 0.179067 ms. Decrypted plaintext message = 549755813887 minPrime = 1372700919823709432465276597450786841849939150768666389468639836138410690084638911314691944127177813 msg: 37123 2.1585642000000003 seconds to generate keys 1. Took 1.134100 ms to encrypt message. 2. Took 1.132800 ms to encrypt message. 3. Took 1.134500 ms to encrypt message. Length: 671 bits. n: 8959349263523002576539706520041762608186249937124307849512504428857247907923540821575861118787426149698132043133301266938774694586010791901105489468035396506682239406775873635516152387232055108262273621 Average encryption time = 1.133800 ms. Decrypted plaintext message = 37123 minPrime = 1372700919823709432465276597450786841849939150768666389468639836138410690084638911314691944127177813 msg: 43690 10.4691464 seconds to generate keys 1. Took 1.069400 ms to encrypt message. 2. Took 1.069400 ms to encrypt message. 3. Took 1.058500 ms to encrypt message. Length: 661 bits. n: 5178924421649196438400019163945483744148268244327112262056906072001238401663727114012046657603495725007128383261279068432096028888797867929812994143926198013354211178285514929540359126873400306823131 Average encryption time = 1.065767 ms. Decrypted plaintext message = 43690 minPrime = 1372700919823709432465276597450786841849939150768666389468639836138410690084638911314691944127177813 msg: 65535 6.843333600000001 seconds to generate keys 1. Took 1.123500 ms to encrypt message. 2. Took 1.117800 ms to encrypt message. 3. Took 1.306500 ms to encrypt message. Length: 666 bits. n: 186496274938888298618530619691919805824863785130294485890317470589649412639248422645832263610703568953414934372066814157012096085269524950379903314976287092330263472943785220414972576659078255437569253 Average encryption time = 1.182600 ms. Decrypted plaintext message = 65535 minPrime = 1372700919823709432465276597450786841849939150768666389468639836138410690084638911314691944127177813 msg: 87758383 7.555866399999999 seconds to generate keys 1. Took 1.208600 ms to encrypt message. 2. Took 1.205000 ms to encrypt message. 3. Took 1.265500 ms to encrypt message. Length: 673 bits. n: 27964274140506405603575904733705336548076055069807881502503945703502597194109186238750484059755301840045404706951931027965640432915367843430730678484467973633582956241939771065116871998230551987021925841 Average encryption time = 1.226367 ms. Decrypted plaintext message = 87758383 minPrime = 1372700919823709432465276597450786841849939150768666389468639836138410690084638911314691944127177813 msg: 4294967295 1.0700301000000003 seconds to generate keys 1. Took 1.236100 ms to encrypt message. 2. Took 1.338100 ms to encrypt message. 3. Took 1.153700 ms to encrypt message. Length: 673 bits. n: 31958958347821357323790130654812555023237293831094132987950090910570307262704228897516343224914183164876807530414177726975733119401708023636704639870085829670719022235441618901420494682187282153704293821 Average encryption time = 1.242633 ms. Decrypted plaintext message = 4294967295 minPrime = 1372700919823709432465276597450786841849939150768666389468639836138410690084638911314691944127177813 msg: 9264398173 4.024938699999996 seconds to generate keys 1. Took 1.198400 ms to encrypt message. 2. Took 1.201000 ms to encrypt message. 3. Took 1.439800 ms to encrypt message. Length: 669 bits. n: 2215661467291700308605777173661297383205802352014282197500165546277563094492714967239233847483863058071625782186032613484673470893381543909293820705744144162083533430976332282961324875610441211596046253 Average encryption time = 1.279733 ms. Decrypted plaintext message = 9264398173 minPrime = 1372700919823709432465276597450786841849939150768666389468639836138410690084638911314691944127177813 msg: 549755813887 0.35646280000000274 seconds to generate keys 1. Took 1.224700 ms to encrypt message. 2. Took 1.218600 ms to encrypt message. 3. Took 1.379400 ms to encrypt message. Length: 665 bits. n: 104012710032730832433939384326584034624990823080306950109763465163019653497242928876831297138628267205525167620232051740984829699230002873564273208537468614884800515644433504050450920560270307874961881 Average encryption time = 1.274233 ms. Decrypted plaintext message = 549755813887 minPrime = 64418860678769753220216145153813492780772705889433966153663723284601684280647782579593019845358246623345580817057679212052080123782339072897264205151162401096069968341352071573932206373344077504813413 msg: 37123 47.1715848 seconds to generate keys 1. Took 6.508000 ms to encrypt message. 2. Took 6.650100 ms to encrypt message. 3. Took 6.331800 ms to encrypt message. Length: 1340 bits. n: 18727027181215934419039674230892951941399334726439758842011148095231164627799352794607370002518383697052098020163142985185395087884522183874627844463533727975695631646840010859007301182229435157329075827283130118976688862406213264278284141751735292486086422660678453025402246111149419709521645960022403437050279943541113256000971191408999298092321301555640888681382555946551833395339684045567124991568661 Average encryption time = 6.496633 ms. Decrypted plaintext message = 37123 minPrime = 64418860678769753220216145153813492780772705889433966153663723284601684280647782579593019845358246623345580817057679212052080123782339072897264205151162401096069968341352071573932206373344077504813413 msg: 43690 155.78270609999998 seconds to generate keys 1. Took 6.432500 ms to encrypt message. 2. Took 6.096300 ms to encrypt message. 3. Took 6.235500 ms to encrypt message. Length: 1334 bits. n: 231861856994605752916764226229417795156586540174524695629542908432435741702755712320611964741207288526945955470268060961129102981995185342378826325345782880845871265198302244530282596293772782512930155183986704317790256756550597020196471338113039421661360065023117608369875077420536352133877140861798275259355742700084612081624924798869020978764775904571110644169078624332621354282231810742035040898153 Average encryption time = 6.254767 ms. Decrypted plaintext message = 43690 minPrime = 64418860678769753220216145153813492780772705889433966153663723284601684280647782579593019845358246623345580817057679212052080123782339072897264205151162401096069968341352071573932206373344077504813413 msg: 65535 70.3420634 seconds to generate keys 1. Took 6.271900 ms to encrypt message. 2. Took 6.388200 ms to encrypt message. 3. Took 6.541000 ms to encrypt message. Length: 1336 bits. n: 1497068550700900094845127482053156841088435267133257996413165610230063198459296243040760702181878582190885408767646583992244133477684468176734886632418112515938244011800896400546386445359869202418140986683356860357854109153844802052053088694880557727201741365465495968909548073037606915576102082761454923989219533078223977799100949395025895867791759453192726980085343821161680232177043550352361857069201 Average encryption time = 6.400367 ms. Decrypted plaintext message = 65535 minPrime = 64418860678769753220216145153813492780772705889433966153663723284601684280647782579593019845358246623345580817057679212052080123782339072897264205151162401096069968341352071573932206373344077504813413 msg: 87758383 20.921105899999986 seconds to generate keys 1. Took 7.001100 ms to encrypt message. 2. Took 6.695400 ms to encrypt message. 3. Took 6.385000 ms to encrypt message. Length: 1341 bits. n: 44312720110212854575934777588322169743461636296561312973831501568603252555790783527025707912525518651500056285685763270347329275743863384351231414342773958726135337764141723758314436813829004767171547907271513838404255894041971000370574188149752392103304811049985461026425615953443237481179766333379694986118331986574616055154115482765054187885065591664761796521338816755555414391305059390162809880436153 Average encryption time = 6.693833 ms. Decrypted plaintext message = 87758383 minPrime = 64418860678769753220216145153813492780772705889433966153663723284601684280647782579593019845358246623345580817057679212052080123782339072897264205151162401096069968341352071573932206373344077504813413 msg: 4294967295 188.77195700000004 seconds to generate keys 1. Took 7.121400 ms to encrypt message. 2. Took 7.171500 ms to encrypt message. 3. Took 6.735100 ms to encrypt message. Length: 1342 bits. n: 61476116702165620691742146064613285457128062187246703450383729802461778477991330236193501991531268407565735387304503285087791366636705334181943209257492073367667563010076485625182419862306944874341376303726383535158866926233965288470953611546300758710150975971720540609986267808504064170811749462027536182696671665388145053866744342264881504151556869595988534656485916588803020738935587550191407638241801 Average encryption time = 7.009333 ms. Decrypted plaintext message = 4294967295 minPrime = 64418860678769753220216145153813492780772705889433966153663723284601684280647782579593019845358246623345580817057679212052080123782339072897264205151162401096069968341352071573932206373344077504813413 msg: 9264398173 12.333438499999943 seconds to generate keys 1. Took 6.790100 ms to encrypt message. 2. Took 6.708100 ms to encrypt message. 3. Took 6.472000 ms to encrypt message. Length: 1334 bits. n: 367115147541241650259393315381218248103245638243219524373794841112426069284286534330146439335680889576732114418202333056113669745399225889247345221976477353855845000918086673353674479560678594474797388862618939139876121839056974101805855791683898589549636916998214111251098445443993335044876105434176776652134779765485828882073269686076080898751149166070871007943274544182599501299071275001715922522561 Average encryption time = 6.656733 ms. Decrypted plaintext message = 9264398173 minPrime = 64418860678769753220216145153813492780772705889433966153663723284601684280647782579593019845358246623345580817057679212052080123782339072897264205151162401096069968341352071573932206373344077504813413 msg: 549755813887 97.26959879999993 seconds to generate keys 1. Took 6.857700 ms to encrypt message. 2. Took 6.846800 ms to encrypt message. 3. Took 6.683500 ms to encrypt message. Length: 1342 bits. n: 67977196209067126466228789947290623939707729717547194213678557206894737362168754413824532899135459264967415876894654154513403772926731973150637276940075725659248943981458919431459834363978345267305479367664437385781752675412734964599131746916562711095650358892975926143508570013724214009332202554811000004814210243006186023628460377289072924061675703266655749703300193017103199595758960986858410607485811 Average encryption time = 6.796000 ms. Decrypted plaintext message = 549755813887 ```