-
Notifications
You must be signed in to change notification settings - Fork 19
/
encrypt.py
74 lines (61 loc) · 2.26 KB
/
encrypt.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import print_function, unicode_literals, division, absolute_import
import base64
import binascii
import hashlib
import json
import os
import sys
from Cryptodome.Cipher import AES
from future.builtins import int, pow
PY3 = sys.version_info.major >= 3
__all__ = ["encrypted_id", "encrypted_request"]
MODULUS = (
"00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7"
"b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280"
"104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932"
"575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b"
"3ece0462db0a22b8e7"
)
PUBKEY = "010001"
NONCE = b"0CoJUm6Qyw8W8jud"
# 歌曲加密算法, 基于https://github.com/yanunon/NeteaseCloudMusic
def encrypted_id(id):
magic = bytearray("3go8&$8*3*3h0k(2)2", "u8")
song_id = bytearray(id, "u8")
magic_len = len(magic)
for i, sid in enumerate(song_id):
song_id[i] = sid ^ magic[i % magic_len]
m = hashlib.md5(song_id)
result = m.digest()
result = base64.b64encode(result).replace(b"/", b"_").replace(b"+", b"-")
return result.decode("utf-8")
# 登录加密算法, 基于https://github.com/stkevintan/nw_musicbox
def encrypted_request(text):
# type: (str) -> dict
data = json.dumps(text).encode("utf-8")
secret = create_key(16)
params = aes(aes(data, NONCE), secret)
encseckey = rsa(secret, PUBKEY, MODULUS)
return {"params": params, "encSecKey": encseckey}
if PY3:
def aes(text, key):
pad = 16 - len(text) % 16
text = text + bytearray([pad] * pad)
encryptor = AES.new(key, 2, b"0102030405060708")
ciphertext = encryptor.encrypt(text)
return base64.b64encode(ciphertext)
else:
def aes(text, key):
pad = 16 - len(text) % 16
text = text.encode() + bytearray([pad] * pad)
encryptor = AES.new(key.encode(), 2, b"0102030405060708")
ciphertext = encryptor.encrypt(str(text).encode())
return base64.b64encode(ciphertext)
def rsa(text, pubkey, modulus):
text = text[::-1]
rs = pow(int(binascii.hexlify(text), 16), int(pubkey, 16), int(modulus, 16))
return format(rs, "x").zfill(256)
def create_key(size):
return binascii.hexlify(os.urandom(size))[:16]