d3w*_*4rd 2 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)
Run Code Online (Sandbox Code Playgroud)
但显然,如果需要,我将无法解密字符串,并且这种方法会丢失唯一性.还考虑了使用XOR,但这是太可预测的,因为更常见的是数字不是连续的序列.
我从来没有编过这样的东西.所以,我正在寻找一些加密算法/方法来研究和考虑.我正在使用python,但欢迎使用其他语言的想法或示例.
格式保留加密在这里可能会有所帮助.
例如,Black和Rogaway的论文"Ciphers with Arbitrary Finite Domains"中描述的循环行走方法似乎是一种潜在的解决方案.例如,使用32位密码(Greg Rose的Skip32就是一个例子).使用密码加密30位输入.如果结果是30位整数(即前2位为0)则完成,否则继续使用密码加密,直到得到30位结果.解密就相应地完成了.
如果您不需要非常安全的解决方案,那么Hasty Pudding密码可能是另一种选择.它可以加密任意大小的输入.它被提交给AES竞赛,但是没有做得很远,因此没有得到很好的分析.我仍然希望它比stackoverflow中提出的任何临时解决方案更合适.
| 归档时间: |
|
| 查看次数: |
1270 次 |
| 最近记录: |