zoukankan      html  css  js  c++  java
  • 自然溢出哈希 hack 方法

    今天不知道在什么地方看到这个东西,感觉挺有意思的,故作文以记之(

    (base) 为偶数时,随便造一个长度 (>64) 的字符串,只要它们后 (64) 位相同那么俩字符串的哈希值就相同,直接就卡掉了。

    (base) 为奇数时,对于一个只有 ( ext{a})( ext{b}) 组成的字符串 (s),我们定义 (ar{s}) 为将 (s) 中所有 ( ext{a}) 变为 ( ext{b})( ext{b}) 变为 ( ext{a}) 的结果,然后我们构造 (s_1=" ext{a}",s_i=s_{i-1}+overline{s_{i-1}}),再定义 ( ext{hash}(s)) 为字符串 (s) 的哈希值。那么显然有 ( ext{hash}(s_i)= ext{hash}(s_{i-1}) imes base^{2^{i-2}}+ ext{hash}(overline{s_{i-1}}), ext{hash}(overline{s_i})= ext{hash}(overline{s_{i-1}}) imes base^{2^{i-2}}+ ext{hash}(s_{i-1})),二者相减发现刚好可以表示为 ( ext{hash}(s_i)- ext{hash}(overline{s_i})) 的形式。于是我们记一个 (f_i= ext{hash}(s_i)- ext{hash}(overline{s_i})),那么 (f_i=f_{i-1} imes(base^{2^{i-2}}-1)),而 (base^{2^{x}}-1=(base^{2^{x-1}}+1)(base^{2^{x-2}}+1)cdots(base+1)(base-1)),由 (2 mid base) 知这 (x) 个括号里的东西全是偶数,故 (2^{x+1}mid base^{2^x}-1),于是 (2^{i(i-1)/2}mid f_i),故对于 (ige 12)( ext{hash}(s_i)= ext{hash}(overline{s_i})),构造一个长度 (4096) 的字符串即可叉掉。

    这个故事告诉我们,以后千万不要写自然溢出哈希了

  • 相关阅读:
    LeetCode翻转矩阵后的得分-Python3<六>
    LeetCode子域名访问计数-Python3.7<五>
    LeetCode 键盘行-Python3.7<四>
    流程控制<二>
    Numbers、Strings、Lists 笔记<一>
    LeetCode-数组操作-Python<三>
    LeetCode链表相加-Python<二>
    LeetCode两数之和-Python<一>
    使用Django创建网站项目<二>
    Windows下vue-cli脚手架搭建入门<一>
  • 原文地址:https://www.cnblogs.com/ET2006/p/hash-ull-hack.html
Copyright © 2011-2022 走看看