From c379b8231890e12da46e318079bd45a93baaa7dd Mon Sep 17 00:00:00 2001 From: mirai Date: Sat, 2 Jul 2022 23:52:54 +0300 Subject: [PATCH] Crypting: Add rsa crypting. Add symmetric keys. Mvp is ready --- client.py | 52 ++++++++++++++++++++++++++++++++++++++++++---------- preview.png | Bin 4435 -> 23579 bytes readme.MD | 13 +++++++------ reqs.txt | 3 ++- server.py | 23 +++++++++++++---------- 5 files changed, 64 insertions(+), 27 deletions(-) diff --git a/client.py b/client.py index 952c331..b652c7e 100644 --- a/client.py +++ b/client.py @@ -1,11 +1,24 @@ +from cryptography.fernet import Fernet import threading import requests import time import rsa import os + class Client: + def _key_gen(self) -> None: + + (pubkey, privkey) = rsa.newkeys(512) + + with open("private.pem", "wb") as f: + f.write(privkey.save_pkcs1()) + + with open("public.pem", "wb") as f: + f.write(pubkey.save_pkcs1()) + + def __init__(self, username: str): self.server = "95.165.158.131" self.port = 80 @@ -18,6 +31,9 @@ class Client: self.key_url = f"{self.base_url}/get_key" self.pubkey = None + self.privkey = None + self.symetric_key = None + self.fernet = None def send_info(self): @@ -26,7 +42,8 @@ class Client: user_input = input("You're message: ") message = f'{self.username}: {user_input}' requests.post(self.talk_url, data={ - "text": rsa.encrypt(message.encode('utf8'), self.pubkey) + "text": self.fernet.encrypt(message.encode()), + "username": self.username }) @@ -39,27 +56,42 @@ class Client: continue last_try = r.json() os.system("cls") - for msg in last_try["status"]: - print(f"{rsa.decrypt(msg.encode(), self.seckey)}\n") + if len(last_try['status']) > 0: + i = 0 + for msg in last_try["status"]: + actual_message = self.fernet.decrypt(msg.encode()).decode("utf-8") + if i == 0: + users = last_try["users_in_chat"] + print(f"Users in chat: {users}\n\n") + print(f"{actual_message}\n") + else: + print(f"{actual_message}\n") + i += 1 def _key_request(self) -> None: + with open('private.pem', 'rb') as f: + self.privkey = rsa.PrivateKey.load_pkcs1(f.read()) - with requests.get(self.key_url) as r: - with open("public_rec.pem", 'wb') as f: - f.write(r.text.encode()) + with open("public.pem", 'rb') as f: + with requests.get(self.key_url, data={"pubkey": f.read(), "username": self.username}, stream=True) as r: + message = r.raw.read(999) + self.symetric_key = rsa.decrypt(message, self.privkey) + self.fernet = Fernet(self.symetric_key) + def _remove_keys(self) -> None: - with open('public_rec.pem', 'wb') as f: - pass + os.remove("private.pem") + os.remove("public.pem") def _validate_keys(self) -> None: + self._key_gen() self._key_request() - with open('public_rec.pem', "rb") as f: + with open('public.pem', "rb") as f: first_key = f.read() self.pubkey = rsa.PublicKey.load_pkcs1(first_key) @@ -80,5 +112,5 @@ class Client: if __name__ == '__main__': - c = Client("sneaky") # input("Who are you? \t") + c = Client(input("Who are you? \t")) c() \ No newline at end of file diff --git a/preview.png b/preview.png index b7d72ee7537db5c0f565610f1cdd85e37a28960e..bafeb5226bd20e1bc971360cb56aa9faa18e1104 100644 GIT binary patch literal 23579 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

