python实现服务端与客户端加密通讯代理服务代码

代码语言:python

所属分类:其他

代码描述:python实现服务端与客户端加密通讯代理服务代码,客户端与服务端都要运行这个代码建立加密通讯隧道,然后进行代理访问, 加密传输 - 使用AES-256加密所有流量 支持HTTP/HTTPS - 支持普通HTTP和HTTPS(CONNECT)代理 双向转发 - 高效的数据双向转发 多线程 - 支持多个并发连接 简单部署 - 单文件,易于部署

代码标签: python 服务端 客户端 加密 通讯 代理 服务 代码

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

# ## 使用说明

# ### 1. 安装依赖
# ```bash
# pip install pycryptodome
# ```

# ### 2. 修改密钥
# 在代码开头修改 `SECRET_KEY`,服务端和客户端必须使用相同的密钥:
# ```python
# SECRET_KEY = b'your-secret-key-change-this!!'
# ```

# ### 3. 运行服务端(在有公网IP的服务器上)
# ```bash
# python proxy.py server --port 8888
# ```

# ### 4. 运行客户端(在本地电脑上)
# ```bash
# python proxy.py client --server-host <服务器IP> --server-port 8888 --local-port 1080
# ```

# ### 5. 配置浏览器代理
# 将浏览器的HTTP代理设置为:`127.0.0.1:1080`

# ## 功能特点

# ✅ **加密传输** - 使用AES-256加密所有流量  
# ✅ **支持HTTP/HTTPS** - 支持普通HTTP和HTTPS(CONNECT)代理  
# ✅ **双向转发** - 高效的数据双向转发  
# ✅ **多线程** - 支持多个并发连接  
# ✅ **简单部署** - 单文件,易于部署  

# ## 安全提示

# ⚠️ 请务必修改默认密钥  
# ⚠️ 建议在生产环境添加身份验证  
# ⚠️ 建议添加流量限制和访问控制  
# ⚠️ 仅供学习使用,请遵守当地法律法规
#!/usr/bin/env python3
"""
加密代理程序 - 服务端和客户端合一
使用方法:
  服务端: python proxy.py server --port 8888
  客户端: python proxy.py client --server-host <服务器IP> --server-port 8888 --local-port 1080
"""

import socket
import threading
import argparse
import struct
import hashlib
import select
import time

try:
    from Crypto.Cipher import AES
    from Crypto.Random import get_random_bytes
    from Crypto.Util.Padding import pad, unpad
except ImportError:
    print("请先安装加密库: pip install pycryptodome")
    exit(1)

# ===== 配置 =====
SECRET_KEY = b'your-secret-key-change-this!!'  # 请修改此密钥!


class Encryptor:
    """AES加密解密类"""
    def __init__(self, key):
        self.key = hashlib.sha256(key).digest()
    
    def encrypt(self, data):
        """加密数据"""
        iv = get_random_bytes(16)
        cipher = AES.new(self.key, AES.MODE_CBC, iv)
        encrypted = cipher.encrypt(pad(data, AES.block_size))
        return iv + encrypted
    
    def decrypt(self, data):
        """解密数据"""
        if len(data) < 16:
            raise ValueError("数据太短")
        iv = data[:16]
        encrypted = data[16:]
        cipher = AES.new(self.key, AES.MODE_CBC, iv)
        return unpad(cipher.decrypt(encrypted), AES.block_size)


class ProxyServer:
    """代理服务端 - 接收加密请求并代理访问"""
    def __init__(self, host='0.0.0.0', port=8888):
        self.host = host
        self.port = port
        self.encryptor = Encryptor(SECRET_KEY)
    
    def start(self):
        """启动服务端"""
        server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        server.bind((self.host, self.port))
        server.listen(200)
        print(f"[服务端] 监听在 {self.host}:{self.port}")
        
        while True:
            try:
                client_sock, addr = server.accept()
                print(f"[服务端] 新连接: {addr[0]}:{addr[1]}")
                threading.Thread(
                    target=self.handle_client, 
                    args=(client_sock,), 
                    daemon=True
                ).start()
            except KeyboardInterrupt:
                print("\n[服务端] 正在关闭...")
                break
            except Exception as e:
                print(f"[服务端] 错误: {e}")
    
    def handle_client(self.........完整代码请登录后点击上方下载按钮下载查看

网友评论0