我正在尝试针对用 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
- 将每个选定项目的
键
相加;这是最终的验证散列 - 重要提示:验证器将接受此散列及其非零倍数(即:如果最终散列等于 1111,则 2222、3333、8888 等也有效)。
例如,假设我选择:
Bow (1)
Sword (2)
Staff (10)
Shield (1)
Potion (6)
该算法将这些字符串中的每一个都变成小写,计算它们的字符串哈希值,将该哈希值乘以为每个字符串选择的数字,然后将这些键加在一起。
例如:
Final_Validation_Hash = 1*HASH(弓)+ 2*HASH(剑)+ 10*HASH(法杖)+ 1*HASH(盾)+ 6*HASH(药水)
通过欧拉法的应用,我打算证明这些散列不是唯一的,并且想设计一个简单的应用来证明这一点。
在我的例子中,对于 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
级的递归算法,然后处理所有剩余可能组合的递增、测试等。效率不是很高,但是可以。我可以根据要求提供(太大而无法在此处发布)。
最佳答案
在我看来,大多数用户会为每个项目选择相当小的数字(毕竟“2”比“438483”更容易记住)。
鉴于该限制,蛮力实际上可能是合理的。
简单地为 5 个符号生成所有可能的输入值加上一个 1..99 范围内的数字,计算生成的哈希值,并计算(例如使用字典)产生给定哈希值的不同组合的数量应该给出对最可能输入值的哈希分布的经验理解。
从那里我会查看实际生成了多少个不同的哈希值(如果哈希是 Int32,则在 2^32 个可能的哈希值中),以及查找以特定频率生成的哈希值(在词典中有很高的计数)。
关于c - 简单加密 - C 中的哈希总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11000440/