代码之家  ›  专栏  ›  技术社区  ›  ʞɔıu

加密单个int的方法

  •  9
  • ʞɔıu  · 技术社区  · 15 年前

    你怎么能便宜地双向加密一个32位的int,这样每个数字都映射到该空间中的其他int,然后以一种难以预测的方式返回呢?

    当然,不需要在映射表中预先存储42.9亿个整数。

    10 回复  |  直到 15 年前
        1
  •  19
  •   Theran    15 年前

    你想要的是一个32位的分组密码。不幸的是,由于 weaknesses of a short block size .如果您可以处理比输入大两倍的加密int,那么您可以使用blowfish、tdes或其他经过良好审查的64位块密码。

    如果您真的需要32位,并且不介意降低的安全性,那么就可以很容易地将feistel网络密码(如blowfish)修剪为2的倍数,小于起始密码的任何块长度。为了 Blowfish ,只需在两个半块之间均匀地拆分输入数字,并将f函数的输出和p值减至目标块大小的1/2。这一切都可以在像往常一样键入算法之后完成。

        2
  •  7
  •   Zifre    15 年前

    显然,您需要某种随机密钥才能保证安全。在这种情况下:

    int original = 42;
    int key = give_me_a_random_int();
    
    int encrypted = original ^ key;
    int unencrypted = encrypted ^ key;
    
    // now, unencrypted == original == 42
    

    这只是一个简单的XOR。再次XORing将反转此过程。

    另外,我要注意的是,这只对一次使用是安全的。它叫做 One time pad . 如果对非随机数据使用同一个密钥两次,攻击者可能会对其进行解密。

        3
  •  5
  •   Emre Yazici    14 年前

    使用32位块密码,skip32是我找到的唯一一个: http://www.qualcomm.com.au/PublicationsDocs/skip32.c

        4
  •  1
  •   nonopolarity    15 年前

    一种方法是使用秘密的32位数字执行异或。当您再次使用这个秘密号码执行异或时,它将返回到原始号码。这很快,但不是很安全。如果需要一个安全的方法,我也会有兴趣在这里看到其他方法。

        5
  •  1
  •   Alex Gartrell    15 年前

    使用标准算法和随机填充(假设密文不需要与平面文本相同的长度)。

    所以,基本上,使用一个标准的算法,使用链接,在它前面插入四个随机的32位数字。这将有助于掩盖32位消息中的任何规则/冗余。见鬼,如果你愿意的话,也在最后垫上。

    基本上,你写得越少越好。每个人都搞砸了。

        6
  •  0
  •   Guffa    15 年前

    有两个简单且可逆的操作可用于对整数值进行置乱。您可以使用XOR操作,并且可以交换数字中的位。

    如果您同时使用这两种方法,那么找出所使用的方法就不是那么简单了。他们会互相保护。

        7
  •  0
  •   gradbot    15 年前

    如果您只需要一些普通用户不会注意到的真正简单的东西,那么就使用一系列XOR和SHIFT操作符。

    不使用数组来存储大约40亿个整数的问题是,您需要一个函数,该函数在40亿个整数的域中执行一对一的随机映射。您可以混合一些XOR和移位操作符来创建自己的,但这并不难破解。即使有一张众所周知的一对一地图,它也会失败。如果没有盐,有人可以制作一个简单的彩虹桌来打破它。

    SALT双向通信的问题在于,您必须安全地通信它。盐必须是秘密的,一旦你知道它们是什么,它们就毫无意义了。

    如果你想建立一个安全的沟通渠道 Off-the-Record Messaging Protocol version 2 . 它将给您一个例子,说明通信加密的复杂性。我建议你找到一些其他人已经创建和测试过的众所周知的东西。即使你确实使用了别人创造的东西,如果你使用不当,它也会失败。

        8
  •  0
  •   Accipitridae    15 年前

    取32位输入,将其分为两个16位半L和R,然后重复 以下步骤:计算一个伪随机函数r,xor,这个伪随机函数的结果到l,交换l和r,这是一个 Luby-Rackoff 建设。伪随机函数不需要是可逆的。例如,您可以使用块密码,加密16位,并将结果剪切为16位。确保并非所有回合都使用相同的伪随机函数(rsp)。使用不同的圆键)。

        9
  •  0
  •   msotoodeh    9 年前

    查看:github.com/msotoodeh/integer-encoder项目。它支持32位和64位整数。

        10
  •  -1
  •   Joshua    15 年前

    我曾经使用XOR+ADD和64位密钥。我还经常每隔几分钟更改一次密钥,并尝试用当前或以前的密钥解密。(在我的域中,整数的安全性不需要超过四分钟。)