我正在寻找一种加密/混淆 30 位数字的方法。
结果将被分成 3 组,并作为使用 base32 字母表编码的 6 个字符的字母数字对用户可见,但用户不应该能够从字母数字字符串中提取模式。例如,用户可以看到 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,但欢迎使用其他语言的想法或示例。
最佳答案
Format preserving encryption在这里可能会有帮助。
例如,Black 和 Rogaway 的论文“Ciphers with Arbitrary Finite Domains”中描述的循环行走方法似乎是一种潜在的解决方案。 例如。使用 32 位密码(例如 Greg Rose 的 Skip32)。 使用密码加密您的 30 位输入。如果结果是 30 位整数(即前 2 位 是 0) 然后你就完成了,否则继续用密码加密,直到你得到一个 30 位的结果。 相应地进行解密。
如果您不需要非常安全的解决方案,那么 the Hasty Pudding cipher可能是另一种选择。它可以加密任意大小的输入。它被提交给了 AES 竞赛,但是并没有走得太远,因此没有得到很好的分析。我仍然希望它比在 stackoverflow 上提出的任何临时解决方案更合适。
关于python - 将 30 位数字加密为 6 个字符的字母数字字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6640341/