我正在寻找一种加密/混淆30位数字的方法。
结果将被分组为3个一组,并以6个字符的字母数字形式向用户显示,该字母数字以base32字母表编码,但用户应该不能在字母数字字符串中拾取模式。例如,用户可以看到3个字符串: ASDFGH、LKJHGF、ZXCVBN,这些字符串可能映射到数字1073741821、1073741822、1073741823。但是,这是一种他们不能轻易弄清楚的模式。
我看过一些加密算法,比如DES。这是一个糟糕而幼稚的尝试:
import struct
from Crypto.Cipher import DES
from .baseconv import base32_urlsafe
_KEY = '\x81\x98\xe1\x14<\xb3\xe8\x10'
_encryptor = DES.new(_KEY)
def encrypt_number(number):
encrypted_i64 = struct.unpack(
'!Q', _encryptor.encrypt(struct.pack('!Q', number))
)[0]
encrypted_i30 = encrypted_i64 >> 34
return base32_urlsafe.encode(encrypted_i30)但很明显,如果需要的话,我将无法解密字符串,并且这种方法会丢失唯一性。我也考虑过使用XOR,但这太可预测了,因为更多的时候数字不是连续的序列。
我从来没有编码过这样的东西。因此,我正在寻找一些加密算法/方法来研究和考虑。我使用的是python,但欢迎使用其他语言的想法或示例。
发布于 2011-07-10 19:56:35
在这里,Format preserving encryption可能会有所帮助。
例如,Black和Rogaway在“具有任意有限域的密码”一文中描述的循环行走方法似乎是一个潜在的解决方案。例如,使用32位密码( Greg Rose的Skip32就是一个例子)。使用密码加密您的30位输入。如果结果是一个30位的整数(即前2位是0),那么你就完成了,否则继续使用密码加密,直到你得到30位的结果。相应地进行解密。
如果你不需要一个非常安全的解决方案,那么the Hasty Pudding cipher可能是一个替代方案。它可以加密任意大小的输入。它被提交给了AES竞赛,但并没有走得太远,因此没有得到很好的分析。尽管如此,我仍然希望它比在stackoverflow上提出的任何临时解决方案都更合适。
发布于 2011-07-10 18:28:58
一种方法是有一个包含1B (2^30)个唯一随机数的表-并使用您的30位数字作为该表的索引。
如果该表太大,您可以制作一个较小的表-比方说有32768个条目,并分别对下半部分和上半部分进行索引。
为了避免上半部分不会因连续值而改变,请在表中查找前将下半部分的加密值添加到上半部分。
加密
t = table of 32768 random values
upper15 = input_value >> 15
lower15 = input_value & 0x7FFF
lowercoded = t[lower15]
uppercoded = t[ ( lowercoded + upper15 ) % 32768 ]
result = uppercoded << 15 + lowercoded解密
upper15 = input_value >> 15
lower15 = input_value & 0x7FFF
lowereddecoded = t.index(lower15)
tmp = t.index(upper15)
tmp -= lower15
if tmp< 0: tmp += 32768
upperdecoded = tmp
result = upperdecoded << 15 + lowerdecoded发布于 2011-07-11 05:02:10
只需使用Luby-Rackoff construction滚动自己的30位块密码即可。
对"F“框使用任何您想要的哈希函数(例如,数据murmurhash的低15位加上密钥),并运行任意多轮,结果将是30位数字的可逆伪随机置换。
当然,它不会是“强大的密码”,但30位不可能是任何东西。
https://stackoverflow.com/questions/6640341
复制相似问题