diff --git a/hw1.3/ratchet/mallory.py b/hw1.3/ratchet/mallory.py new file mode 100644 index 0000000..cfd64b8 --- /dev/null +++ b/hw1.3/ratchet/mallory.py @@ -0,0 +1,209 @@ +# mallory.py, a mitm attack to learn ratchet gossip about your CSE 539 instructor +# jedimaestro@asu.edu + +import secrets +import sys +import os.path +import time +import os +import re +from colorama import Fore, Back, Style +import signal + +g = 10697987386528634556132351984988679277669693771233806587823166397646257882356751154924044166012048802718827287365490918762116743604708315476073224232944329 + +p = 21395974773057269112264703969977358555339387542467613175646332795292515764713502309848088332024097605437654574730981837524233487209416630952146448465888659 + +if (len(sys.argv) < 3) or sys.argv[1] == sys.argv[2]: + print("No! RTFSC!") + exit(0) + +flog = open("mallorylog.txt", "w") + +myname = sys.argv[1] +theirname = sys.argv[2] + +imfirst = myname > theirname +if imfirst: + fn = "/tmp/" + myname + "-and-" + theirname + ".txt" +else: + fn = "/tmp/" + theirname + "-and-" + myname + ".txt" +#if os.path.isfile(fn): +# os.remove(fn) + +def handler(signum, frame): + print(Style.RESET_ALL + "Ctrl-c was pressed. Exiting...") + exit(0) + + + +signal.signal(signal.SIGINT, handler) + +messagenumber = 6 +leakerslatestratchet = 0 +otherslatestratchet = 0 +mylatestprivatekeyforleaker = 0 +mylatestprivatekeyforother = 0 + +def otp(plainorcipher, encordec, key): +# plainorcipher is the text for plaintext or ciphertext +# encordec is "enc" to encrypt or "dec" to decrypt +# key is a large integer with hopefully enough key material + if encordec == "enc": + sign = 1 + elif encordec == "dec": + sign = -1 + else: + return "Bad use of bad API" + keystream = [] + ki = key + while ki > 0: + keystream.append(ki % 26) + ki = int(ki / 26) + whattoreturn = "" + for i in range(len(plainorcipher)): + letter = ord(plainorcipher[i]) - ord('A') + c = (letter + keystream[i]*sign) % 26 + c = c + ord('A') + whattoreturn = whattoreturn + str(chr(c)) + return whattoreturn + +olderlatestratchet = 0 +olderciphertext = "" +ciphertext = "" + +while not os.path.isfile("/tmp/oops.txt"): + if os.path.isfile(fn): + fin = open(fn, "r") + if fin: + newotherslatestratchet = int(fin.readline()) + if otherslatestratchet != newotherslatestratchet: + olderlatestratchet = otherslatestratchet + otherslatestratchet = newotherslatestratchet + flog.write("ratchet") + flog.write("\n") + flog.write(str(otherslatestratchet)) + flog.write("\n") + newciphertext = fin.readline().rstrip('\n') + if ciphertext != newciphertext: + olderciphertext = ciphertext + ciphertext = newciphertext + flog.write("ciphertext") + flog.write("\n") + flog.write(ciphertext) + flog.write("\n") + fin.close() + time.sleep(0.3) +oops = open("/tmp/oops.txt", "r") +mylatestprivatekeyforother = int(oops.readline().rstrip('\n')) +oops.close() +os.remove("/tmp/oops.txt") + +fin = open(fn, "r") +leakerslatestratchet = int(fin.readline()) +newerciphertext = fin.readline().rstrip('\n') +fin.close() + +# We can decrypt one message already +s = pow(otherslatestratchet, mylatestprivatekeyforother, p) +plaintext = otp(newerciphertext, "dec", s) +print("Eavesdropped " + theirname + ": " + plaintext) + +flog.write("stolenkey") +flog.write("\n") +flog.write(str(mylatestprivatekeyforother)) +flog.write("\n") + + +while True: + # Wait for the other to update the file + while os.path.isfile(fn): + time.sleep(0.001) + while not os.path.isfile(fn): + time.sleep(0.001) + time.sleep(0.3) + # Read the info and delete the file + fin = open(fn, "r") + theline = fin.readline() + #print(theline) + otherslatestratchet = int(theline) + ciphertext = fin.readline().rstrip('\n') + fin.close() + os.remove(fn) + # Do part of a key exchange with other, decrypt if possible + s = pow(otherslatestratchet, mylatestprivatekeyforother, p) + plaintext = otp(ciphertext, "dec", s) + flog.write("ciphertextforleaker") + flog.write("\n") + flog.write(ciphertext) + flog.write("\n") + print("Eavesdropped " + myname + ": " + plaintext) + # Do a key exchange with leaker + mylatestprivatekeyforleaker = secrets.randbelow(p) + mylatestprivatekeyforother = secrets.randbelow(p) + flog.write("keys") + flog.write("\n") + flog.write(str(mylatestprivatekeyforleaker)) + flog.write("\n") + flog.write(str(mylatestprivatekeyforother)) + flog.write("\n") + myratchetforleaker = pow(g, mylatestprivatekeyforleaker, p) + s = pow(leakerslatestratchet, mylatestprivatekeyforleaker, p) + # Reencrypt and make file + ciphertext = otp(plaintext, "enc", s) + fout = open(fn, "w") + flog.write("ratchetsleaker") + flog.write("\n") + flog.write(str(leakerslatestratchet)) + flog.write("\n") + fout.write(str(myratchetforleaker)) + fout.write("\n") + fout.write(ciphertext) + fout.write("\n") + fout.flush() + fout.close() + # Wait for the leaker to update the file + while os.path.isfile(fn): + time.sleep(0.001) + while not os.path.isfile(fn): + time.sleep(0.001) + time.sleep(0.3) + # Read the info and delete the file + fin = open(fn, "r") + theline = fin.readline() + #print(theline) + leakerslatestratchet = int(theline) + ciphertext = fin.readline().rstrip('\n') + fin.close() + os.remove(fn) + # Do a key exchange with other, decrypt if possible + myratchetforother = pow(g, mylatestprivatekeyforother, p) + s = pow(leakerslatestratchet, mylatestprivatekeyforleaker, p) + plaintext = otp(ciphertext, "dec", s) + flog.write("ciphertextforother") + flog.write("\n") + flog.write(ciphertext) + flog.write("\n") + print("Eavesdropped " + theirname + ": " + plaintext) + # Reencrypt and make file + s = pow(otherslatestratchet, mylatestprivatekeyforother, p) + ciphertext = otp(plaintext, "enc", s) + fout = open(fn, "w") + flog.write("ratchetsother") + flog.write("\n") + flog.write(str(otherslatestratchet)) + flog.write("\n") + fout.write(str(myratchetforother)) + fout.write("\n") + fout.write(ciphertext) + fout.write("\n") + fout.flush() + fout.close() + messagenumber = messagenumber + 2 + if (False and messagenumber == 16): + print("droppingtheball...") + time.sleep(40) + + + + diff --git a/hw1.3/ratchet/mallorylog-3.txt b/hw1.3/ratchet/mallorylog-3.txt new file mode 100644 index 0000000..c07c9e5 --- /dev/null +++ b/hw1.3/ratchet/mallorylog-3.txt @@ -0,0 +1,207 @@ +ratchet +16725500843986780859290964241383377689984325029926842324245042174274897077197408155765476159770724364734641657781173489002677390786059065938693970053361057 +ratchet +5242069083042441840139293145015105668941043342886718560897372375238472997785848511731788368786738329759063195317369221671153919277115558622928185763050217 +ciphertext +HPQWQQBMTBYQGJMDQNILIIMZQRSPGCJFKZ +ratchet +18340249256681315960604486279559527229403804985364888315528904824786671045544062872321276835700555134349417889141666988622871098047412096806229255544731366 +ciphertext +IIOJPMPIDCMYLYWVEJYKLEBZLATYKVYNUTDDNERMQBJKHYPOYJNEQNKHYABZYZQOMMSPMYJSXIEFZLGPEHYYQUSUHUY +ratchet +1790228137670895438812322122018891748753687773807511585361447121012119119881011783805564687702663436623344621025914938128827590360706784990912279039969362 +ciphertext +AMSUXEWXMTCKOVWLQLUHEXZRAXUTXYSMY +ratchet +12847475081820443616693277352816870636852348895411123815272692589172122292390147287566741042754159062737658522891587402204655902513198096619671838173811631 +ciphertext +GUHZOJQJSNEFFCHAGBGVUJGNZWIOBCHGGVFYFUKMAEMOTAUQFBZWTQNEUEBYKWQWRMOWHTVIGLNQIOW +ratchet +1900045637829144094469604781411622977934084157788606678211226373737958688079437592874701898766439234359324238679874902927424998973284533979951895848764342 +ciphertext +AQEJSQOCMDFCTMBHSXOGIPLCAXXYOVQLSX +stolenkey +14636432677487680427691020376136988323477173259137562085361994851504349552093729628440722297515442012424868127866461609525527706197919833341816867775573102 +ciphertextforleaker +GPYHXYPSNACWINXZKBKQIUDCW +keys +15746499221924466697632020508537852207275489660674221612465594041100176568471508671793215481007776581547311994745226296201151862598485359006574764120410698 +1091673800787212636612767598864527246860219492217415957273710927596680086630801672923254538217117838278408511024704026629967443407884251473354418686526997 +ratchetsleaker +21107907938610721958429509363784217763391049266475165461258520116008641978015151699517662649590146322039043597148794687043290773049946313646553474753430345 +ciphertextforother +JOTWRQQBADYXGNWFQPSMBCUMYLWKBRDENWTAGRXISTRSNAPINJBIFTOBCFAJCTIQIHTGPKNIADQRO +ratchetsother +16063763874924191707634541225536059129834113196645807222522102723439227523598956846045906796061922333884535846801583648991837971761941279549272330221274745 +ciphertextforleaker +WKHXAQGOKWJLQBSRYKBZMRCJSJQV +keys +16807206118628667381951400878321655855391620856978852823865569248541980093095815139674611840723036731911053649790828312336413563276844360348140203074486113 +14733529546324596645308210296817256629975023662798537035188780133319721629014462385000649685768084769244804362833137841105703103240374646464638399916538301 +ratchetsleaker +6424818556520927126597045343197883742968081188847027979794545169691598273769496707941129868930108429262527581433439486396375110205505072711046943991159194 +ciphertextforother +EYHJYVENKWBYWIFHIWSGTENQMOAEWHAUYG +ratchetsother +5390006009827328168675903345712284832027356420136667109293505796159536380706519308705509687040801838397419750401030571510341695976507817857530204612744709 +ciphertextforleaker +HTYMOTCIQKFQJC +keys +18876936488753724234417515518173304065477980337905012234486031004063726923912805635864879156224848420362058265392616097501467566053786106456615235745957549 +5486647552548306973205772603625927064084803550655663756551553017498272562656088836605647502785414192749799992541526863442797373650490930596626712238624996 +ratchetsleaker +1798101015683717838795772149433371764074564379226653954873987034584838033246458110146152122712473454380438358532493789498016902489595862287686493475911134 +ciphertextforother +NQJOFQGXJKLCVWNMLUFGNAWRGANWAKRKNNSMJTWFEJVIHIXEJAHOILOZKWX +ratchetsother +15497151221995556984369691407291504999145025102427719518820574044020482051015947001396233195254721832072918143968515743575878903583529490389881927631156543 +ciphertextforleaker +EYRSYUKWEWJJYLSPAWAS +keys +18043763569234412684714233016263796138750338205829751940278667533526226111033103835056939382933546292561312325124183659901086585016234323998491192552407491 +3443354882545669452695694510427192825344468745506455417082818159960826133209889487686383085980562253910788578885127995888003341935505130718975633395234970 +ratchetsleaker +12611832578647867843426861204583029720343936842281316900591754706988481143409804434606474083412731924032117018820421893294222923157424745215711139332286419 +ciphertextforother +FWPSWTGQUVGASZZKPGHCJPKZJGIBWERXGPIYXE +ratchetsother +888396531074933109085112887443949943187410223697559880838510733962365216465430678501270728442458185375938485894507759207264873831938785033335231781633375 +ciphertextforleaker +CIBZKOKSGOVXWBGVSTARWMOK +keys +5288930278738206287343353232894577726022520348082076941743686647064737433772438546048340158851781113129763848805679096641692659457813828562037234149996197 +19783378463183105387661060994862549079971408984443051806731175378638064357752464096611224598010471173817648174921317550575019987379005143399774532614687041 +ratchetsleaker +1119791986503575585125734446840229315973559020700550834717242483861703761107296749719898496778748448473682139406942978478114119705372719779672343043115757 +ciphertextforother +KIQHILQVOGHYUFICACILGIWWZNEEBTJWWYUEFONWQCMOBYQMJFXOAAQNN +ratchetsother +17965113382391334154628776902785005179079238724108956067485969922843472372986996126434729147219354481732012494875948392662983925387553800768584631620968499 +ciphertextforleaker +WOHKGYSSWLRFKYMU +keys +20169405904596505099316231377703889019320483219494628778042125180319633262446676559227460376928475827201689202943293642552313683573366914102653569607393647 +18005033887503133368725503231914954602911529658755229705678696564678031726619551865139441294244729503950593733845357002566376343314190618701773269784249445 +ratchetsleaker +15151765594273531099267253149378623985917473169728685398700687135605545656441002913592386065142484121688296754952564078350897984749980833841115557665014098 +ciphertextforother +XELFSOMBHYBARNWBIGUQWUONCNNKDWUHOZAWRJYHQ +ratchetsother +18592391146545106519873954759830518270929314490472209653914218035989825175523917394609437124045143503463070108257521358764304606762483964703612704755246988 +ciphertextforleaker +FTYYANIUYGDIBXFKIYC +keys +16154824429628924834388608894065821553046721094590779463027194126895799723160191128983246600864339570382447245318125082915750568401456864565237167840557081 +21390197296074030970266242942015531652438000194346439791597768529287622072803436268619188397322027423801621342086916716168979599532875743351360427840967281 +ratchetsleaker +14055430202501311474455051650182283184565749390956065686078373194093310802058542545051949988835549027044052244039648828496758209327496113206962118365734066 +ciphertextforother +GMJRVEHYKOCEDWCOWATKMRFWK +ratchetsother +7824024691792427896802181935403689899564216196138644515167820810337076148989248036524892701390263155716913952802157026608031605975530506557269731797968288 +ciphertextforleaker +AITWPYDQFOPYOWMYFXDGMME +keys +327592160195393230341889989688821639380805771938594560327252966322396483160850525533396643358742293852849597707094828893625516277694019049650506844311624 +16150835621620268289440676504102601700160368198928981261379023356924980131799476900461169468882233515709849876830882612144238609090133744258640848390530761 +ratchetsleaker +21199545924897386863337634664622531723777695839428175723862400869444565198073371263735808670166664924986804713031849825815818944631182888750018431191357452 +ciphertextforother +SMXMLQVUGIYXALOPCWQ +ratchetsother +6352699698673492174291154604230978615366985838413432008243820133560814897318230966641147629582414251365040134631727790387874608158484456503997223663918286 +ciphertextforleaker +FRQUNYSLYQAWKEFIFCYHXYF +keys +14305382909830717891000216545676341552371807977045506646658220390640988738913571676461634403723416439588501121433070359521104429343340617392022285157646718 +14744774724591852174347115548078319301839962461836642429462348888601787195094047026427078299732974502903127143964150457551336164311067427862806639494429795 +ratchetsleaker +15609192624998924777338927352444842920201465698254053330102951061842341181689992035922155613971595549007510085022429960349532371332941358145842553065182832 +ciphertextforother +JCYYHOEOOPKXIMXSFQEPUNZKQYMPRAGLXGZE +ratchetsother +19362223963295894250429870729350452971912947338220003094495890179575539409812751447729085062071299865552997827535018076396185501559869596749856579792468722 +ciphertextforleaker +SDUAODAYMEOABCFSEBPMHZBYSGM +keys +4137708380292074331694548764780255846479770360462378176423782847678557716633347223962593170528068187129293965224946705949906055453920876869955777473925970 +18514407092933096763045004164449025166296597330948587611549396634685938786939840812068599022095630843057663345472785765080084727418780590320350634909735441 +ratchetsleaker +10121650152451840009502901522423318409616880111359989801513720395736142042908893269897509176657458794297694073368932262134650136586189273057466303599664406 +ciphertextforother +VCFTOOCCSCLCKQHAFLYJVHYTGCTNQKWSBEXTOEMCBCEM +ratchetsother +11663500104490452916270094684153842432434885876861631791376786005549006294262778642822037029370505160193859287552796345915846855193877126067588819768065664 +ciphertextforleaker +LORDMYSYSKFHSJUJWAZBAJSOYK +keys +20556368891220362190895892502960498402917168193475106878360325282488718501841265350897338125634037698861804183814891013402145330334550212390130110552716602 +3960970388297608478622749140626481527748745515384462792479464171794434689727879089580029154188017897443644246504398123828002525433825617558490162515995388 +ratchetsleaker +2359667490619758686637979988793765197808739173607752456443132510135313217329999104085324156213539598542837835242623657663401361952651650965515876264491753 +ciphertextforother +KELZMKTKHIRCRKRIMKXBGGEQTGHUZLJKVDYJCG +ratchetsother +4548820471954604019628231242251692308778770022214071214001903696046090865774502335540816251886694537487438741872533168326210239510968961452270587081387870 +ciphertextforleaker +ZSBISQJUQTQXCIYLYYAKLGTVBAUCA +keys +10496526991690032042088911822259329017384445920953444274714726032074642977851354713056462857847132423825578322795021979610972359504714992240005518725099552 +18940717639566014085592838673834065008912716037123494728232507223728260560646591230882219536855792578951827626257630806604432391352611350111492124757639646 +ratchetsleaker +1229691777987689310535240264779748993769662290766491819243347564502299487954373491191166469738462009297863657504418906704896947495030006843714814113694425 +ciphertextforother +NUDTKWOGHIVKQTZDABZEUP +ratchetsother +19419066822889387405878501018663136155613968606043309635882739193649767663385999309032097842609640422871302477921814798697686044932551552455905265884227631 +ciphertextforleaker +ZTGASUCCBQTKVQFVKQGIDI +keys +654878039679708581864082175751532470091483368661642334077394484883609673244458613729135375939482449371712049946089110732165604487947441327710790871814257 +20959071506017395017871585784931315962786014638367068313176165088166885536941834077956935894437857788087221939812570951163391754757369916610685240255125075 +ratchetsleaker +13734009597763592799696182857028193813093031150106659501862810394777210703313601814817161102721448910056326884637470969187711920394802790671037020667157965 +ciphertextforother +SMCNQJIVKMTCYVAMEYGRLFWPBUWCMFMYBMDFZCISCJZ +ratchetsother +19161614866134927481134458844519709161960277516154463917696261199698903743173630541054880485812385041081753316938792787706626668508883131061359623450968773 +ciphertextforleaker +WUEMXILDCEVAQRUZGKCFE +keys +16531937820068368968723188035003329249107742135502524520362186536574700226864233708838722290658031124417276643517872724892556388316014822612910976154557779 +11535485793024480429665121089535716387977296510672048244700386253068051865347852403749643856505725497090390928817162450530045208516692935793483743738419818 +ratchetsleaker +2952021808157156832634451530888146701178803371567774463162791204604784932827987095522806898475873140886779477023302813665165478283662909600383976194396211 +ciphertextforother +CWPYTULPZOQPDQWNFQXITXKVOHROOTKKOXCMYQBWPRRAEAVQPGUWTEH +ratchetsother +4811278246889601321559115146472798376266255384872726589372185201538219080092350617551952205800776858088260330242915745047537792278205021035413686318431237 +ciphertextforleaker +BUPLUCUXMVNMZACQDQPJBQESO +keys +12594787680053129228764084769984201399980050344448326504935327483212413185468777775625263391446680555049708949644058874968289967099084492523895752287097422 +16482023115697771811902759828865415254594602798888260276013262926820836700810556174558133008430505835209788500691592457068924793035759211393027373200622855 +ratchetsleaker +16033097375518533144156206797693823151068585702752517346006662223897971268964649659276313233712810709336978540232487637046654754185460135374263288301014079 +ciphertextforother +RKDBQEKLXPAHXWKCJJZBCHROIJKKKUHBLJYXMEW +ratchetsother +10334713464494709118421649170183720479672635798933466658805323968421944215308440772937465245473390813410431842644588045650549086951692410831670341411493373 +ciphertextforleaker +LYZLWDIKTGHXCHIQPSSCWGMGXBOXBAW +keys +13079410331758372691821052682674979488465495616417149097162677713242167256543775864244096912455150034741067842777231504530547771763653965086981141981597471 +213339620293115389578666205490118843156504258574968386467279100611181524830109587551560973054314591282246221819054197455038391314030263065753935823779542 +ratchetsleaker +11021794516434669480450729035659261334580071488599056875030005286802581711470911612589270983046212028345317390673049278989516822145122526902843715635905051 +ciphertextforother +LQDWYXYIVYHCFKOGKSIVGRQPAPVLIZWIVXXKEFW +ratchetsother +478393942604435301890794729766445921449031654630030707990015924098111346476388094134804928338782867752787440831842627050734920592648807597272558244544396 +ciphertextforleaker +EIJVOYASVA +keys +17028509889608467202760601350541455924182595341977255717719789153497309401872519593593301498789304180581191931640216728376624594909486992255970857588789240 +14300098506993097354291341486022017455499857448220079905334870651909810834776862156420529422913447181273003002623969166527512233564359169002312638822819984 +ratchetsleaker +19423854541342631079257971474024571375486931730843549463539234413497022894596713664430242639894031247401438256084610307987099143073725749050219185210402917 diff --git a/hw1.3/ratchet/ratchetness.py b/hw1.3/ratchet/ratchetness.py new file mode 100644 index 0000000..2f0ffa7 --- /dev/null +++ b/hw1.3/ratchet/ratchetness.py @@ -0,0 +1,118 @@ +# ratchetness.py, a simplified form of OTR for spreading ratchet gossip about your CSE 539 instructor +# jedimaestro@asu.edu + +import secrets +import sys +import os.path +import time +import os +import re +from colorama import Fore, Back, Style +import signal + +g = 10697987386528634556132351984988679277669693771233806587823166397646257882356751154924044166012048802718827287365490918762116743604708315476073224232944329 + +p = 21395974773057269112264703969977358555339387542467613175646332795292515764713502309848088332024097605437654574730981837524233487209416630952146448465888659 + +if (len(sys.argv) < 3) or sys.argv[1] == sys.argv[2]: + print("No! RTFSC!") + exit(0) + +myname = sys.argv[1] +theirname = sys.argv[2] + +imfirst = myname > theirname +if imfirst: + fn = "/tmp/" + myname + "-and-" + theirname + ".txt" +else: + fn = "/tmp/" + theirname + "-and-" + myname + ".txt" +if imfirst: + if os.path.isfile(fn): + os.remove(fn) +elif False: + while os.path.isfile(fn): + time.sleep(1) + +def handler(signum, frame): + print(Style.RESET_ALL + "Ctrl-c was pressed. Exiting...") + if os.path.isfile(fn): + os.remove(fn) + exit(0) + + + +signal.signal(signal.SIGINT, handler) + +messagenumber = 0 +theirlatestratchet = 0 +mylatestprivatekey = 0 + +def otp(plainorcipher, encordec, key): +# plainorcipher is the text for plaintext or ciphertext +# encordec is "enc" to encrypt or "dec" to decrypt +# key is a large integer with hopefully enough key material + if encordec == "enc": + sign = 1 + elif encordec == "dec": + sign = -1 + else: + return "Bad use of bad API" + keystream = [] + ki = key + while ki > 0: + keystream.append(ki % 26) + ki = int(ki / 26) + whattoreturn = "" + for i in range(len(plainorcipher)): + letter = ord(plainorcipher[i]) - ord('A') + c = (letter + keystream[i]*sign) % 26 + c = c + ord('A') + whattoreturn = whattoreturn + str(chr(c)) + return whattoreturn + + +while True: + if (imfirst and messagenumber % 2 == 0) or ((not imfirst) and messagenumber % 2 == 1): + mylatestprivatekey = secrets.randbelow(p) + myratchet = pow(g, mylatestprivatekey, p) + s = pow(theirlatestratchet, mylatestprivatekey, p) + print(Fore.GREEN + "Sending... " + str(messagenumber)) + if messagenumber != 0: + print(Fore.GREEN + "Please type something juicy... ") + ratchetgossip = sys.stdin.readline().rstrip('\n') + if len(ratchetgossip) == 0: + exit(0) + plaintext = re.sub(r'[^A-Z]', '', ratchetgossip.upper()) + ciphertext = otp(plaintext, "enc", s) + + fout = open(fn, "w") + fout.write(str(myratchet)) + fout.write("\n") + if messagenumber != 0: + fout.write(ciphertext) + fout.write("\n") + fout.flush() + fout.close() + messagenumber = messagenumber + 1 + while os.path.isfile(fn): + time.sleep(0.1) + else: + print(Fore.RED + "Receiving... " + str(messagenumber)) + while not os.path.isfile(fn): + time.sleep(1) + time.sleep(1) + fin = open(fn, "r") + theirlatestratchet = int(fin.readline()) + s = pow(theirlatestratchet, mylatestprivatekey, p) + if messagenumber != 0: + ciphertext = fin.readline().rstrip('\n') + print("Received: " + otp(ciphertext, "dec", s)) + fin.close() + os.remove(fn) + messagenumber = messagenumber + 1 + time.sleep(2) + + + + +