好久没发东西了,这次发个暴力的,SHA-1编码SSE2版,爆破密码专用
小俊2010/01/09软件综合 IP:北京
原型是别人的代码,我把它改成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 开放源代码的分享
来自:计算机科学 / 软件综合
20
 
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
小俊 作者
15年2个月前 IP:未同步
176580
在QX9650上开4个线程跑,4个核全占满,每秒不到4000万次hash loop,比原版快了1倍多。
不过与CUDA版相比还是差太远,GTX285能跑到每秒2亿多次hash loop。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
lovehongkong
15年2个月前 IP:未同步
176583
- -其实是用来干嘛的?
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
dctyu
15年2个月前 IP:未同步
176589
SHA-1是能暴力的东西吗?????????????

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

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


SHA-1的计算速度越快,就越增加暴力穷举密码命中的可能。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
darkstorm
15年2个月前 IP:未同步
176919
GPU暴力,才是真暴力 [s:252]
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
phpskycn
15年2个月前 IP:未同步
177022
晕问个问题
如果用两颗8核XEON或者3块GT200+2GBGDDR5/块本地缓存,暴力一个16位数字字母混合的Sha-1 hash要多久?
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
小俊作者
15年2个月前 IP:未同步
177049
引用第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
15年2个月前 IP:未同步
177064
顺便问LZ个问题
CUDA3开始支持C++了,但是CUDA3一定要在下一代的GT300上才能跑吗?
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
小俊作者
15年2个月前 IP:未同步
177069
引用第8楼phpskycn于2010-01-11 22:26发表的  :
顺便问LZ个问题
CUDA3开始支持C++了,但是CUDA3一定要在下一代的GT300上才能跑吗?


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

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

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


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

sha-1一般用在数字签名比较多吧,好像很少用来当密码hash,我倒是有个程序可以生成hash一样但是实际内容不同的两个文件(碰撞)。
不知道MD5^2暴力破起来速度如何?这是目前大多数论坛和网站系统的密码hash方法
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
小俊作者
15年1个月前 IP:未同步
181062
引用第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
15年1个月前 IP:未同步
181078
多次MD5……Sha-1
GF100快出现!
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
al586
15年0个月前 IP:未同步
194257
[s:94]   牛人
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
kileven
15年0个月前 IP:未同步
199187
楼主好,小弟正在研究利用CUDA 破解SHA-1算法,可否给我提供点思路,不胜感激。
E-mail:826941283@XXXXXX
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
stitch
15年0个月前 IP:未同步
199188
引用第16楼kileven于2010-03-08 12:36发表的  :
楼主好,小弟正在研究利用CUDA 破解SHA-1算法,可否给我提供点思路,不胜感激。
E-mail:826941283@XXXXXX

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


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

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

所属专业
上级专业
同级专业
小俊
进士 学者 机友 笔友
文章
71
回复
1156
学术分
47
2006/12/29注册,3个月6天前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:未同步
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

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