如果有人能看到问题所在,我无法验证种子生成

问题描述 投票:0回答:1

所以我得到了这个生成种子的函数makeseed(),现在我试图制作一个“验证”种子,请记住,生成的任何种子都是正确的,所以我想要它,以便用户可以输入种子和它'我会检查它是否有效。

这是我的代码

import random

def getchecksum(seed):
    checksum = 0
    while True:
        checksum = (checksum + (seed & 0xFF)) & 0xFF
        checksum = (2 * checksum + (checksum >> 7)) & 0xFF
        seed >>= 5
        if seed == 0:
            break
    return checksum

def makeseed():
    seed = random.randint(1, 4294967295)
    checksum = getchecksum(seed)
    abc = "ABCDEFGHJKLMNPQRSTWXYZ01234V6789"
    seedsprev = ((seed ^ 0xFEF7FFD) << 8) | checksum
    finalseed = ""
    for loopindex in range(0, 8):
        finalseed = abc[seedsprev & 0x1F] + finalseed
        seedsprev >>= 5
    return finalseed

def is_valid_seed(seed):
    """
    Checks if a seed is valid.

    Args:
        seed: The seed to check.

    Returns:
        True if the seed is valid, False otherwise.
    """
    seed_length = len(seed)
    if seed_length != 8:
        return False

    abc = "ABCDEFGHJKLMNPQRSTWXYZ01234V6789"

    try:
        seed_int = 0
        for i in range(7, -1, -1):
            seed_int <<= 5
            seed_int |= abc.index(seed[i])

        checksum = getchecksum(seed_int)
        seed_int = ((seed_int ^ 0xFEF7FFD) << 8) | checksum

        final_seed = ""
        for _ in range(8):
            final_seed = abc[seed_int & 0x1F] + final_seed
            seed_int >>= 5

        return final_seed == seed
    except ValueError:
        return False

ok = makeseed()
print(is_valid_seed(ok)) #to check if the function is correct
print(ok)

我试图扭转makeseed所做的事情,我希望它能起作用,但它没有

python algorithm random bitwise-operators
1个回答
0
投票

您的字符串编码不好。如果你对一个数字进行编码和解码,你会得到其他的东西。我将它们分成一个单独的函数并添加了一个测试。

您对操作的逆转实际上并没有逆转操作。它只是以相同的顺序执行一些相同的数学运算,而不是相反的顺序。

MY_ALPHABET = "ABCDEFGHJKLMNPQRSTWXYZ01234V6789"

def encode(seed: int) -> str:
    encoded = ""
    for _ in range(0, 8):
        value = seed & 0x1F
        seed >>= 5
        encoded = MY_ALPHABET[value] + encoded
    return encoded


def decode(encoded: bytes) -> int:
    seed = 0
    for digit in encoded:
        value = MY_ALPHABET.index(digit)
        seed <<= 5
        seed += value
    return seed


assert(99999 == decode(encode(99999)))


def getchecksum(seed: int):
    checksum = 0
    while True:
        checksum = (checksum + (seed & 0xFF)) & 0xFF
        checksum = (2 * checksum + (checksum >> 7)) & 0xFF
        seed >>= 5
        if seed == 0:
            break
    return checksum


def make_seed(seed: int):
    checksum = getchecksum(seed)
    seedsprev = ((seed ^ 0xFEF7FFD) << 8) | checksum
    return encode(seedsprev)


def is_valid_seed(encoded: str):
    seed = decode(encoded)
    original_seed = (seed >> 8) ^ 0xFEF7FFD
    original_encoded = make_seed(original_seed)
    return original_encoded == encoded


seed = 87654321
checksum = getchecksum(seed)
encoded = make_seed(seed)
assert is_valid_seed(encoded)
assert not is_valid_seed('ABCDEFGH')
© www.soinside.com 2019 - 2024. All rights reserved.