【发布时间】:2011-10-02 04:35:47
【问题描述】:
我正在寻找一种方法来加密/混淆 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,但欢迎使用其他语言的想法或示例。
【问题讨论】:
-
你能多谈谈你的申请吗?如果我们知道您将如何使用这些代码、您要保护什么、它们需要安全多长时间、它们是否被重复使用等等,这可能会有所帮助。
-
你需要倒车吗?如果没有,cryptographic hash function 可能是您最好的选择。
-
@Gareth Rees,我不希望外部用户弄清楚数字增长的速度。它们不应该被重复使用,它们需要在 90 天左右的时间内保持安全。我去了 user12398 建议的 skip32 解决方案。谢谢
标签: python security encryption cryptography bit-manipulation