繁体   English   中英

如何从关键字生成字符串

[英]how to generate string generation from keyword

我正在为我正在尝试在 java 中执行的项目寻找基于关键字的字符串生成算法。

基本上我想要做的是生成一串无意义的字符(字母、数字和符号)排列成一行,这样一个关键字每次都会产生相同的字符串。

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

如果我理解正确,你想做对称加密。 有很多对称加密算法。

您可以使用的最简单的是凯撒加密,但是还有很多其他更安全的算法,例如 AES。 我不是专家,但 java 中肯定存在一个做这样的事情。

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

您希望“随机”序列根据需要重复,这意味着第二次和随后的时间并不是真正随机的。 这排除了加密 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM