好久没发东西了,这次发个暴力的,SHA-1编码SSE2版,爆破密码专用
原型是别人的代码,我把它改成SSE2版本了。

输入明文和输出密码长度都是5个32位整数,由于是SSE2的关系,输入输出都是并行打包4个。

#include <intrin.h>

#define rol_SSE2(x, y) _mm_or_si128(_mm_slli_epi32((x), (y)), _mm_srli_epi32((x), 32 - (y)))

#define K1_SSE2 _mm_set1_epi32(0x5A827999L)
#define K2_SSE2 _mm_set1_epi32(0x6ED9EBA1L)
#define K3_SSE2 _mm_set1_epi32(0x8F1BBCDCL)
#define K4_SSE2 _mm_set1_epi32(0xCA62C1D6L)

#define F1_SSE2(x, y, z) _mm_xor_si128((z), _mm_and_si128((x), _mm_xor_si128((y), (z))))
#define F2_SSE2(x, y, z) _mm_xor_si128(_mm_xor_si128((x), (y)), (z))
#define F3_SSE2(x, y, z) _mm_or_si128(_mm_and_si128((x), (y)), _mm_and_si128((z), _mm_or_si128((x), (y))))
#define F4_SSE2(x, y, z) _mm_xor_si128(_mm_xor_si128((x), (y)), (z))

#define MG_SSE2(i) (p_idata[i & 0x0f] = rol_SSE2(_mm_xor_si128(_mm_xor_si128(_mm_xor_si128(p_idata[i & 0x0f], p_idata[(i - 14) & 0x0f]), p_idata[(i - 8) & 0x0f]), p_idata[(i - 3) & 0x0f]), 1))

#define R_SSE2(a, b, c, d, e, f, k, m) {e = _mm_add_epi32(_mm_add_epi32(_mm_add_epi32(_mm_add_epi32(e, rol_SSE2(a, 5)), f(b, c, d)), k), m); b = rol_SSE2(b, 30);}

