南航计算机学院第六期科创

0x00

em… 科创成功结题了,总要写点什么

差不多是去年9,10月左右吧,那时候组队接下了这个题目,“基于sha256算法及并行编程语言的快速密码破解方法研究与实现”。 然后就开始填项目申报书,开题报告啥的,查各种资料,差不多今年一月左右审核结束,审核完了就正式开始了。 今年6月份有一次中期检查(也是我第一次上台答辩233),那次比较水,去参加答辩的队伍都让通过了。 然后今年10月结题形式改成了成果展示,有学弟学妹学长学姐评委老师来围观。 然后今天下午结果公示,科创通过了…

0x01

那么,我们做的这个项目是个啥呢?

网络传输中密码如果用明文传输,或者数据库中密码用明文保存,那么只要能够获取到这部分数据就可以轻而易举的拿到密码。 这时采取的一种策略是进行hash加密,简单理解就是一种理论上不可逆的加密(无法从密文计算出明文)。 或者一些软件或文件被恶意修改之后放在网上,不经意下载安装就存在安全问题。 这时可以对软件/文件进行hash校验和,根据hash值是否相等来判断软件/文件是否被修改过。

而我们的项目就是破解hash算法家族的其中一种(sha256)(怎么越解释越像在做坏事…)

0x02

破解过程类似暴力破解,借鉴一种时空折中算法(权衡时间和空间使其理论可行),预先生成一张彩虹表,破解时进行查表获取明文。

彩虹表长什么样?

一条彩虹表有许多条彩虹链组成,一条彩虹链上有许多结点,一个结点对应一个明文/密文。 由于彩虹表数据量十分庞大(反正你买不起那么大的硬盘),最后只选择存储每条链的第一个结点和最后一个结点(一般一个结点占8个字节(64bit)),需要时不是直接查表,而是先取出这些彩虹链将其展开,即用时间换取空间。

0x03

说说科创中遇到的一些麻烦事吧。

科创申报的时候才大一,开始做的时候也才大一下,那时候要安装vs,还要安装cuda/opencl,安装过程磕磕碰碰,vs操作也不懂,各种error,查找路径,动/静态链接,硬件,cpu,gpu,指令,内存,线程,进程,并行,冲突,碰撞,锁,线程交互什么的一点概念都没有,这个项目要做什么怎么做也啥都不知道,当时还不会谷歌,百度搜来搜去就那点基础的东西。 很烦就是了,不过回忆起来,很多概念也是那时候开始建立的,也算是”不是那么糟糕的事情”了。

0x04

那时候就记得是要做并行,整个项目主要就是要提升计算速度,通过大规模并行来提升速度。 再进行优化什么的进一步提高。

并行就是多个指令一起运行,那JAVA不是就有多线程么,C语言也有多线程,想要的话fork一个就可以了。 这些多线程实质上仍是由一个CPU驱动的,其”并行”只是CPU对多个线程的切换。 就算它们可以驱动多核CPU或GPU进行真正的并行,,,,,效果也绝对没有我们那么好。

CUDA/OPENCL是什么呢?

首先,由很多硬件厂商共同制定了一个标准(参照ASCII),大家都遵循这个标准,然后不同的厂商设计的硬件(cpu/gpu)就会支持这个标准,也会有不同的拓展。 CUDA/OPENCL就是提供了一套接口(参照shell),使我们可以用高级语言直接去操纵底层CPU/GPU,即操控硬件实现真正的并行,根据CPU/GPU的结构和各个参数,辅以不断地测试,进行各种优化,达到最大化利用计算资源的目的(都这样了速度能不快吗)

0x05

于是当时懵逼的我们,用着懵逼的vs,使用懵逼的CUDA/OPENCL语言,去写一些什么都不懂的东西(年少不懂事)…

现在回想起来还是很感叹,计算机世界就像宇宙无穷无尽,那时候的我就像是硬生生的挖开了一个洞,洞越来越大,也就越会发现自己的不足。 推荐阅读: 程序员学习之路

0x06

这篇文章全是我自己写的,写完还是很满意的(骄傲.jpg)… 就把它归到新分类[Chain]里边吧。

ps: 我感冒应该是好了的,然而今天测了1000米跑,跑完又感冒了,就不该脱衣服…