[英]how to generate string generation from keyword
我正在为我正在尝试在 java 中执行的项目寻找基于关键字的字符串生成算法。
基本上我想要做的是生成一串无意义的字符(字母、数字和符号)排列成一行,这样一个关键字每次都会产生相同的字符串。
我不确定是否存在任何用于此目的的算法,但我正在寻找一个。 我想制作一个用于此目的的算法,为此我想从 Stack Overflow 社区获得建议。
您在密码学部分提出您的问题,所以我假设您需要一个密码安全的解决方案。 非加密解决方案会更简单但不安全。
您希望“随机”序列根据需要重复,这意味着第二次和随后的时间并不是真正随机的。 这排除了加密 RNG,而是指示 stream 密码或等效密码,这将生成由给定密钥确定的随机出现的字节 stream。 显而易见的选择是计数器模式 (CTR) 中的 AES,只要您给它相同的密钥,它就会重复它的 output。
您没有确切说明您从哪组字符中挑选。 我将假设 62 个字符:az、AZ、0-9。 62 x 4 = 248,差不多是 255,一个字节的最大值。 为避免偏差,请忽略 248 到 255 范围内的字节,否则 'a' 到 'h' 的选择频率会略高于应有的频率。 然后对于 0 到 247 范围内的 AES output 的每个字节,只需执行 MOD 62 即可获得字符的值:a = 0、b = 1 等,直到 9 = 61。如果您使用的是不同的一组字符然后调整数字,记住忽略 MOD 后不完整尾部中的字节值,以避免偏差 output。
ETA:我刚刚注意到你的“和符号”。 我建议您添加两个可能的符号以使可选字符数达到 64 个。这样您就不必取消 output 字节的偏差,只需使用 MOD 64。
这个问题模棱两可,但我将其解释为使用“关键字”作为 PRNG 的种子,然后用于生成 output。 通常你会使用hash将一些任意输入压缩成适合种子的东西,然后使用PRNG生成 output。 如果这对您的情况很重要,那么您使用的 hash function 和/或 PRNG 都可能是加密安全的
Python 中的一个简单示例是:
from random import Random
from string import ascii_letters, digits, punctuation
# the letters we want to choose randomly from
alphabet = ascii_letters + digits + punctuation
# seed our PRNG with your keyword
keyword = 'some text'
rng = Random(keyword)
# use this freshly seeded RNG to generate some output
output = ''.join(rng.choices(alphabet, k=14))
print(output)
请注意,将字符串传递给 Python 中的Random
会导致它使用 SHA512 将字符串传递给 hash ,并使用生成的字节来播种MT19937 PRNG 。 根据您对兼容性的关心程度,您可能希望自己做更多事情,但以上内容足以从给定的输入中获得“随机外观”output。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.