Comments (5)
如標題我已經完成你代碼中的c.ecc.Encode(data)可是在POST的時候出現問題了我發送出去的數據和你的數據有一點偏差搞了很多類型不同的header-s ': 'application/x-www-form-urlencoded', 'User-Agent': 'Mozilla/5.0; Windows NT/10.0.19045;115Desktop/2.0.3.6', 'cookie': '', } requests.post(url, data=client.Encode(data), headers=headers) 我發送的時候大概念是這樣的發送想請問大老是能不能幫我看問題出在哪.....
POST的時候,除了加了密碼,還要在URL裡面拼上一個
k_ec
參數,參數值來自ecc.EncodeToken。
我在驗證加密算法的時候就用的Python,以下是代碼片段,供你參考:def upload_file_v4(self, file_path:str, target_dir_id:str): file_id = _hash.sha1_file(file_path) file_size = os.path.getsize(file_path) target_id = 'U_1_%s' % target_dir_id # Form data to POST data = { 'appid': '0', 'appversion': _app_version, 'filename': os.path.basename(file_path), 'filesize': file_size, 'fileid': file_id, 'target': target_id, 'userid': self._user_id, 'sig': self._calculate_sig_v4(file_id, target_id) } sign_key, sign_val = '', '' while True: now = int(time.time()) data.update({ 't': str(now), 'token': self._calculate_token_v4( now, file_id, file_size, sign_key, sign_val ) }) if sign_key != '' and sign_val != '': data.update({ 'sign_key': sign_key, 'sign_val': sign_val }) resp = self._session.post( url=_api_upload, params={ 'k_ec': self._ecc.encode_token(now) }, data=self._ecc.encode( urllib.parse.urlencode(data).encode() ), headers={ 'Content-Type': 'application/x-www-form-urlencoded' } ) result = self._ecc.decode(resp.content) _logger.debug('Result: %s', result) result = json.loads(result) if result['status'] == 7: sign_key = result['sign_key'] sign_val = _hash.sha1_file_range(file_path, result['sign_check']) else: break
不好意思大佬 我試了一下還是不行 可能是我加密有問題 還有一個小問題 我已經獲取了 伺服器key serverx servery 了 可是不清楚如何交換金鑰 我之前是直接把你的代碼生成exe調用獲取裡面key 進行加密 能否跟我講下你是否如何交換金鑰的嗎? 我寫了我的代碼 能跟我講下問題出在哪嗎? https://github.com/ww9592447/115-/blob/main/115.py
以下是我实现的 EC Cipher,需要引入3个第三方库:
- cryptography: 用于密钥交换
- pycryptodome: 用于AES加解密
- lz4: 用于解压
__author__ = 'deadblue'
import binascii
import logging
import random
import struct
from Crypto.Cipher import AES
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.hazmat.primitives.serialization import Encoding, PublicFormat
import lz4.block
_server_pub_key = bytes([
0x04, 0x57, 0xa2, 0x92, 0x57, 0xcd, 0x23, 0x20,
0xe5, 0xd6, 0xd1, 0x43, 0x32, 0x2f, 0xa4, 0xbb,
0x8a, 0x3c, 0xf9, 0xd3, 0xcc, 0x62, 0x3e, 0xf5,
0xed, 0xac, 0x62, 0xb7, 0x67, 0x8a, 0x89, 0xc9,
0x1a, 0x83, 0xba, 0x80, 0x0d, 0x61, 0x29, 0xf5,
0x22, 0xd0, 0x34, 0xc8, 0x95, 0xdd, 0x24, 0x65,
0x24, 0x3a, 0xdd, 0xc2, 0x50, 0x95, 0x3b, 0xee,
0xba,
])
_crc_salt = b'^j>WD3Kr?J2gLFjD4W2y@'
_logger = logging.getLogger(__name__)
class Cipher:
_pub_key: bytes = None
_aes_key: bytes = None
_aes_iv: bytes = None
def __init__(self) -> None:
# Use P-224 curve
curve = ec.SECP224R1()
# Parse server key
server_key = ec.EllipticCurvePublicKey.from_encoded_point(
curve=curve, data=_server_pub_key)
# Generate client key
ec_key = ec.generate_private_key(
curve=curve, backend=default_backend())
self._pub_key = b'\x1d' + ec_key.public_key().public_bytes(
encoding=Encoding.X962, format=PublicFormat.CompressedPoint)
# ECDH key exchange
shared_secret = ec_key.exchange(ec.ECDH(), server_key)
self._aes_key = shared_secret[:16]
self._aes_iv = shared_secret[-16:]
def encode_token(self, timestamp: int) -> str:
token = bytearray(struct.pack(
'<15sBII15sBI',
self._pub_key[:15], 0, 115, timestamp,
self._pub_key[15:], 0, 1
))
r1, r2 = random.randint(0, 0xff), random.randint(0, 0xff)
for i in range(len(token)):
if i < 24:
token[i] = token[i] ^ r1
else:
token[i] = token[i] ^ r2
# Calculate and append CRC32 checksum
checksum = binascii.crc32(_crc_salt + token) & 0xffffffff
token += struct.pack('<I', checksum)
# Base64 encode
return binascii.b2a_base64(token, newline=False).decode()
def encode(self, data) -> bytes:
pad_size = AES.block_size - len(data) % AES.block_size
if pad_size != AES.block_size:
data += bytes([0] * pad_size)
encrypter = AES.new(
key=self._aes_key,
mode=AES.MODE_CBC,
iv=self._aes_iv
)
return encrypter.encrypt(data)
def decode(self, data:bytes) -> bytes:
ciphertext, tail = data[:-12], bytearray(data[-12:])
# Decrypt
decrypter = AES.new(
key = self._aes_key,
mode = AES.MODE_CBC,
iv = self._aes_iv
)
plaintext = decrypter.decrypt(ciphertext)
# Decompress
for i in range(4):
tail[i] = tail[i] ^ tail[7]
dst_size, = struct.unpack('<I', tail[:4])
_logger.debug('Uncompress size: %d', dst_size)
src_size, = struct.unpack('<H', plaintext[:2])
plaintext = lz4.block.decompress(plaintext[2:src_size+2], dst_size)
return plaintext
from elevengo.
如標題 我已完成 你代碼中的 c.ecc.Encode(data) 可是在POST的時候發現問題了 我發送出去的數據跟你的數據有點差距 弄了很多種方式都不行 headers = { 'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': 'Mozilla/5.0; Windows NT/10.0.19045; 115Desktop/2.0.3.6', 'cookie': '', } requests.post(url, data=client.Encode(data), headers=headers) 我發送的時候大概是這樣的發送 想請問大老是否能夠幫我看看問題出在哪.....
POST 的时候,除了加密数据,还要在 URL 里面拼上一个 k_ec
参数,参数值来自ecc.EncodeToken。
我验证加密算法的时候就用的 Python ,以下是代码片段,供你参考:
def upload_file_v4(self, file_path:str, target_dir_id:str):
file_id = _hash.sha1_file(file_path)
file_size = os.path.getsize(file_path)
target_id = 'U_1_%s' % target_dir_id
# Form data to POST
data = {
'appid': '0',
'appversion': _app_version,
'filename': os.path.basename(file_path),
'filesize': file_size,
'fileid': file_id,
'target': target_id,
'userid': self._user_id,
'sig': self._calculate_sig_v4(file_id, target_id)
}
sign_key, sign_val = '', ''
while True:
now = int(time.time())
data.update({
't': str(now),
'token': self._calculate_token_v4(
now, file_id, file_size, sign_key, sign_val
)
})
if sign_key != '' and sign_val != '':
data.update({
'sign_key': sign_key,
'sign_val': sign_val
})
resp = self._session.post(
url=_api_upload,
params={
'k_ec': self._ecc.encode_token(now)
},
data=self._ecc.encode(
urllib.parse.urlencode(data).encode()
),
headers={
'Content-Type': 'application/x-www-form-urlencoded'
}
)
result = self._ecc.decode(resp.content)
_logger.debug('Result: %s', result)
result = json.loads(result)
if result['status'] == 7:
sign_key = result['sign_key']
sign_val = _hash.sha1_file_range(file_path, result['sign_check'])
else:
break
from elevengo.
如標題我已經完成你代碼中的c.ecc.Encode(data)可是在POST的時候出現問題了我發送出去的數據和你的數據有一點偏差搞了很多類型不同的header-s ': 'application/x-www-form-urlencoded', 'User-Agent': 'Mozilla/5.0; Windows NT/10.0.19045;115Desktop/2.0.3.6', 'cookie': '', } requests.post(url, data=client.Encode(data), headers=headers) 我發送的時候大概念是這樣的發送想請問大老是能不能幫我看問題出在哪.....
POST的時候,除了加了密碼,還要在URL裡面拼上一個
k_ec
參數,參數值來自ecc.EncodeToken。我在驗證加密算法的時候就用的Python,以下是代碼片段,供你參考:
def upload_file_v4(self, file_path:str, target_dir_id:str): file_id = _hash.sha1_file(file_path) file_size = os.path.getsize(file_path) target_id = 'U_1_%s' % target_dir_id # Form data to POST data = { 'appid': '0', 'appversion': _app_version, 'filename': os.path.basename(file_path), 'filesize': file_size, 'fileid': file_id, 'target': target_id, 'userid': self._user_id, 'sig': self._calculate_sig_v4(file_id, target_id) } sign_key, sign_val = '', '' while True: now = int(time.time()) data.update({ 't': str(now), 'token': self._calculate_token_v4( now, file_id, file_size, sign_key, sign_val ) }) if sign_key != '' and sign_val != '': data.update({ 'sign_key': sign_key, 'sign_val': sign_val }) resp = self._session.post( url=_api_upload, params={ 'k_ec': self._ecc.encode_token(now) }, data=self._ecc.encode( urllib.parse.urlencode(data).encode() ), headers={ 'Content-Type': 'application/x-www-form-urlencoded' } ) result = self._ecc.decode(resp.content) _logger.debug('Result: %s', result) result = json.loads(result) if result['status'] == 7: sign_key = result['sign_key'] sign_val = _hash.sha1_file_range(file_path, result['sign_check']) else: break
不好意思大佬 我試了一下還是不行 可能是我加密有問題
還有一個小問題 我已經獲取了 伺服器key serverx servery 了
可是不清楚如何交換金鑰
我之前是直接把你的代碼生成exe調用獲取裡面key 進行加密
能否跟我講下你是否如何交換金鑰的嗎?
我寫了我的代碼 能跟我講下問題出在哪嗎?
https://github.com/ww9592447/115-/blob/main/115.py
from elevengo.
大佬还会Python。牛
from elevengo.
感謝大佬的指點 我根據你的代碼測試了一下 果然是在加密data的地方出現了問題
沒想到我當時抄網路上的cbc加密代碼 抄錯了
多抄了一句代碼
因為返回值差不多 沒檢查仔細
結果數據後面竟然多了一些數據
再次感謝大佬的代碼
from elevengo.
Related Issues (10)
- DownloadCreateTicket,与FileGet问题 HOT 6
- sha1文件导入提示错误 HOT 4
- 我还是直接发错误吧! HOT 12
- 【bug】Agent.FileIterate 无法获取完整的文件,会获取重复文件。 HOT 1
- 烦请问有无支持提供 HTTP API 的意向 HOT 2
- 大佬,你好我找了一下没有找到支持秒传。请问下有打算支持吗? HOT 3
- .FileSearch(dirId, keyword) 返回空集 HOT 1
- 大佬,辛苦了。昨天我测试妙传使用GitHub 开发者分支,出现签名错误。 HOT 1
- 函数调用 出现错误 (a *Agent) FileStat 每次只能返回一个null HOT 6
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from elevengo.