void SHA1_Hash_SSE2(__m128i *idata, __m128i *odata, unsigned short n)
{
    __m128i p_idata[16];

    __m128i a, b, c, d, e;
    unsigned int f;
    
    p_idata[0] = idata[0];
    p_idata[1] = idata[1];
    p_idata[2] = idata[2];
    p_idata[3] = idata[3];
    p_idata[4] = idata[4];

    for(f = 0; f < n; f ++)
    {
        a = _mm_set1_epi32(0x67452301);
        b = _mm_set1_epi32(0xefcdab89);
        c = _mm_set1_epi32(0x98badcfe);
        d = _mm_set1_epi32(0x10325476);
        e = _mm_set1_epi32(0xc3d2e1f0);
    
        p_idata[5] = _mm_set1_epi32(0x00000000);
        p_idata[6] = _mm_set1_epi32(0x00000000);
        p_idata[7] = _mm_set1_epi32(0x00000000);
        p_idata[8] = _mm_set1_epi32(0x00000000);
        p_idata[9] = _mm_set1_epi32(0x00000000);
        p_idata[10] = _mm_set1_epi32(0x00000000);
        p_idata[11] = _mm_set1_epi32(0x00000000);
        p_idata[12] = _mm_set1_epi32(0x00000000);
        p_idata[13] = _mm_set1_epi32(0x00000000);
        p_idata[14] = _mm_set1_epi32(0x00000000);
        p_idata[15] = _mm_set1_epi32(0x000000a0);

        {
            R_SSE2( a, b, c, d, e, F1_SSE2, K1_SSE2, p_idata[ 0] );
            R_SSE2( e, a, b, c, d, F1_SSE2, K1_SSE2, p_idata[ 1]);
            R_SSE2( d, e, a, b, c, F1_SSE2, K1_SSE2, p_idata[ 2] );
            R_SSE2( c, d, e, a, b, F1_SSE2, K1_SSE2, p_idata[ 3] );            
            R_SSE2( b, c, d, e, a, F1_SSE2, K1_SSE2, p_idata[ 4] );            
            R_SSE2( a, b, c, d, e, F1_SSE2, K1_SSE2, p_idata[ 5] );            
            R_SSE2( e, a, b, c, d, F1_SSE2, K1_SSE2,p_idata[ 6] );                
            R_SSE2( d, e, a, b, c, F1_SSE2, K1_SSE2,p_idata[ 7] );                
            R_SSE2( c, d, e, a, b, F1_SSE2, K1_SSE2,p_idata[ 8] );                
            R_SSE2( b, c, d, e, a, F1_SSE2, K1_SSE2,p_idata[ 9] );                
            R_SSE2( a, b, c, d, e, F1_SSE2, K1_SSE2,p_idata[10] );                
            R_SSE2( e, a, b, c, d, F1_SSE2, K1_SSE2,p_idata[11] );                
            R_SSE2( d, e, a, b, c, F1_SSE2, K1_SSE2,p_idata[12] );                
            R_SSE2( c, d, e, a, b, F1_SSE2, K1_SSE2,p_idata[13] );
            R_SSE2( b, c, d, e, a, F1_SSE2, K1_SSE2,p_idata[14] );
            R_SSE2( a, b, c, d, e, F1_SSE2, K1_SSE2,p_idata[15] );
            R_SSE2( e, a, b, c, d, F1_SSE2, K1_SSE2, MG_SSE2(16) );
            R_SSE2( d, e, a, b, c, F1_SSE2, K1_SSE2, MG_SSE2(17) );
            R_SSE2( c, d, e, a, b, F1_SSE2, K1_SSE2, MG_SSE2(18) );
            R_SSE2( b, c, d, e, a, F1_SSE2, K1_SSE2, MG_SSE2(19) );
        }
        {
            R_SSE2( a, b, c, d, e, F2_SSE2, K2_SSE2, MG_SSE2(20) );
            R_SSE2( e, a, b, c, d, F2_SSE2, K2_SSE2, MG_SSE2(21) );
            R_SSE2( d, e, a, b, c, F2_SSE2, K2_SSE2, MG_SSE2(22) );
            R_SSE2( c, d, e, a, b, F2_SSE2, K2_SSE2, MG_SSE2(23) );
            R_SSE2( b, c, d, e, a, F2_SSE2, K2_SSE2, MG_SSE2(24) );
            R_SSE2( a, b, c, d, e, F2_SSE2, K2_SSE2, MG_SSE2(25) );
            R_SSE2( e, a, b, c, d, F2_SSE2, K2_SSE2, MG_SSE2(26) );
            R_SSE2( d, e, a, b, c, F2_SSE2, K2_SSE2, MG_SSE2(27) );
            R_SSE2( c, d, e, a, b, F2_SSE2, K2_SSE2, MG_SSE2(28) );
            R_SSE2( b, c, d, e, a, F2_SSE2, K2_SSE2, MG_SSE2(29) );
            R_SSE2( a, b, c, d, e, F2_SSE2, K2_SSE2, MG_SSE2(30) );
            R_SSE2( e, a, b, c, d, F2_SSE2, K2_SSE2, MG_SSE2(31) );
            R_SSE2( d, e, a, b, c, F2_SSE2, K2_SSE2, MG_SSE2(32) );
            R_SSE2( c, d, e, a, b, F2_SSE2, K2_SSE2, MG_SSE2(33) );
            R_SSE2( b, c, d, e, a, F2_SSE2, K2_SSE2, MG_SSE2(34) );
            R_SSE2( a, b, c, d, e, F2_SSE2, K2_SSE2, MG_SSE2(35) );
            R_SSE2( e, a, b, c, d, F2_SSE2, K2_SSE2, MG_SSE2(36) );
            R_SSE2( d, e, a, b, c, F2_SSE2, K2_SSE2, MG_SSE2(37) );
            R_SSE2( c, d, e, a, b, F2_SSE2, K2_SSE2, MG_SSE2(38) );
            R_SSE2( b, c, d, e, a, F2_SSE2, K2_SSE2, MG_SSE2(39) );
        }
        {
            R_SSE2( a, b, c, d, e, F3_SSE2, K3_SSE2, MG_SSE2(40) );
            R_SSE2( e, a, b, c, d, F3_SSE2, K3_SSE2, MG_SSE2(41) );
            R_SSE2( d, e, a, b, c, F3_SSE2, K3_SSE2, MG_SSE2(42) );
            R_SSE2( c, d, e, a, b, F3_SSE2, K3_SSE2, MG_SSE2(43) );
            R_SSE2( b, c, d, e, a, F3_SSE2, K3_SSE2, MG_SSE2(44) );
            R_SSE2( a, b, c, d, e, F3_SSE2, K3_SSE2, MG_SSE2(45) );
            R_SSE2( e, a, b, c, d, F3_SSE2, K3_SSE2, MG_SSE2(46) );
            R_SSE2( d, e, a, b, c, F3_SSE2, K3_SSE2, MG_SSE2(47) );
            R_SSE2( c, d, e, a, b, F3_SSE2, K3_SSE2, MG_SSE2(48) );
            R_SSE2( b, c, d, e, a, F3_SSE2, K3_SSE2, MG_SSE2(49) );
            R_SSE2( a, b, c, d, e, F3_SSE2, K3_SSE2, MG_SSE2(50) );
            R_SSE2( e, a, b, c, d, F3_SSE2, K3_SSE2, MG_SSE2(51) );
            R_SSE2( d, e, a, b, c, F3_SSE2, K3_SSE2, MG_SSE2(52) );
            R_SSE2( c, d, e, a, b, F3_SSE2, K3_SSE2, MG_SSE2(53) );
            R_SSE2( b, c, d, e, a, F3_SSE2, K3_SSE2, MG_SSE2(54) );
            R_SSE2( a, b, c, d, e, F3_SSE2, K3_SSE2, MG_SSE2(55) );
            R_SSE2( e, a, b, c, d, F3_SSE2, K3_SSE2, MG_SSE2(56) );
            R_SSE2( d, e, a, b, c, F3_SSE2, K3_SSE2, MG_SSE2(57) );
            R_SSE2( c, d, e, a, b, F3_SSE2, K3_SSE2, MG_SSE2(58) );
            R_SSE2( b, c, d, e, a, F3_SSE2, K3_SSE2, MG_SSE2(59) );
        }
        {
            R_SSE2( a, b, c, d, e, F4_SSE2, K4_SSE2, MG_SSE2(60) );
            R_SSE2( e, a, b, c, d, F4_SSE2, K4_SSE2, MG_SSE2(61) );
            R_SSE2( d, e, a, b, c, F4_SSE2, K4_SSE2, MG_SSE2(62) );
            R_SSE2( c, d, e, a, b, F4_SSE2, K4_SSE2, MG_SSE2(63) );
            R_SSE2( b, c, d, e, a, F4_SSE2, K4_SSE2, MG_SSE2(64) );
            R_SSE2( a, b, c, d, e, F4_SSE2, K4_SSE2, MG_SSE2(65) );
            R_SSE2( e, a, b, c, d, F4_SSE2, K4_SSE2, MG_SSE2(66) );
            R_SSE2( d, e, a, b, c, F4_SSE2, K4_SSE2, MG_SSE2(67) );
            R_SSE2( c, d, e, a, b, F4_SSE2, K4_SSE2, MG_SSE2(68) );
            R_SSE2( b, c, d, e, a, F4_SSE2, K4_SSE2, MG_SSE2(69) );
            R_SSE2( a, b, c, d, e, F4_SSE2, K4_SSE2, MG_SSE2(70) );
            R_SSE2( e, a, b, c, d, F4_SSE2, K4_SSE2, MG_SSE2(71) );
            R_SSE2( d, e, a, b, c, F4_SSE2, K4_SSE2, MG_SSE2(72) );
            R_SSE2( c, d, e, a, b, F4_SSE2, K4_SSE2, MG_SSE2(73) );
            R_SSE2( b, c, d, e, a, F4_SSE2, K4_SSE2, MG_SSE2(74) );
            R_SSE2( a, b, c, d, e, F4_SSE2, K4_SSE2, MG_SSE2(75) );
            R_SSE2( e, a, b, c, d, F4_SSE2, K4_SSE2, MG_SSE2(76) );
            R_SSE2( d, e, a, b, c, F4_SSE2, K4_SSE2, MG_SSE2(77) );
            R_SSE2( c, d, e, a, b, F4_SSE2, K4_SSE2, MG_SSE2(78) );
            R_SSE2( b, c, d, e, a, F4_SSE2, K4_SSE2, MG_SSE2(79) );
        }
    
        p_idata[0] = _mm_add_epi32(a, _mm_set1_epi32(0x67452301));
        p_idata[1] = _mm_add_epi32(b, _mm_set1_epi32(0xefcdab89));
        p_idata[2] = _mm_add_epi32(c, _mm_set1_epi32(0x98badcfe));
        p_idata[3] = _mm_add_epi32(d, _mm_set1_epi32(0x10325476));
        p_idata[4] = _mm_add_epi32(e, _mm_set1_epi32(0xc3d2e1f0));
    }
    
    odata[0] = p_idata[0];
    odata[1] = p_idata[1];
    odata[2] = p_idata[2];
    odata[3] = p_idata[3];
    odata[4] = p_idata[4];
}
+500  科创币    joyeep   2010-01-09    鼓励
+500  科创币    我说要有光   2010-01-09    开放源代码的分享
来自:计算机科学 / 软件综合
 
