好久没发东西了,这次发个暴力的,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    开放源代码的分享
来自:计算机科学 / 软件综合
 
2010-1-9 22:40:19
小俊(作者)
1楼
在QX9650上开4个线程跑,4个核全占满,每秒不到4000万次hash loop,比原版快了1倍多。
不过与CUDA版相比还是差太远,GTX285能跑到每秒2亿多次hash loop。
折叠评论
加载评论中,请稍候...
折叠评论
2010-1-9 22:59:29
2楼
- -其实是用来干嘛的?
折叠评论
加载评论中,请稍候...
折叠评论
3楼
SHA-1是能暴力的东西吗?????????????

是我火星了。暴力是最终手段。所以。。。。。
折叠评论
加载评论中,请稍候...
折叠评论
小俊(作者)
4楼
引用第3楼dctyu于2010-01-09 23:10发表的  :
SHA-1是能暴力的东西吗?????????????

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


SHA-1的计算速度越快,就越增加暴力穷举密码命中的可能。
折叠评论
加载评论中,请稍候...
折叠评论
2010-01-11 13:30:23
2010-1-11 13:30:23
5楼
GPU暴力,才是真暴力 [s:252]
折叠评论
加载评论中,请稍候...
折叠评论
6楼
晕问个问题
如果用两颗8核XEON或者3块GT200+2GBGDDR5/块本地缓存,暴力一个16位数字字母混合的Sha-1 hash要多久?
折叠评论
加载评论中,请稍候...
折叠评论
小俊(作者)
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密码),能把理论破解时间从数个月缩短到数天甚至数小时,从而实用化。
折叠评论
加载评论中,请稍候...
折叠评论
8楼
顺便问LZ个问题
CUDA3开始支持C++了,但是CUDA3一定要在下一代的GT300上才能跑吗?
折叠评论
加载评论中,请稍候...
折叠评论
小俊(作者)
9楼
引用第8楼phpskycn于2010-01-11 22:26发表的  :
顺便问LZ个问题
CUDA3开始支持C++了,但是CUDA3一定要在下一代的GT300上才能跑吗?


如果写的程序使用了新特性,那就必须在Fermi上跑,否则的话旧架构也能跑。
折叠评论
加载评论中,请稍候...
折叠评论
2010-01-22 20:43:36
2010-1-22 20:43:36
10楼
开发病毒,在别人的电脑上算。不用管理,均匀随机取数就行了。算成功的节点做自我变异,再继续传播。终会传播到自己这里来的。

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

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


搞分布式?这是个好方法,直接分发被破解文件的片段和不同的字典规则到每台肉鸡,让它们慢慢算。。。
折叠评论
加载评论中,请稍候...
折叠评论
2010-01-25 11:47:55
2010-1-25 11:47:55
12楼
好久没来了,一来就看到好贴

sha-1一般用在数字签名比较多吧,好像很少用来当密码hash,我倒是有个程序可以生成hash一样但是实际内容不同的两个文件(碰撞)。
不知道MD5^2暴力破起来速度如何?这是目前大多数论坛和网站系统的密码hash方法
折叠评论
加载评论中,请稍候...
折叠评论
小俊(作者)
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快几十倍没有问题。
折叠评论
加载评论中,请稍候...
折叠评论
14楼
多次MD5……Sha-1
GF100快出现!
折叠评论
加载评论中,请稍候...
折叠评论
2010-02-22 05:50:32
2010-2-22 5:50:32
15楼
[s:94]   牛人
折叠评论
加载评论中,请稍候...
折叠评论
2010-03-08 12:36:59
2010-3-8 12:36:59
16楼
楼主好,小弟正在研究利用CUDA 破解SHA-1算法,可否给我提供点思路,不胜感激。
E-mail:826941283@qq.com
折叠评论
加载评论中,请稍候...
折叠评论
17楼
引用第16楼kileven于2010-03-08 12:36发表的  :
楼主好,小弟正在研究利用CUDA 破解SHA-1算法,可否给我提供点思路,不胜感激。
E-mail:826941283@qq.com

专为伸手而注册ID…………………………
折叠评论
加载评论中,请稍候...
折叠评论
2010-03-13 22:36:56
2010-3-13 22:36:56
小俊(作者)
18楼
引用第16楼kileven于2010-03-08 12:36发表的  :
楼主好,小弟正在研究利用CUDA 破解SHA-1算法,可否给我提供点思路,不胜感激。
E-mail:826941283@qq.com


这个非常好写啊,每执行一次kernel,每个线程破一个密码,字典预先放在global memory然后每个线程从不同的地址取出不同的密码来并行尝试就可以了。
折叠评论
加载评论中,请稍候...
折叠评论
2010-05-14 16:21:27
2010-5-14 16:21:27
19楼
在暴力的基础上给点思路。缩小范围也行啊。
折叠评论
加载评论中,请稍候...
折叠评论

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

小俊
学者 机友 笔友
文章
71
回复
1155
学术分
47
2006/12/29注册,1 天前活动
暂无简介
插入资源
全部
图片
视频
音频
附件
全部
未使用
已使用
正在上传
空空如也~
上传中..{{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}}
学术分隐藏
{{submitted?"":"投诉"}}
请选择违规类型:
{{reason.description}}
支持的图片格式:jpg, jpeg, png