Giter Site home page Giter Site logo

Comments (5)

deadblue avatar deadblue commented on September 23, 2024 1

如標題我已經完成你代碼中的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.

deadblue avatar deadblue commented on September 23, 2024

如標題 我已完成 你代碼中的 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.

ww9592447 avatar ww9592447 commented on September 23, 2024

如標題我已經完成你代碼中的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.

user1121114685 avatar user1121114685 commented on September 23, 2024

大佬还会Python。牛

from elevengo.

ww9592447 avatar ww9592447 commented on September 23, 2024

感謝大佬的指點 我根據你的代碼測試了一下 果然是在加密data的地方出現了問題
沒想到我當時抄網路上的cbc加密代碼 抄錯了
多抄了一句代碼
因為返回值差不多 沒檢查仔細
結果數據後面竟然多了一些數據
再次感謝大佬的代碼

from elevengo.

Related Issues (10)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.