bO_=DX!0wW?3P z+Yo53^KsfSWMB>?HwtI^?h8v2=+~=$Q~||fqM^M|(()qlVk!%1ZzCr|iuyi&^=T7A z`X$kwx1M3#R?^Y&UBWdH9_=^k8{B5&)bsfyNH6|D_+}tM5Ro{E?{SX>&6;rf z?YNJi;G01+YGaK{HbIY8yJKSbgM#3}H?-9;kXrwj>y6iR_Wjpn%^|~iSmfQqo(xd{ zF50_gN9!>ivf{0oDlGjvTu!mUUan_v0vfN9PQcFV1bjz%=sBeC59rQx4<_Zi33dy0 zGzR+U>;AmoM_@jd7~E4#w42cdA08lhk+k(>(4ffkH)u$LM`zUkDU-{^l-bLK%!WO*F7YIk(q@z`S|2nrr7=yEy{xsy>QAad=B9N~&VlL$y6upCK1 zT#sP}L{#KRI8ve<1IT?xh!h1L2|euh}>-YWqzQ130-~@LA%emI0B{1h!5;c8*=W-3f`ITqEp20(Xv#sx9G0mQ*5_>KT zg7DBl72Ub-?VWR#9<{>$F%H$|KJ!jy6jl;H&in{z9@oQ&h4`<$Ua(Ro!Q02yS&(}f z!Yg(`?M5frPX_iu0uQUF$j1$y4&}w*ZwIho7y6KUtf1~4zU|j&5Gw0_*1GB-ep#g; zn|+VxqMc6kE35E*tw6*KMFm%xcr;tSY`wJjoOO8bLPk-(jhF7rqK@<7j>33_K3=Up z8fMrOxo+Px_Jx)sm1G7pAUW9P#E62&iEo5vQlGbf^&bh_*8-xFx@dvCvbZw31z->rX? zIWIe8^(2I_aZxp4)t}v4*-%D->zdN4nKv@{!wciIw z#7S&>nOPJ@`suyj6nqfqB&XfPQ7#(`4Z&nT^~IrRYk+=*d%C@MbQys+ozc`%F6Vt& zbb+9P?{_OBT1&-%hNhGPZ*vdxBJalS9QG^O!&}_$;zPL`I7HK9gNaAeDsL01ThXPQ z55oiK($foii%D7Vuer74o@5>#18NfW*T2irAGBwTZ&H$$T@M7|7Y7&-}f@ zU1%anFnbVl!SeNzu!aOB3*+F>FK1zW4>hXwXS^@5`&Y9ZnLmgoy`M& zw{*?BMekRDyr(3fs?`=F*t)ti!G%3{0(s^8PTXI6(xt2iDaD)!wAk97uhzglDvdkU za+-TRX~^Lvm2P1lZKox4_BEAq#BioEqYGD)JUPkZI7vYVf6_R^!M4dy288D^s>c}x zks~eKp?TTckh`y;aSJmoo)5FjI4jpS1H<$3#ESBZaE8t`o zZ5OKBnNnRRuvc0Gt1us_Kh^BRjw`W=KMLT1_gr+2$Zb|cr3xM+Ebuf>^K87}w5p-B zZc(s_7s;(R z6Hz5FC9WU5{?Ta*r;HJp(w%BxtZx=PJ671q0ZgY4| z;vPxN?Djxv>p0gloFea%eHw&wb z?{c0)uMI*(2RcDFqxzracTUWFFm{U+mnP#Lv*OT@%;e`Fq*0q!(i&DrU2P8kL@sX! z-SWnW*N&P)wCC8el<2Olz$7W`&pqWXWRSgW>1Q!DSs)@Ln=aO$yp;}+RyPO8EI>t< z?yh_U6(a$qA4yD}A0Z&lHPS5UJfY^d)h{UT}S8AC;l?h}*4F^Q``EPRHu) z6vSO1dM%c>K0DesjqwKVthxBdSvphS17E-hM}t!8ryiigxERjwkSfnRR=HJwD0MVz zEDqX16ACzumNgMN?bQ;p%btR=sIteb#VX26Le`*~(K~XS@=ofK3sLkit`I(zHziS9HwO2o-%Nr!bjO-5%G8>l z?AKxJ)e^x?%TRGCD*>hO zV7MlvX5j!$g1B>As8H!EfmxLA$P53ftw-jWxYubhOT^I0iQRXI)D8i#8PoO literal 4435 zcmeI0dsNcd+Q)xXgH3svnkI)bY35kk(QeX+SE$U?Ow2s5j%i{^G9E=z5hb}eHH~!~ zvox=W_Kr=SnJ$($)C4t04HY;_<^=>4kugCM5;Q;#^S<-0_xzw&-{&?12>)C7V zy`S&i&u2e--#mi~wAr*{6951|2 zQnz*IHr_`9&w{+mxi8mUbUrq|bvKa|eC)&9kJn#xw%_*k_)&Y<+ill3c&(p69Bn!7 zz18Q#n~b7!Rn`~>FfKuEr#6JZuB|(=zu@a>K{^;L4g!OxH(OiB4u6!D z3raqG=w7h3vn8zbagT3mp@EH-U_ZPZ6rBM8TM54!NSp}G27r$~4L)(~FWFV9DP+n{ zY<2&1y&Z@MN}WCxRdwNL^3kZDZJ5#0@gK4NW1AvJf2g?|-s_>v_{1(;mDJSi6F1nG zMEGFm2OvVh&UN$YAM6X+wkO(biZJ@-=HE!*`8a+C<#rql90d0(Y&j>C*>>k4-!L=oU59Sft^w7ztZrytki7@sJ;95&tsN&Z<@nNO z;jZR+yeOTXvulLc4-K#9fw|A&4{DXx&aP-5MrSqFdy;cG^X!ovLnx|lA0OA~b4nF|8qNx^-g5?i08V|mYe;NGt)G?bGSJh(uDG{lV^lDs4e!)!}sUgbXsaPE_S z$anSjOK(yx8BY3mCc{ijg??F8A@lar71L_+3r&v7TN>i(dchm^fMq`s zPKQrowPk2&wB!7N-4L3!s5FzQue#jbmL*ML}iv>P^?R==GsO+ z8L>CCOUFU2uLK2}S(pA`4@24cg5?I*XmFyMKXtWw_7_i1Uw+A#4$#N1)7(WIX&-Ij+9XWIRT>n=ex*Uhk(p1+84A^m)mj@2G<~ z9GE+8z)eycybIe(6bvW2sVUz+iVMZw&4W571-d$##|sPB6h%=Un(xb2?j7!`^P6^Y zcFq6xO3nnnJ>N^9#CS$i-_5P;zP9XK=3Dt#!N9DIL(M;?DL40fZN=m!lf0SrS?GG- zJt+RTH9FbTKGOx9D4#BOG660bNF{B-POqo9I}+<`-h1 zskt{Y-+nP+d3luQXy~cLtfZDo;0D(W1B-X31V`UnS3_d+JRopVF?59Li{_}13Y)j` zD>{vQu%tht^UCs{JB^wUszJq!VawV^NN zkNWAIny1~zRR>m%G{On=N7Zso*RRei_8F=4w@vk!V|tg{f{ z?5tN0I@9>F4W2TXn2i|9BNeUYIZ)Zh-sZtkFwd863_|Br2ws&b$ve7h?(XWk?*u4C zFxFML@E>3oS$8U$HtE#E$XD-)^Mzg+-v3Ig9n)@34c9d=C9{NcZ$%!@Ynx03rvrVw zc65Z&v=f@^F+-VpU4w*>;k}+ToXz{ruw7f6AM^Jz6H7p=h4R%4m=g;8F+H14)iO8t zcX-rH;znAy^QCZvebfTQ98uY6l9VV|dQ(`^nu!LR^cs-DRbrR?SaA=StGk1twG6%U2<;!C+)=@K1PBu z^6{ciaG%PO>J6Ff4oh}~q<(UfGrUw`esc-m8JcspR-B)LskX!J4UCFp7fP@#?$v2* z!(3$o`;is;pVc9r@`^Bk3ZVI)NjvS`VsEyRowpP5NaA78+eFcfu5| zS#!N4Wk^QW&;67E>dN%}FOm{U^B=Wysk(;ZY0PSPne3sXLmCZrwd4K0yYkO}uo{>2 z<;Si4$y_;MP^Z6Z=jwbE;hTlX zZA?}Pui`rD|6(||6bV$F51kSYuC?_SPziaXW6p**1jBq{+nE$2q7el*r8;Zv##kse zr@TyBccV z(sC}Jd~r{Wpoojz5N}53WDrIeY{!?;Hog>o9Gl#x$$k@6A15zEQ#trf6LFB~OBuh0 zMQ2D3P`h5rTHkl?2eP6xx-S6o%@YvdZ`n`13Zp#hD`(i+`xM$?GwQJ^_r=qU5{9vx*v8 zoMCbdO`}MjgL07$8UJD(D>A4fbkB=HQsUwl13lAk5fWQ~?V{fco@d@mK!|Z*IG% diff --git a/readme.MD b/readme.MD index 7fe08e5..c34d034 100644 --- a/readme.MD +++ b/readme.MD @@ -1,4 +1,4 @@ -here is simple online chat what can be runned in cmd +here is secured online chat what can be runned in cmd ![preview](preview.png) @@ -16,11 +16,8 @@ how to run clear client * pip install -r reqs.txt * python client.py -to do -* rsa - -potential crypting pipeline +crypting pipeline * Client making priv key * Server making symmetric key @@ -28,4 +25,8 @@ potential crypting pipeline * Server crypting symmetric key and sending to client * Client encrypting private key * And than communicate with server via -* symmetric key \ No newline at end of file +* symmetric key + +to do + +* interface for choosing server in client \ No newline at end of file diff --git a/reqs.txt b/reqs.txt index b70bae6..c4277cf 100644 --- a/reqs.txt +++ b/reqs.txt @@ -1,3 +1,4 @@ sanic requests -rsa \ No newline at end of file +rsa +cryptography \ No newline at end of file diff --git a/server.py b/server.py index d5f59c6..8d77610 100644 --- a/server.py +++ b/server.py @@ -2,21 +2,17 @@ from email.policy import HTTP from typing import Any, Coroutine from sanic import Sanic, Request, response from sanic.response import HTTPResponse +from cryptography.fernet import Fernet from sanic.server.websockets.impl import WebsocketImplProtocol + import rsa app = Sanic("app") app.config.OAS = False actual_messages = [] - -(pubkey, privkey) = rsa.newkeys(512) - -with open("private.pem", "wb") as f: - f.write(privkey.save_pkcs1()) - -with open("public.pem", "wb") as f: - f.write(pubkey.save_pkcs1()) +users = {} +key = Fernet.generate_key() @app.route('/talk', methods=["GET", "POST"]) @@ -27,9 +23,16 @@ async def talking(request: Request) -> HTTPResponse: @app.route('/update', methods=["GET", "POST"]) async def talking(request: Request) -> HTTPResponse: - return response.json({"status": [rsa.encrypt(k.encode('utf8'), pubkey) for k in actual_messages]}) + return response.json({"status": actual_messages, "users_in_chat": list(users.keys())}) @app.route('/get_key', methods=['GET', 'POST']) async def get_key(request: Request) -> HTTPResponse: - return await response.file("public.pem", status=200) \ No newline at end of file + + pubkey = rsa.PublicKey.load_pkcs1(request.form['pubkey'][0]) + data = rsa.encrypt(key, pubkey) + + if request.ip not in users: + users[request.form['username'][0]] = key + + return response.raw(data) \ No newline at end of file