日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

websocket的加密和解密

發(fā)布時(shí)間:2023/12/2 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 websocket的加密和解密 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

補(bǔ)充個(gè)小知識(shí)點(diǎn):按位與運(yùn)算

按位與運(yùn)算是同位都為1才為1,有一個(gè)不為1就是0

?

websocket_hand

1 import socket, base64, hashlib 2 import websocket_jiemi 3 import websocket_jiami 4 5 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 6 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 7 sock.bind(('127.0.0.1', 9527)) 8 sock.listen(5) 9 # 獲取客戶端socket對象 10 conn, address = sock.accept() # 阻塞 11 12 # 獲取客戶端的【握手】信息 13 data = conn.recv(2048) 14 print(data) 15 16 17 """ 18 b' 19 GET / HTTP/1.1\r\n 20 Host: 127.0.0.1:9527\r\n 21 Connection: Upgrade\r\n 22 Pragma: no-cache\r\n 23 Cache-Control: no-cache\r\n 24 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36\r\n 25 Upgrade: websocket\r\n 26 Origin: http://localhost:63342\r\n 27 Sec-WebSocket-Version: 13\r\n 28 Accept-Encoding: gzip, deflate, br\r\n 29 Accept-Language: zh-CN,zh;q=0.9\r\n 30 Sec-WebSocket-Key: tPWfDfGthkhhqfY4ZdT1yQ==\r\n 31 Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits\r\n\r\n' 32 """ 33 # 34 # # magic string為:258EAFA5-E914-47DA-95CA-C5AB0DC85B11 35 magic_string = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11' 36 # 37 # 38 def get_headers(data): 39 header_dict = {} 40 header_str = data.decode("utf8") 41 for i in header_str.split("\r\n"): 42 if str(i).startswith("Sec-WebSocket-Key"): 43 header_dict["Sec-WebSocket-Key"] = i.split(":")[1].strip() 44 45 return header_dict 46 47 headers = get_headers(data) # 提取請求頭信息 48 49 # # 對請求頭中的sec-websocket-key進(jìn)行加密 50 51 # 52 value = headers['Sec-WebSocket-Key'] magic_string # jtl/vockZ8GRyadFVeiUTA==258EAFA5-E914-47DA-95CA-C5AB0DC85B11 53 print(value) 54 sha1_value = hashlib.sha1(value.encode('utf-8')).digest() 55 print("sha1_value",sha1_value) 56 ac = base64.b64encode(sha1_value) 57 print("ac",ac) 58 # ac - sha1(sec magic) - base64 59 response_tpl = "HTTP/1.1 101 Switching Protocols\r\n" \ 60 "Upgrade:websocket\r\n" \ 61 "Connection: Upgrade\r\n" \ 62 "Sec-WebSocket-Accept: %s\r\n" \ 63 "WebSocket-Location: ws://127.0.0.1:9527\r\n\r\n" 64 65 response_str = response_tpl % (ac.decode('utf-8')) 66 # 響應(yīng)【握手】信息 67 conn.send(response_str.encode("utf8")) 68 69 while True: 70 msg = conn.recv(8096) 71 msg = websocket_jiemi.websocket_jiema(msg) 72 73 # conn.send("123123123123".encode("utf8")) 74 send_str = websocket_jiami.jiami("hello".encode("utf8")) 75 print(send_str) 76 conn.send(send_str)

?

websocket_jiami

1 import struct 2 # msg_bytes = "哎呀媽呀腦瓜疼".encode("utf8") 3 def jiami(msg_bytes): 4 token = b"\x81" 5 length = len(msg_bytes) 6 7 if length < 126: 8 token = struct.pack("B", length) # \x85$ 9 elif length == 126: 10 token = struct.pack("!BH", 126, length) 11 else: 12 token = struct.pack("!BQ", 127, length) 13 14 msg = token msg_bytes 15 16 return msg

?

websocket_jiemi

1 # b'\x81\x83\xceH\xb6\x85\xffz\x85' 2 3 hashstr = b'\x81\x85$\xcb>\x14L\xaeRxK' 4 # b'\x81 5 # \x85$ 6 # \xcb>\x14L\xaeRxK\xcb>\x14L\xaeRxK\xcb>\x14L 7 # \xaeRxK\xcb>\x14L\xaeRxK 8 # \xcb>\x14L\xaeRxK\xcb>\x14L\xaeRxK\xcb>\x14L\xaeRxK\xcb>\x14L\xaeRxK\xcb>\x14L\xaeRxK\xcb>\x14L\xaeRxK\xcb>\x14L\xaeRxK\xcb>\x14L\xaeRxK' 9 10 # 將第二個(gè)字節(jié)也就是 \x83 第9-16位 進(jìn)行與127進(jìn)行位運(yùn)算 11 12 def websocket_jiema(hashstr): 13 print(hashstr[1]) 14 payload = hashstr[1] & 127 15 print(payload) 16 17 if payload == 127: 18 extend_payload_len = hashstr[2:10] # 834473503 19 mask = hashstr[10:14] 20 decoded = hashstr[14:] 21 # 當(dāng)位運(yùn)算結(jié)果等于127時(shí),則第3-10個(gè)字節(jié)為數(shù)據(jù)長度 22 # 第11-14字節(jié)為mask 解密所需字符串 23 # 則數(shù)據(jù)為第15字節(jié)至結(jié)尾 24 # 25 26 # b'\x81 27 # \x85$ 126 28 # \xcb>\x14L 120 29 # \xaeRxK\xcb>\x14L\xaeRxK 30 # \xcb>\x14L\xaeRxK\xcb>\x14L\xaeRxK \xcb>\x14L\xaeRxK\xcb>\x14L\xaeRxK\xcb>\x14L\xaeRxK\xcb>\x14L\xaeRxK\xcb>\x14L\xaeRxK\xcb>\x14L\xaeRxK\xcb>\x14L\xaeRxK\xcb>\x14L\xaeRxK' 31 32 33 if payload == 126: 34 extend_payload_len = hashstr[2:4] 35 mask = hashstr[4:8] 36 decoded = hashstr[8:] 37 # 當(dāng)位運(yùn)算結(jié)果等于126時(shí),則第3-4個(gè)字節(jié)為數(shù)據(jù)長度 38 # 第5-8字節(jié)為mask 解密所需字符串 39 # 則數(shù)據(jù)為第9字節(jié)至結(jié)尾 40 # 41 # b'\x81 42 # \x85$ 5 len數(shù)據(jù)長度 43 # \xcb>\x14L\xaeRxK' 44 45 if payload <= 125: 46 extend_payload_len = payload 47 mask = hashstr[2:6] 48 decoded = hashstr[6:] # 5 49 50 # 當(dāng)位運(yùn)算結(jié)果小于等于125時(shí),則這個(gè)數(shù)字就是數(shù)據(jù)的長度 51 # 第3-6字節(jié)為mask 解密所需字符串 52 # 則數(shù)據(jù)為第7字節(jié)至結(jié)尾 53 # 54 str_byte = bytearray() 55 # 56 for i in range(len(decoded)): 57 byte = decoded[i] ^ mask[i % 4] 58 str_byte.append(byte) 59 # 60 return str_byte.decode("utf8")

?

my_socket

1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 9 </body> 10 <script> 11 var ws = new WebSocket("ws://127.0.0.1:9527") 12 ws.onmessage = function (data) { 13 console.log(data.data) 14 15 } 16 </script> 17 </html>

?


更多專業(yè)前端知識(shí),請上 【猿2048】www.mk2048.com

總結(jié)

以上是生活随笔為你收集整理的websocket的加密和解密的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。