python - 将 30 位数字加密为 6 个字符的字母数字字符串

标签 python security encryption cryptography bit-manipulation

我正在寻找一种加密/混淆 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/

相关文章:

SSL:服务器 key 长度和浏览器连接信息。基础理解

python - 如何从另一个 .py 获取变量

PHP 在插入 MySQL 时向字符添加斜杠

java - 如何通过反射访问私有(private)方法和私有(private)数据成员?

python - 解密后的明文前面的b在pycrypto中是什么意思?

ios - RNDecryptor addData 方法中的混淆

python - k个离原点最近的点

python - 在 keras 中对不平衡数据集使用 class_weight 时,准确度显着降低

python - 如何从抓取的 URL 列表中下载图像?

api - 为什么我们甚至需要通过 HTTPS 刷新 token ?