【发布时间】: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。就像一个保险箱的密码锁。要解密,请减去这些值。