是否有可读且可发音的Python密码生成器?
在Python中生成一个随机字符串(如shows)非常简单。但是,是否有任何Python项目可以生成一些既可发音又可读的密码字符串?所谓可读性,我的意思是不把零和O都放在同一个字符串中,等等。我不在乎它是否具有最大熵,只是一些比我可能选择的更好的东西。:) 你可以创建一个简单的单词,然后用一系列常用/可发音的单词来训练它 不久前,为了好玩,我写了一个简单的生成器。这是:是否有可读且可发音的Python密码生成器?,python,passwords,Python,Passwords,在Python中生成一个随机字符串(如shows)非常简单。但是,是否有任何Python项目可以生成一些既可发音又可读的密码字符串?所谓可读性,我的意思是不把零和O都放在同一个字符串中,等等。我不在乎它是否具有最大熵,只是一些比我可能选择的更好的东西。:) 你可以创建一个简单的单词,然后用一系列常用/可发音的单词来训练它 不久前,为了好玩,我写了一个简单的生成器。这是: #! /usr/bin/python from cStringIO import StringIO from sys imp
#! /usr/bin/python
from cStringIO import StringIO
from sys import argv
import random
USAGE="usage: ./markov.py input_file"
END_TAG='<end>'
SEPARATOR='\n'
def append(model,token, target):
if token not in model:
model[token]=[]
model[token].append(target)
def add_to_model(model,word, end_tag=END_TAG):
append(model,'',word[:2])
for i in xrange(len(word)-2):
append(model, word[i:i+2],word[i+2])
append(model,word[-2:],end_tag)
def generate(model, end_tag=END_TAG):
ret=''
while True:
cur=random.choice(model[ret[-2:]])
if cur==end_tag:
break
else:
ret+=cur
return ret
if __name__=='__main__':
if len(argv)>1:
data=file(argv[1],'r').read().split(SEPARATOR)
model={}
for word in data:
add_to_model(model,word)
print generate(model)
else:
print USAGE
#/usr/bin/python
从cStringIO导入StringIO
从系统导入argv
随机输入
用法=“用法:./markov.py输入文件”
结束标记=“”
分隔符='\n'
def追加(型号、令牌、目标):
如果令牌不在模型中:
模型[令牌]=[]
模型[token]。追加(目标)
def add_to_model(model,word,end_tag=end_tag):
追加(型号“”,单词[:2])
对于X范围内的i(len(word)-2):
追加(型号,单词[i:i+2],单词[i+2])
追加(型号,单词[-2:],结束标记)
def生成(型号,结束标记=结束标记):
ret=''
尽管如此:
cur=random.choice(模型[ret[-2:])
如果cur==结束标记:
打破
其他:
ret+=cur
回程网
如果“名称”=“\uuuuuuuu主要”:
如果len(argv)>1:
数据=文件(argv[1],'r').read().split(分隔符)
模型={}
对于word输入数据:
将\添加到\模型(模型,word)
打印生成(模型)
其他:
打印使用
如果你真的只是在寻找“比我能弥补的更好”的东西
“可发音”,然后可以使用random.sample()
从
辅音-元音-辅音假音节:
import string
import itertools
import random
initial_consonants = (set(string.ascii_lowercase) - set('aeiou')
# remove those easily confused with others
- set('qxc')
# add some crunchy clusters
| set(['bl', 'br', 'cl', 'cr', 'dr', 'fl',
'fr', 'gl', 'gr', 'pl', 'pr', 'sk',
'sl', 'sm', 'sn', 'sp', 'st', 'str',
'sw', 'tr'])
)
final_consonants = (set(string.ascii_lowercase) - set('aeiou')
# confusable
- set('qxcsj')
# crunchy clusters
| set(['ct', 'ft', 'mp', 'nd', 'ng', 'nk', 'nt',
'pt', 'sk', 'sp', 'ss', 'st'])
)
vowels = 'aeiou' # we'll keep this simple
# each syllable is consonant-vowel-consonant "pronounceable"
syllables = map(''.join, itertools.product(initial_consonants,
vowels,
final_consonants))
# you could trow in number combinations, maybe capitalized versions...
def gibberish(wordcount, wordlist=syllables):
return ' '.join(random.sample(wordlist, wordcount))
然后,您只需选择适当数量的“单词”:
我的统计数据有点模糊,但这对于非国家安全局来说可能就足够了
目的。请注意,random.sample()
无需更换即可运行。我还应该指出,如果恶意方知道您正在使用此方法,它将容易受到字典攻击。一小撮咖啡会有帮助的
更新:对于那些感兴趣的人,可以从以下网址获得更新的、可分叉的版本。我喜欢西蒙·萨宾的版本:我想我所从事的项目是适用的。我从超过1400万个密码(来自RockYou.com密码转储)中学习了马尔可夫模型,并以这种方式创建了人工密码。博客文章(以及附带的代码)如下所示。一些人工密码:
- 表111
- genny0
- mikk92
- 吕明锐10633769
- bubuzzarap71666
- Isamistillo13020
- dunl0velyiristalecasia4799
import string
import random
__all__ = ('generate_word', 'generate_words')
initial_consonants = list(set(string.ascii_lowercase) - set('aeiou')
# remove those easily confused with others
- set('qxc')
# add some crunchy clusters
| set(['bl', 'br', 'cl', 'cr', 'dr', 'fl',
'fr', 'gl', 'gr', 'pl', 'pr', 'sk',
'sl', 'sm', 'sn', 'sp', 'st', 'str',
'sw', 'tr', 'ch', 'sh'])
)
final_consonants = list(set(string.ascii_lowercase) - set('aeiou')
# remove the confusables
- set('qxcsj')
# crunchy clusters
| set(['ct', 'ft', 'mp', 'nd', 'ng', 'nk', 'nt',
'pt', 'sk', 'sp', 'ss', 'st', 'ch', 'sh'])
)
vowels = 'aeiou'
def generate_word():
"""Returns a random consonant-vowel-consonant pseudo-word."""
return ''.join(random.choice(s) for s in (initial_consonants,
vowels,
final_consonants))
def generate_words(wordcount):
"""Returns a list of ``wordcount`` pseudo-words."""
return [generate_word() for _ in range(wordcount)]
def console_main():
import sys
try:
wordcount = int(sys.argv[1])
except (IndexError, ValueError):
wordcount = 1
print(' '.join(generate_words(wordcount)))
if __name__ == '__main__':
console_main()
看起来很有趣-它会产生多少熵?我假设它是基于输入文件的,所以如果我在文本文件中有很多数字和符号,它会更强大。但是,如何避免零和“0”同时出现,或1/l?或者这也是基于输入文件-因此,如果文件中没有相同的字符串,马尔可夫生成器将学习不将它们放在一起?事实上,在评论之后,我突然想到我可以省略1/0-这似乎会导致我在读取计算机生成的密码时出现90%的问题。:)@约翰C:没错。生成的字符串完全取决于输入文件的内容。这类似于我在1995年使用的算法,用于为在线服务上的试用帐户生成随机密码。除了我在Applesoft BASIC中写的以外。:-)我的算法偶尔会在元音之前或之后插入一个
h
,以增加exhoticness.@kindall+1“exhoticness”。也许我会添加oy
,ji
,ch
,ee
,zz
,fj
,和tz
,来增加一点多元文化的味道=)我要注意的另一件事。。。你必须小心,这东西不会引起亵渎。我的程序中有一个步骤,如果它包含某些顽皮的子字符串,就会抛出一个伪单词。通过不将“ck”作为终端集群,您做得很好,但我认为您的代码仍然可以生成一些非常粗俗的单词。嗯,也许不是。。。你也把第一个位置的“c”去掉了,说得好。不要让任何人在你输入密码短语时偷听到你在低语某些精选词。想要一些与你的劝告相符吗?顺便说一句,你可能会发现相关:)@MAK,可爱-这有点像建立第二个AI来追捕流氓AI…)(巧合的是,福岛核反应堆成了所有新闻)。这看起来几乎和投票结果最接近的答案一模一样,包括一些评论,唯一真正的区别是main()
函数。如果你要改变别人的答案,你真的应该给他们一些信任。
import string
import random
__all__ = ('generate_word', 'generate_words')
initial_consonants = list(set(string.ascii_lowercase) - set('aeiou')
# remove those easily confused with others
- set('qxc')
# add some crunchy clusters
| set(['bl', 'br', 'cl', 'cr', 'dr', 'fl',
'fr', 'gl', 'gr', 'pl', 'pr', 'sk',
'sl', 'sm', 'sn', 'sp', 'st', 'str',
'sw', 'tr', 'ch', 'sh'])
)
final_consonants = list(set(string.ascii_lowercase) - set('aeiou')
# remove the confusables
- set('qxcsj')
# crunchy clusters
| set(['ct', 'ft', 'mp', 'nd', 'ng', 'nk', 'nt',
'pt', 'sk', 'sp', 'ss', 'st', 'ch', 'sh'])
)
vowels = 'aeiou'
def generate_word():
"""Returns a random consonant-vowel-consonant pseudo-word."""
return ''.join(random.choice(s) for s in (initial_consonants,
vowels,
final_consonants))
def generate_words(wordcount):
"""Returns a list of ``wordcount`` pseudo-words."""
return [generate_word() for _ in range(wordcount)]
def console_main():
import sys
try:
wordcount = int(sys.argv[1])
except (IndexError, ValueError):
wordcount = 1
print(' '.join(generate_words(wordcount)))
if __name__ == '__main__':
console_main()