【问题标题】:Obsfucate a 5 digit number混淆 5 位数字
【发布时间】:2013-01-30 22:18:00
【问题描述】:

我希望混淆一个 5 位数字

我关心的混淆数字的属性:

  • 不可能(或作为后备,极不可能)与其他混淆数字发生冲突
  • 也是一个 5 位数字(请不要使用字母字符)
  • 普通人在没有计算辅助的情况下不容易确定(例如,它不是像“乘以 2 并减去 5”这样的显而易见的东西
  • 它是一种算法......而不是将所有可能的 5 位数字的查找表存储到其对应的哈希值或其他一些“蛮力”技术

我不关心的混淆数字的属性:

  • 它是否可重复,即如果“12345”总是导致“73624”,我可以
  • 无论它是否具有加密安全性

到目前为止,我还没有找到任何符合我要求的东西……但我希望这是由于记忆力差、教育不完整或生活方式选择可疑,而不是没有“好的”解决方案。

一个可以轻松翻译成 C# 的示例将是一个奖励。

更新:

我目前正在研究使用做一个简单位映射的想法。

   static List<int> bitMapping = new List<int>() { 8, 6, 9, 3, 7, 5, ... etc... };

    private static int Obfuscate(int number)
    {
        var bits = new bool[bitMapping.Count];
        foreach (var ordinal in bitMapping)
        {
            var mask = (int)Math.Pow(2, ordinal);
            var bit = (mask & number) == mask;
            var mappedOrdinal = bitMapping[ordinal];
            bits[mappedOrdinal] = bit;
        }

        var obfuscatedNumber = 0;
        for (var ordinal = 0; ordinal < bits.Length; ordinal++)
        {
            if (bits[ordinal])
            {
                obfuscatedNumber += (int)Math.Pow(2, ordinal);
            }
        }
        return obfuscatedNumber;

到目前为止,它似乎满足了我的大部分要求。

【问题讨论】:

  • 根据定义,哈希是可重复的。如果您不关心该属性,为什么不将数字替换为伪随机生成的数字?
  • 如果你不关心一致性“我不关心:它是否可重复”然后返回随机值
  • 它将存储在哪里?我问是因为乘以 2 并减去 5 不容易被用户仅查看数值来解密..它本来可以是任何东西..
  • 你想确保两个 5 位随机数不会相同?!你不能,但不太可能。我认为是时候解释一下它的用途以及您打算如何使用它了。
  • 一种方法:为每个数字添加一个偏移量,并进行环绕以使它们保持数字 - 每个位置一个固定的偏移量,例如 3、5、7、4 和 8。就像一个保险箱的密码锁。要解密,请减去这些值。

标签: c# algorithm hash


【解决方案1】:

这可能对您的需求来说太简单了,但是 XOR 操作是可行的并且可能不像加法那么明显:

12345 ^ 65535 = 53190
53190 ^ 65535 = 12345

如 cmets 中所述,第二个操作数的格式为 (2n - 1) 以避免冲突(这样原始数字中的每一位都被反转)很重要。它还需要足够长,使其位数大于或等于第一个操作数。

您可能还需要向左填充 0 以使结果成为 5 位数字。

【讨论】:

  • 比我聪明的人可能会说出原因,但我怀疑会与此发生冲突,因为 XOR 是可交换的。也许如果您保持密钥不变,那么它不会成为问题?这只是猜测,因为我没有足够的研究来反驳你的答案。
  • 如果您选择第二个常数,使其为 2 减 1 的幂(即二进制中的所有 1),则不会发生冲突。
  • 啊,谢谢你的解释。那讲得通。如果您进行一系列 XOR 和加法运算会怎样?这会是合法的 1:1 替换吗?
  • 会的,因为 2 bijections 的组合是双射。
  • 我觉得那样会使数字变得非常难以去混淆。并不是说它不可能破解,但我肯定需要一些时间才能弄清楚,哈!
【解决方案2】:

如果你不想发生冲突,那么乘法/除法就不行了。在这种情况下,我会

  1. 为您的号码添加一个 5 位数的种子值,如果它溢出到六位数,则丢弃第六个。

  2. 以某种一致的方式重新排列数字。

例如

丢弃溢出后的 12345 + 97531 = 109876 或 09876 重新订购到 68097

【讨论】:

  • “如果您不想发生冲突”与“以某种方式重新排列数字”有何关联?
  • 它没有。在忽略溢出或下溢的任何乘法或除法中,冲突将是固有的。即 00000*5 =0, 2000*5 = 100000 舍入为 00000,00020/5 = 00004, 00021/5 = 00004.2 舍入为 00004。
猜你喜欢
  • 2014-07-15
  • 2015-07-20
  • 2011-09-21
  • 1970-01-01
  • 2021-11-05
  • 1970-01-01
  • 1970-01-01
  • 2023-02-13
  • 2020-05-07
相关资源
最近更新 更多