小俊 作者
12年0个月前
1楼
在QX9650上开4个线程跑,4个核全占满,每秒不到4000万次hash loop,比原版快了1倍多。
不过与CUDA版相比还是差太远,GTX285能跑到每秒2亿多次hash loop。
回复
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
lovehongkong
12年0个月前
2楼
- -其实是用来干嘛的?
回复
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
dctyu
12年0个月前
3楼
SHA-1是能暴力的东西吗?????????????

是我火星了。暴力是最终手段。所以。。。。。
回复
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
小俊作者
12年0个月前
4楼
引用第3楼dctyu于2010-01-09 23:10发表的  :
SHA-1是能暴力的东西吗?????????????

是我火星了。暴力是最终手段。所以。。。。。


SHA-1的计算速度越快,就越增加暴力穷举密码命中的可能。
回复
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
darkstorm
12年0个月前
5楼
GPU暴力,才是真暴力 [s:252]
回复
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
phpskycn
12年0个月前
6楼
晕问个问题
如果用两颗8核XEON或者3块GT200+2GBGDDR5/块本地缓存,暴力一个16位数字字母混合的Sha-1 hash要多久?
回复
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
小俊作者
12年0个月前
7楼
引用第6楼phpskycn于2010-01-11 21:24发表的  :
晕问个问题
如果用两颗8核XEON或者3块GT200+2GBGDDR5/块本地缓存,暴力一个16位数字字母混合的Sha-1 hash要多久?


