如何从关键字生成字符串

问题描述

我正在寻找一种基于关键字的字符串生成算法,用于我尝试在 Java 中执行的项目。

基本上我想要做的是生成一串无意义的字符(字母、数字和符号),以一种关键字每次生成相同字符串的方式排成一行。

我不确定是否存在用于此目的的算法,但我正在寻找一种算法。 我想制作一个用于此目的的算法,为此我想从 Stack Overflow 社区获得建议。

解决方法

如果我理解正确,您想要进行对称加密。 有很多对称加密算法。

最简单的就是the caesar encryption 但是还有很多其他更安全的算法,例如 AES。我不是专家,但 Java 中肯定存在 library 做这样的事情。

,

您在密码学部分提出您的问题,所以我假设您需要一个密码学安全的解决方案。非加密解决方案会更简单但不安全。

您希望“随机”序列根据需要重复,这意味着它在第二次和随后的时间并不是真正随机的。这排除了加密 RNG,而是指示流密码或等效项,它将生成由给定密钥确定的随机出现的字节流。显而易见的选择是计数器模式 (CTR) 中的 AES,只要您给它相同的密钥,它就会重复输出。

您没有确切说明您从哪一组字符中挑选。我将假设 62 个字符:a-z、A-Z、0-9。 62 x 4 = 248,几乎是 255,一个字节的最大值。为避免偏差,请忽略 248 到 255 范围内的字节,否则 'a' 到 'h' 的选择频率将略高于应有的频率。然后对于 0 到 247 范围内的 AES 输出的每个字节,只需执行 MOD 62 即可获得字符的值:a = 0、b = 1 等,直到 9 = 61。如果您使用的是不同的一组字符,然后调整数字,记住忽略 MOD 后不完整尾部中的字节值,以避免输出偏差。

ETA:我刚刚注意到你的“和符号”。我建议您添加两个可能的符号,以使可选字符的数量达到 64。这样您就不必对输出字节进行无偏差,只需取一个 MOD 64。

,

问题含糊不清,但我将其解释为使用“关键字”作为 PRNG 的种子,然后用于生成输出。通常,您会使用 hash 将一些任意输入压缩为适合种子的内容,然后使用 PRNG 生成输出。如果这对您的情况很重要,那么您使用的哈希函数和/或 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 对字符串进行哈希处理,并使用生成的字节为 MT19937 PRNG 设置种子。取决于您对兼容性的关心程度,您可能想要自己做更多的事情,但以上内容足以从给定的输入中获得“随机外观”输出。