67 lines
1.9 KiB
Python
67 lines
1.9 KiB
Python
"""斗鱼专用加密模块 - 用户名密码加密"""
|
||
|
||
import base64
|
||
import hashlib
|
||
|
||
from Crypto.Cipher import AES, ARC4, PKCS1_v1_5
|
||
from Crypto.PublicKey import RSA
|
||
|
||
# 斗鱼RSA公钥(从JS中提取)
|
||
DOUYU_RSA_PUBLIC_KEY = """-----BEGIN PUBLIC KEY-----
|
||
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHfGXRkF+RiLA71KAHOFBaWGBy
|
||
J7M6D3MDAsFHo2JMBDm2Kfj6V3GFMI7B2JQ3qGl0jCk6ILT1jQ+IFhLvLR3cXPaC
|
||
HT5xYa0hzJpMNO3bLSuJhzY5jQNqRMWfbcV4FLB2JBaFfWcY7RWQ2pCE6jjDnMHM
|
||
o2kz+dJoGnZM0b99VwIDAQAB
|
||
-----END PUBLIC KEY-----"""
|
||
|
||
# 斗鱼AES密钥(16位)
|
||
DOUYU_AES_KEY = "1234567890abcdef"
|
||
|
||
# 斗鱼登录页 cryptoData 使用的 RC4 密钥
|
||
DOUYU_RC4_KEY = "7TkbRSEWvVWebXbr"
|
||
|
||
|
||
def md5(text: str) -> str:
|
||
"""MD5加密"""
|
||
return hashlib.md5(text.encode("utf-8")).hexdigest()
|
||
|
||
|
||
def rsa_encrypt(text: str, public_key: str = DOUYU_RSA_PUBLIC_KEY) -> str:
|
||
"""RSA加密"""
|
||
key = RSA.import_key(public_key)
|
||
cipher = PKCS1_v1_5.new(key)
|
||
encrypted = cipher.encrypt(text.encode("utf-8"))
|
||
return base64.b64encode(encrypted).decode("utf-8")
|
||
|
||
|
||
def aes_encrypt(text: str, key: str = DOUYU_AES_KEY) -> str:
|
||
"""AES加密"""
|
||
key_bytes = key.encode("utf-8")
|
||
text_bytes = text.encode("utf-8")
|
||
|
||
# 填充到16的倍数
|
||
padding_len = 16 - (len(text_bytes) % 16)
|
||
text_bytes += bytes([padding_len] * padding_len)
|
||
|
||
cipher = AES.new(key_bytes, AES.MODE_ECB)
|
||
encrypted = cipher.encrypt(text_bytes)
|
||
return base64.b64encode(encrypted).decode("utf-8")
|
||
|
||
|
||
def encrypt_username(username: str) -> str:
|
||
"""加密用户名(斗鱼使用RSA加密)"""
|
||
return rsa_encrypt(username)
|
||
|
||
|
||
def encrypt_password(password: str) -> str:
|
||
"""加密密码(斗鱼使用MD5)"""
|
||
return md5(password)
|
||
|
||
|
||
def encrypt_nickname_or_phone(text: str) -> str:
|
||
"""加密昵称或手机号"""
|
||
key = DOUYU_RC4_KEY.encode("utf-8")
|
||
cipher = ARC4.new(key)
|
||
encrypted = cipher.encrypt(text.encode("utf-8"))
|
||
return base64.b64encode(encrypted).decode("utf-8")
|