Quick actions

cmd+k|ctrl+k

Navigation

Languages

rp_miner

Snippet info

Language

Python

Visibility

public

Author

67481978

Created

2025-03-18T11:31:58.382048Z

Updated

2025-03-28T18:36:52.037086Z

# @Time    : 2025/03/29 8:00:00
# @File    : rp_miner.py
# @Version : For JRRP 250329
# @Python  : >=3.9, <4.0

import multiprocessing
from datetime import datetime, timedelta, timezone
from hashlib import sha256
from base64 import b85encode

TZ = timezone(timedelta(hours=8))
HASH_RANGE = 1 << 256
NAIVE_HASH = HASH_RANGE >> 1

# 在这里设置基本盐的前缀 (字符串) 以及QQ号 (整数)
BASE_SALT: str = "基本盐是可空的自定义前缀-"
QQ_NUMBER: int = 87654321


def get_prefix(user_id: int) -> bytes:
    date_str = datetime.now(tz=TZ).strftime("%y%m")
    prefix_int = int(f"{date_str}{user_id}")
    n_bytes = (prefix_int.bit_length() + 7) // 8 or 1
    return prefix_int.to_bytes(n_bytes, byteorder="big")


PREFIX = get_prefix(QQ_NUMBER)


def get_sha256_input(salt: str) -> str:
    return b85encode(PREFIX + sha256(salt.encode()).digest()).decode()


def get_hash(text: str) -> int:
    return int.from_bytes(sha256(text.encode()).digest(), "big")


def find_best_salt(chunk: int = 0, chunksize: int = 2**32) -> tuple[str, str]:
    best_salt = ""
    best_hash = HASH_RANGE - 1
    start = chunk * chunksize
    end = (chunk + 1) * chunksize
    format_spec: str = "010x"

    for i in range(start, end):
        new_salt = BASE_SALT + format(i, format_spec)
        text = get_sha256_input(new_salt)

        if i % 5000000 == 1:
            value_str = f"{best_hash:#066x}"[2:]
            value_str_no_leading_zeros = value_str.lstrip("0")
            leading_zeros_cnt = len(value_str) - len(value_str_no_leading_zeros)
            print(
                f"Process:{chunk:02} | Best Salt: {best_salt} | "
                + f"Hash Value: 0x({leading_zeros_cnt})-{value_str_no_leading_zeros}"
            )
            print(f"Process:{chunk:02} | Checking: {new_salt}")

        hash_value = get_hash(text)

        if hash_value < best_hash:
            print(
                f"Process:{chunk:02} | Best Salt Updated: {new_salt} | "
                + f"Hash Value: {hash_value:#066x}"
            )
            best_hash = hash_value
            best_salt = new_salt

    return best_salt, f"{best_hash:#066x}"


if __name__ == "__main__":
    num_processes = 8  # 使用多进程
    with multiprocessing.Pool(num_processes) as pool:
        results = pool.map(find_best_salt, range(num_processes))

    # results = [find_best_salt()]  # 单进程

    print(sorted(results, key=lambda x: x[1]))
INFO