串行密钥生成和验证

时间:2011-04-05 23:50:45

标签: 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 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"

我很清楚第二种类型的支票根本不起作用,但它是占位符,因为我不知道如何检查。

但我认为检查数字的方法可行,但它也没有。

2 个答案:

答案 0 :(得分:1)

表达式`range(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甚至不会尝试在and之后评估该部分。这称为短路。

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

if "1" <= serial_list <= "5":

你可以对每个测试做同样的事情,只改变你正在检查的内容。

此外,您无需将序列号转换为列表。 serial_check是一个字符串,按索引访问字符串是完全可以接受的。

最后,您的代码中会出现这种模式:

if thing == other:
   pass
elif thing != other:
   (do something)

首先,因为您正在测试的条件是逻辑对立的,所以您不需要elif thing != other - 您可以说else,其中表示“无论什么不是'与任何if条件相匹配。“

if thing == other:
   pass
else:
   (do something)

但如果你只是在满足条件的情况下前往pass,为什么不测试相反的条件呢?你清楚地知道如何写它,因为你把它放在elif中。把它放在if代替!

if thing != other:
    (do something)

是的,您的每个if声明都可轻松减半。在我给你检查字符范围的例子中,可能最简单的方法是使用not

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

答案 1 :(得分:0)

关于你的python,我猜你写的时候是这样的:

if serial_list[0] == range(1,5):

你可能意味着这个:

if 1 <= serial_list[0] <= 5:

当你写这篇文章时:

if serial_list[1] == random.choice('ABCDEF'):

你可能意味着这个:

if serial_list[1] in 'ABCDEF':

您的代码存在各种其他问题,但我确信您在学习python时会对其进行改进。

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