Python 串行密钥生成和验证

Python 串行密钥生成和验证,python,Python,我正在玩弄如何编写和创建一个串行代码生成器/验证器,但我似乎不知道如何进行正确的检查 这是我的生成器代码: # Serial generator # Create sequences from which random.choice can choose Sequence_A = 'ABCDEF' Sequence_B = 'UVWQYZ' Sequence_C = 'NOPQRS' Sequence_D = 'MARTIN' import random # Generate a seri

我正在玩弄如何编写和创建一个串行代码生成器/验证器,但我似乎不知道如何进行正确的检查

这是我的生成器代码:

# Serial generator

# Create sequences from which random.choice can choose
Sequence_A = 'ABCDEF'
Sequence_B = 'UVWQYZ'
Sequence_C = 'NOPQRS'
Sequence_D = 'MARTIN'

import random

# Generate a series of random numbers and Letters to later concatenate into a pass code
First = str(random.randint(1,5))
Second = str(random.choice(Sequence_A))
Third = str(random.randint(6,9))
Fourth = str(random.choice(Sequence_B))
Fifth = str(random.randint(0,2))
Sixth = str(random.choice(Sequence_C))
Seventh = str(random.randint(7,8))
Eighth = str(random.choice(Sequence_D))
Ninth = str(random.randint(3,5))


serial = First+Second+Third+Fourth+Fifth+Sixth+Seventh+Eighth+Ninth

print serial
我想做一个通用检查,这样我的验证代码将接受由此生成的任何密钥

我的直觉是创建这样的检查:

serial_check = raw_input("Please enter your serial code: ")

# create a control object for while loop
control = True

# Break up user input into list that can be analyzed individually
serial_list = list(serial_check)    

while control:
    if serial_list[0] == range(1,5):
        pass
    elif serial_list[0] != range(1,5):
        control = False

    if serial_list[1] == random.choice('ABCDEF'):
        pass
    elif serial_list[1] != random.choice('ABCDEF'):
        control = False
# and so on until the final, where, if valid, I would print that the key is valid.

if control == False:
      print "Invalid Serial Code"
if "1" <= serial_list <= "5":
我很清楚,第二种检查根本不起作用,但它是一种占位符,因为我不知道如何检查

但是我认为检查数字的方法会起作用,但它也不起作用。

表达式“范围(1,5)”创建一个从1到4的数字列表。因此,在第一次测试中,您会询问序列号中的第一个字符是否等于该列表:

"1" == [1, 2, 3, 4]
可能不是

您可能想知道的是一个数字是否在范围内(即,我假设是从1到5,而不是从1到4)

您的另一个障碍是,序列的第一个字符是字符串,而不是整数,因此您需要获取第一个字符的
int()
。但如果不是一个数字,这将引发一个例外。因此,您必须首先测试以确保它是一个数字:

if serial_list[0].isdigit() and int(serial_list[0]) in range(1, 6):
别担心,如果不是数字,Python甚至不会尝试在
之后计算该部分。这叫做短路

但是,我不建议这样做。相反,只需检查以确保其至少为“1”且不超过“5”,如下所示:

serial_check = raw_input("Please enter your serial code: ")

# create a control object for while loop
control = True

# Break up user input into list that can be analyzed individually
serial_list = list(serial_check)    

while control:
    if serial_list[0] == range(1,5):
        pass
    elif serial_list[0] != range(1,5):
        control = False

    if serial_list[1] == random.choice('ABCDEF'):
        pass
    elif serial_list[1] != random.choice('ABCDEF'):
        control = False
# and so on until the final, where, if valid, I would print that the key is valid.

if control == False:
      print "Invalid Serial Code"
if "1" <= serial_list <= "5":
首先,因为您测试的条件在逻辑上是相反的,所以您不需要
elif thing!=other
——你可以说
else
,意思是“如果条件与任何
不匹配的任何内容。”

但是,如果您只想在满足条件时通过
,为什么不先测试相反的条件呢?你清楚地知道如何编写它,因为你把它放在
elif
中。如果,请将其放在

if thing != other:
    (do something)
是的,您的每个
if
语句都可以轻松地切成两半。在我为检查字符范围提供的示例中,最简单的方法可能是使用
而不是

if not ("1" <= serial_list <= "5"):

如果不是(“1”关于你的python,我猜当你写这篇文章时:

if serial_list[0] == range(1,5):
if serial_list[1] == random.choice('ABCDEF'):
你可能是这个意思:

if 1 <= serial_list[0] <= 5:
if serial_list[1] in 'ABCDEF':
你可能是这个意思:

if 1 <= serial_list[0] <= 5:
if serial_list[1] in 'ABCDEF':
您的代码还存在其他各种问题,但我相信您在学习python时会有所改进


在更高的层次上,您似乎试图构建类似于软件激活码生成器/验证器的东西。您应该知道,仅仅生成一个伪随机字符字符串,然后检查每个字符是否在范围内是一种非常弱的验证形式。如果您想防止伪造,我建议您学习HMAC(如果在安全服务器上验证)或公钥加密(如果在用户计算机上验证)并将其纳入到您的设计中。有一些python库可以处理这两种方法。

谢谢您的帮助。这不是为了任何真实的东西,我很好奇如何制作一个真正的串行生成器,我想自己试一试,这就是我所做的。再次感谢。当然。如果你不想问特定的问题或接受答案,下次你可能想把它变成一个维基。谢谢!你知道我开始认为我应该通过初始条件,但我想保留它-不知道为什么现在。