首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将30位数字加密为6字符字母数字字符串

将30位数字加密为6字符字母数字字符串
EN

Stack Overflow用户
提问于 2011-07-10 17:41:05
回答 3查看 1.5K关注 0票数 2

我正在寻找一种加密/混淆30位数字的方法。

结果将被分组为3个一组,并以6个字符的字母数字形式向用户显示,该字母数字以base32字母表编码,但用户应该不能在字母数字字符串中拾取模式。例如,用户可以看到3个字符串: ASDFGH、LKJHGF、ZXCVBN,这些字符串可能映射到数字1073741821、1073741822、1073741823。但是,这是一种他们不能轻易弄清楚的模式。

我看过一些加密算法,比如DES。这是一个糟糕而幼稚的尝试:

代码语言:javascript
复制
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,但欢迎使用其他语言的想法或示例。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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上提出的任何临时解决方案都更合适。

票数 7
EN

Stack Overflow用户

发布于 2011-07-10 18:28:58

一种方法是有一个包含1B (2^30)个唯一随机数的表-并使用您的30位数字作为该表的索引。

如果该表太大,您可以制作一个较小的表-比方说有32768个条目,并分别对下半部分和上半部分进行索引。

为了避免上半部分不会因连续值而改变,请在表中查找前将下半部分的加密值添加到上半部分。

加密

代码语言:javascript
复制
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

解密

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2011-07-11 05:02:10

只需使用Luby-Rackoff construction滚动自己的30位块密码即可。

对"F“框使用任何您想要的哈希函数(例如,数据murmurhash的低15位加上密钥),并运行任意多轮,结果将是30位数字的可逆伪随机置换。

当然,它不会是“强大的密码”,但30位不可能是任何东西。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6640341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档