1

我想混淆一个 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;

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

4

2 回答 2

2

That might be too simple for your needs, but something that works and might not be as obvious as an addition is the XOR operation :

12345 ^ 65535 = 53190
53190 ^ 65535 = 12345

As noted in comments it is important that the second operand is of the form (2n - 1) to avoid collisions (so that every bit in the original number is inverted). It also needs to be long enough that its number of bits is greater or equal than the first operand.

You might also have to pad-left with 0's to make the result a 5-digit number.

于 2013-01-30T00:31:40.880 回答
0

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

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

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

例如

丢弃溢出后 12345 + 97531 = 109876 或 09876 重新排序为 68097

于 2013-01-30T00:18:04.783 回答