在c#中将6位数字加密为另一个6位数字

时间:2011-09-08 06:06:41

标签: c# encryption

我想加密一个id并传递给一个链接......例如

id=196
encryptedid=345
randno=234
encryptedrandno=456
id=encryptedid+encryptedrandno
link: id
so when user clikcs that link at backend 
id=id-encryptedrandno(which gives us encryptedid)
id=decrypt(id)

请告诉我这个逻辑 我正在使用c#web应用程序

1 个答案:

答案 0 :(得分:6)

有三个数字(现在是编辑问题后的六个),你基本上得到了一个非常小的源和目标域 - 我希望这不是重要的事情。

有效地在值之间创建bimap的最简单方法可能是创建值0-999的列表,并将其混洗(以某种可重现的方式)。然后,您可以通过获取特定索引处的值来“加密”,并通过查找该值的索引来“解密”:

int id = ...;
int encrypted = shuffledValues[id];
int decrypted = shuffledValues.IndexOf(encrypted);

您可以通过构建字典来更快地“解密”,请注意:

Dictionary<int, int> decryptionDictionary =
    shuffledValues.Select((value, index) => new { value, index })
                  .ToDictionary(p => p.value, p => p.index);

这显然需要比传统加密方法更多的内存,但编码非常简单。

与几乎任何其他安全问题不同,我认为在这种情况下使用System.Random进行改组并不是太糟糕 - 但这不是因为Random通常适用于安全用途;这是因为你有一个非常小的潜在价值范围。

我会认真地尝试将远离使用3位数ID。

另一种方法是生成新的GUID。在您的数据库中,存储原始ID和生成的GUID,并将GUID交还给客户端(例如,在链接上)。收到GUID后,您可以在数据库中执行查询以获取原始数据。

编辑:即使是6位数的ID也不会比原来的3好多了。很容易尝试每一百万个数字,因此攻击可以快速访问每个可能的链接。每秒获取十个链接,他们可以在不到两天的时间内获取所有链接。即使有速率限制,你仍然远离安全。

换句话说:如果有人要求你为网站选择一个密码,但是说它只需要6位数,那你觉得有多安全?