2011-04-05 77 views
0

我正在写作创造一个串行代码生成器/验证器,但我似乎无法得到如何做一个适当的检查。串行密钥的生成和验证

这里是我的发电机(是的,这是没有任何幻想,但是这纯粹是我自己的教育,所以它会做):

# 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" 

我很清楚的是,第二类型的检查不会在所有的工作,但它是一个占位符,因为我没有想法如何检查。

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

我明显是python的新手,我很难过。任何帮助将不胜感激!

回答

0

表达'范围(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"): 
+0

谢谢!你知道我开始认为我应该通过最初的条件,但我想把它留在 - 不知道为什么现在。 – user679400 2011-04-07 19:38:07

0

关于你的蟒蛇,我猜,当你写了这个:

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的库可以处理任何一种方法。

+0

谢谢你的帮助。这不是什么真正的事情,我很好奇如何去做一些像真正的串行发生器那样的东西,并且想自己给它一个镜头,这就是我所追求的。再次感谢。 – user679400 2011-04-07 19:31:49

+0

当然。如果您不打算提出具体问题或接受答案,则可能需要下次将其作为维基。 – 2011-04-07 20:30:29