【发布时间】:2012-06-12 16:03:23
【问题描述】:
我正在尝试针对用 C 编写的游戏中的一段代码中的漏洞演示一个简单的概念证明。
假设我们要验证字符登录。登录由用户从图形菜单中选择n 项目(我们现在假设n=5)处理。这些物品都是中世纪的主题:
例如:
_______________________________
| | | |
| Bow | Sword | Staff |
|-----------|-----------|-------|
| Shield | Potion | Gold |
|___________|___________|_______|
用户必须点击每个项目,然后为每个项目选择一个数字。
验证算法然后执行以下操作:
- 确定选择了哪些项目
- 将每个字符串删除为小写(即:
Bow变为bow等) - 为每个字符串计算一个简单的字符串哈希(即:`bow => b=2, o=15, w=23, sum = (2+15+23=40)
- 将哈希乘以用户为相应项目选择的值;这个新值称为
key - 将每个选定项目的
keys相加;这是最终的验证哈希 - 重要提示:验证器将接受此哈希以及它的非零倍数(即:如果最终哈希等于 1111,则 2222、3333、8888 等也是有效的)。
例如,假设我选择:
Bow (1)
Sword (2)
Staff (10)
Shield (1)
Potion (6)
该算法将这些字符串中的每一个都删除为小写,计算它们的字符串哈希,将该哈希乘以为每个字符串选择的数字,然后将这些键相加。
例如:
Final_Validation_Hash = 1*HASH(Bow) + 2*HASH(Sword) + 10*HASH(Staff) + 1*HASH(Shield) + 6*HASH(Potion)
通过应用欧拉方法,我打算证明这些哈希不是唯一的,并想设计一个简单的应用程序来证明它。
就我而言,对于 5 个项目,我基本上会尝试计算:
(B)(y) = (A_1)(x_1) + (A_2)(x_2) + (A_3)(x_3) + (A_4)(x_4) + (A_5)(x_5)
地点:
B is arbitrary
A_j are the selected coefficients/values for each string/category
x_j are the hash values for each string/category
y is the final validation hash (eg: 1111 above)
B,y,A_j,x_j are all discrete-valued, positive, and non-zero (ie: natural numbers)
有人可以帮助我解决这个问题或给我指出一个类似的例子(例如:代码、计算出的方程式等)吗?我只需要解决最后一步(即:(B)(Y)= ...)。
最后,我编写了一个递归算法,该算法深入n 级别,然后处理所有剩余可能组合的递增、测试等。效率不是很高,但它确实有效。我可以根据要求提供(太大,无法在此处发布)。
【问题讨论】:
-
已更新。好点子。谢谢。 +1
-
您在实施时遇到了哪些问题?
-
您是否需要证明以这种方式生成的哈希对于所选字符串不会是唯一的?
-
我唯一想不通的是总和本身的计算。我尝试了矩阵代数,但它并不像我想象的那么简单,尤其是要求所有系数都是正数且非零(即:非平凡解)。
-
@phoxis:没错。我需要证明哈希是非唯一的,并且我可以快速生成重复的哈希。
标签: c algorithm math linear-algebra discrete-mathematics