补充个小知识点:按位与运算

按位与运算是同位都为1才为1,有一个不为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. b'
  18. GET / HTTP/1.1\r\n
  19. Host: 127.0.0.1:9527\r\n
  20. Connection: Upgrade\r\n
  21. Pragma: no-cache\r\n
  22. Cache-Control: no-cache\r\n
  23. 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
  24. Upgrade: websocket\r\n
  25. Origin: http://localhost:63342\r\n
  26. Sec-WebSocket-Version: 13\r\n
  27. Accept-Encoding: gzip, deflate, br\r\n
  28. Accept-Language: zh-CN,zh;q=0.9\r\n
  29. Sec-WebSocket-Key: tPWfDfGthkhhqfY4ZdT1yQ==\r\n
  30. Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits\r\n\r\n'
  31. """
  32. #
  33. # # magic string为:258EAFA5-E914-47DA-95CA-C5AB0DC85B11
  34. magic_string = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'
  35. #
  36. #
  37. def get_headers(data):
  38. header_dict = {}
  39. header_str = data.decode("utf8")
  40. for i in header_str.split("\r\n"):
  41. if str(i).startswith("Sec-WebSocket-Key"):
  42. header_dict["Sec-WebSocket-Key"] = i.split(":")[1].strip()
  43.  
  44. return header_dict
  45.  
  46. headers = get_headers(data) # 提取请求头信息
  47.  
  48. # # 对请求头中的sec-websocket-key进行加密
  49.  
  50. #
  51. value = headers['Sec-WebSocket-Key'] + magic_string # jtl/vockZ8GRyadFVeiUTA==258EAFA5-E914-47DA-95CA-C5AB0DC85B11
  52. print(value)
  53. sha1_value = hashlib.sha1(value.encode('utf-8')).digest()
  54. print("sha1_value",sha1_value)
  55. ac = base64.b64encode(sha1_value)
  56. print("ac",ac)
  57. # ac - sha1(sec+magic) - base64
  58. response_tpl = "HTTP/1.1 101 Switching Protocols\r\n" \
  59. "Upgrade:websocket\r\n" \
  60. "Connection: Upgrade\r\n" \
  61. "Sec-WebSocket-Accept: %s\r\n" \
  62. "WebSocket-Location: ws://127.0.0.1:9527\r\n\r\n"
  63.  
  64. response_str = response_tpl % (ac.decode('utf-8'))
  65. # 响应【握手】信息
  66. conn.send(response_str.encode("utf8"))
  67.  
  68. while True:
  69. msg = conn.recv(8096)
  70. msg = websocket_jiemi.websocket_jiema(msg)
  71.  
  72. # conn.send("123123123123".encode("utf8"))
  73. send_str = websocket_jiami.jiami("hello".encode("utf8"))
  74. print(send_str)
  75. 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. # 将第二个字节也就是 \x83 第9-16位 进行与127进行位运算
  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] #
  19. mask = hashstr[10:14]
  20. decoded = hashstr[14:]
  21. # 当位运算结果等于127时,则第3-10个字节为数据长度
  22. # 第11-14字节为mask 解密所需字符串
  23. # 则数据为第15字节至结尾
  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. if payload == 126:
  33. extend_payload_len = hashstr[2:4]
  34. mask = hashstr[4:8]
  35. decoded = hashstr[8:]
  36. # 当位运算结果等于126时,则第3-4个字节为数据长度
  37. # 第5-8字节为mask 解密所需字符串
  38. # 则数据为第9字节至结尾
  39. #
  40. # b'\x81
  41. # \x85$ 5 len数据长度
  42. # \xcb>\x14L\xaeRxK'
  43.  
  44. if payload <= 125:
  45. extend_payload_len = payload
  46. mask = hashstr[2:6]
  47. decoded = hashstr[6:] #
  48.  
  49. # 当位运算结果小于等于125时,则这个数字就是数据的长度
  50. # 第3-6字节为mask 解密所需字符串
  51. # 则数据为第7字节至结尾
  52. #
  53. str_byte = bytearray()
  54. #
  55. for i in range(len(decoded)):
  56. byte = decoded[i] ^ mask[i % 4]
  57. str_byte.append(byte)
  58. #
  59. 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>

websocket的加密和解密的更多相关文章

  1. websocket的加密和解密过程

    加密: import struct msg_bytes = "the emperor has not been half-baked in the early days of the col ...

  2. ASP.NET加密和解密数据库连接字符串

    大家知道,在应用程序中进行数据库操作需要连接字符串,而如果没有连接字符串,我们就无法在应用程序中完成检索数据,创建数据等一系列的数据库操作.当有人想要获取你程序中的数据库信息,他首先看到的可能会是We ...

  3. 命令行工具aspnet_regiis.exe实现加密和解密web.config

    命令行工具aspnet_regiis.exe,是一个类似于DOS的命令工具,称之为命令解释器.使用命令行工具加密和解密web.config文件中的数据库连接字符串时,只需要简单的语法命令即可. 加密语 ...

  4. 使用EncryptByPassPhrase和DecryptByPassPhrase对MS SQLServer某一字段时行加密和解密

    在数据库实现加密与解密的文章,Insus.NET较早前也有写过,可以在本博客中可以搜索得到. 今天使用EncryptByPassPhrase和DecryptByPassPhrase来简单实现. 在数据 ...

  5. AES —— JAVA中对称加密和解密

    package demo.security; import java.io.IOException; import java.io.UnsupportedEncodingException; impo ...

  6. 通过ios实现RSA加密和解密

    在加密和解密中,我们需要了解的知识有什么事openssl:RSA加密算法的基本原理:如何通过openssl生成最后我们需要的der和p12文件. 废话不多说,直接写步骤: 第一步:openssl来生成 ...

  7. PHP 使用 mcrypt 扩展中的 mcrypt_encrypt() 和 mcrypt_decrypt() 对数据进行加密和解密

    <?php /* 使用 mcrypt 扩展中的 mcrypt_encrypt() 和 mcrypt_decrypt() 对数据进行加密和解密 */ // 加密 $algorithm = MCRY ...

  8. iOS,一行代码进行RSA、DES 、AES、MD5加密、解密

    本文为投稿文章,作者:Flying_Einstein(简书) 加密的Demo,欢迎下载 JAVA端的加密解密,读者可以看我同事的这篇文章:http://www.jianshu.com/p/98569e ...

  9. C# 利用SQLite对.DB和.logdb加密和解密和SQLite创建数据库

    1.最近研究了下利用SQLite为db文件简单的加密和解密 private static SQLiteConnection GetConnection() { SQLiteConnection con ...

随机推荐

  1. mac下已装virtualbox运行genymotion还报错找不到虚拟机的解决办法

    sudo ln -s /usr/local/bin/VBoxManage /usr/bin/VBoxManage  

  2. 7、sraToolkit安装使用

    参考:http://blog.csdn.net/Cs_mary/article/details/78378552        ###prefetch 参数解释 https://www.ncbi.nl ...

  3. location.assign()、location.href、location.replace(url)的不同

    window.location.assign(url) : 加载 URL 指定的新的 HTML 文档. 就相当于一个链接,跳转到指定的url,当前页面会转为新页面内容,可以点击后退返回上一个页面. w ...

  4. python测试模块-pytest介绍

    1.pytest介绍 pytest是python的一种单元测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,效率更高. 它具有如下特点: •非常容易 ...

  5. [Emacs] Emacs使用介绍

    详细,可参考该文档(转载):Emacs 快速指南 - 原生中文手册 C-x C-c 关闭Emacs会话 C-v/M-v 向前/后翻页 C-n/C-p 光标向下/上移一行 C-f/C-b 光标向前/后移 ...

  6. CTS/APIO后文化课游记

    根据ghj1222的尿性,干什么事都要写一个游记划水记啥的...然后就写嘛... 现在是5.30微机课,先开个坑,学校6.5放假,我将于6.5后开始更新本文 APIO回来后发生的事真的特别多...有的 ...

  7. CPU使用情况检测

    改编自:https://blog.csdn.net/Yan_Chou/article/details/80456995 检测命令整理: dd iotop df top psiostatvmstatne ...

  8. day10函数作业详解

    1.day10题目 2,写函数,接收n个数字,求这些参数数字的和.(动态传参) 3,读代码,回答:代码中,打印出来的值a,b,c分别是什么?为什么? a=10 b=20 def test5(a,b): ...

  9. Jmeter 线程组、运行次数参数化(转)Jpara1=4 -Jpara2=5

    Jmeter的jmx文件保存了线程数和运行次数等参数,这个参数可以在命令行中传入参数的方式来修改数值 步骤如下 1.生成线程和运行次数的参数 Jmeter选项中函数助手对话框,选中__P参数,这个参数 ...

  10. POJ 3537 Crosses and Crosses(sg博弈)

    题目:在1*n 的棋盘里面,A和B都在里面画叉 , 如果谁可以画了一个叉后,可以连成3个叉,那谁胜利 : 分析: 首先考虑如果我在玩游戏,我最希望对手可以画出-x-x or  -xx-   ,  这种 ...