首先要看看原加密过程是经过多少次hash loop。如果是只有几次,那密码尝试的速度肯定很快,但如果像Office2007那样用50000次,那么一块GT200每秒顶多尝试4000多个密码(已经比CPU快很多了)

16位数字字母混合,假如是Office2007密码,如果不算大小写,那么全搜索得尝试约8×10^24次。所以即使集合全世界的GT200(暂且估算为几百万块),那么也要千万年。所以实际应用肯定不会全穷举,而且SHA-1是有碰撞的,运气好的话可能很快就碰到,而且也有方法可以大幅提高碰撞的几率。

GPU顶多能提高2个数量级的速度。但在某些领域的暴力破解上(例如Wifi密码),能把理论破解时间从数个月缩短到数天甚至数小时,从而实用化。
回复
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
phpskycn
12年0个月前
8楼
顺便问LZ个问题
CUDA3开始支持C++了,但是CUDA3一定要在下一代的GT300上才能跑吗?
回复
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
小俊作者
12年0个月前
9楼
引用第8楼phpskycn于2010-01-11 22:26发表的  :
顺便问LZ个问题
CUDA3开始支持C++了,但是CUDA3一定要在下一代的GT300上才能跑吗?


如果写的程序使用了新特性,那就必须在Fermi上跑,否则的话旧架构也能跑。
回复
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
dctyu
12年0个月前
10楼
开发病毒,在别人的电脑上算。不用管理,均匀随机取数就行了。算成功的节点做自我变异,再继续传播。终会传播到自己这里来的。

另外,我接受计算机病毒就是一种生命形式的说法。不是比喻,而是符合定义。迟早有一天,病毒的智能达到控制不了的程度。然后人类被统治和奴役。
回复
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
小俊作者
12年0个月前
11楼
引用第10楼dctyu于2010-01-22 20:43发表的  :
开发病毒,在别人的电脑上算。不用管理,均匀随机取数就行了。算成功的节点做自我变异,再继续传播。终会传播到自己这里来的。

