【18/12/31】hashcat源码粗读 --- sha256部分

时间:2023-03-09 01:30:38
【18/12/31】hashcat源码粗读 --- sha256部分

  还没有详细研究过sha256算法的详细原理,主要是移植cf10算法时,hashcat在cf10_parse_hash时并不是直接调用sha256_update和sha256_final,

而是为了precompute,将其中的步骤展开了,为了弄明白是怎么回事,于是肯定就得粗略研究一下其中的sha256实现了。

1. hashcat中sha256算法大致部分

  肯定是这两个部分:

    sha256_update_swap();

    sha256_final();

  其中主要的是转换相关部分是

    sha256_transform();

  在hashcat中是这样实现的,在cpu_sha256.c的实现也大致这样,不过怎么实现并不是重点。

  其实现(太长了,不想放这):

  https://www.cnblogs.com/INT18/p/10203589.html

1.1 sha256_update_swap():

  △ 奇怪的调用

    主要调用sha256_update_64()里有两个嵌套调用:

      switch_buffer_by_offset_be_S ();

      switch_buffer_by_offset_carry_be_S ();

    还有莫名其妙的c0~c3数组。

    这个我思考了好一会,搞不明白是干啥的,之后发现是优化相关的,用于调整对齐问题,只思考算法过程的话,不用管。

  

   △ sha256_update_swap()其中大致流程

    A. 假设update字符串长度是len,以64为一段分割,分为64, 64, 64 ... len - 64 * n;

    B. 对于能被整除的前n个64字节段,进行如下处理:

    (判断是前64 * n段还是末端,是通过将for循环和sha256_update_64()实现的)

      B.1 以4字节也就是1个整数的长度划,分成16个整数段w0~w15,对wn段进行大小端转换swap(就是倒过来,abcd-->dcba);

      B.2 对swap后的段进行一次sha256_transform()转换;

    C. 对于末尾段:

    swap之后,不进行sha256_transform()转换,留待final时再进行处理;

1.2 sha256_final():

   将上述swap后的残余字段,在末尾64bit处填上64位整数模式的字符串长度len,然后对组合后w0~w15整数段进行sha256_transform()转换;