另外,我接受计算机病毒就是一种生命形式的说法。不是比喻,而是符合定义。迟早有一天,病毒的智能达到控制不了的程度。然后人类被统治和奴役。


搞分布式?这是个好方法,直接分发被破解文件的片段和不同的字典规则到每台肉鸡,让它们慢慢算。。。
回复
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
AnthraX
12年0个月前
12楼
好久没来了,一来就看到好贴

sha-1一般用在数字签名比较多吧,好像很少用来当密码hash,我倒是有个程序可以生成hash一样但是实际内容不同的两个文件(碰撞)。
不知道MD5^2暴力破起来速度如何?这是目前大多数论坛和网站系统的密码hash方法
回复
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
小俊作者
12年0个月前
13楼
引用第12楼AnthraX于2010-01-25 11:47发表的  :
好久没来了,一来就看到好贴

sha-1一般用在数字签名比较多吧,好像很少用来当密码hash,我倒是有个程序可以生成hash一样但是实际内容不同的两个文件(碰撞)。
不知道MD5^2暴力破起来速度如何?这是目前大多数论坛和网站系统的密码hash方法


SHA-1做密码hash其实挺常见的,例如Office2007是50000次SHA-1加AES,WinRAR(3.0以上版本)是262144次SHA-1加AES。利用GPU暴力破解这类密码有先天优势,MD5没有测过,不过一般比CPU快几十倍没有问题。
回复
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
phpskycn
12年0个月前
14楼
多次MD5……Sha-1
GF100快出现!
回复
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
al586
11年11个月前
15楼
[s:94]   牛人
回复
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
kileven
11年10个月前
16楼
楼主好,小弟正在研究利用CUDA 破解SHA-1算法,可否给我提供点思路,不胜感激。
E-mail:826941283@XXXXXX
回复
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
stitch
11年10个月前
17楼
引用第16楼kileven于2010-03-08 12:36发表的  :
楼主好,小弟正在研究利用CUDA 破解SHA-1算法,可否给我提供点思路,不胜感激。
E-mail:826941283@XXXXXX

专为伸手而注册ID…………………………
回复
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
小俊作者
11年10个月前
18楼
引用第16楼kileven于2010-03-08 12:36发表的  :
楼主好,小弟正在研究利用CUDA 破解SHA-1算法,可否给我提供点思路,不胜感激。
E-mail:826941283@XXXXXX


这个非常好写啊,每执行一次kernel,每个线程破一个密码,字典预先放在global memory然后每个线程从不同的地址取出不同的密码来并行尝试就可以了。
回复
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
dctyu
11年8个月前
19楼
在暴力的基础上给点思路。缩小范围也行啊。
回复
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
小俊
进士 学者 机友 笔友
文章
71
回复
1158
学术分
47
2006/12/29注册,3 个月前活动
暂无简介
%7B%22isDisplay%22%3Atrue%7D
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
插入资源
全部
图片
视频
音频
附件
全部
未使用
已使用
正在上传
空空如也~
上传中..{{f.progress}}%
处理中..
上传失败,点击重试
等待中...
{{f.name}}
空空如也~
(视频){{r.oname}}
{{selectedResourcesId.indexOf(r.rid) + 1}}
处理中..
处理失败
插入表情
我的表情
共享表情
Emoji
上传
注意事项
最大尺寸100px,超过会被压缩。为保证效果,建议上传前自行处理。
建议上传自己DIY的表情,严禁上传侵权内容。
点击重试等待上传{{s.progress}}%处理中...已上传
空空如也~
草稿箱
加载中...
此处只插入正文,如果要使用草稿中的其余内容,请点击继续创作。
{{fromNow(d.toc)}}
{{getDraftInfo(d)}}
标题:{{d.t}}
内容:{{d.c}}
继续创作
删除插入插入
{{forum.displayName}}
{{forum.countThreads}}
篇文章,
{{forum.countPosts}}
条回复
{{forum.description || "暂无简介"}}
ID: {{user.uid}}
学术分隐藏
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

支持的图片格式:jpg, jpeg, png
插入公式
分享回复:{{shareId}}
加载中...
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
加入关注取消关注
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
建议修改
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也