我想解压缩一些文件,并找到一些有关如何的信息。显然,它们在CFB模式下使用AES 128加密,有时使用ZLIB压缩。每个文件的密钥和IV可能是根据文件大小生成的。可以通过以下代码获取它们:

Generate_Key_IV   proc near
      mov   eax, [ecx]
      movzx   edx, ax
      imul   edx, 9069h
      shr   eax, 10h
      add   edx, eax
      mov   eax, [ecx+4]
      push   esi                            ; Here file size
      movzx   esi, ax
      imul   esi, 4650h
      shr   eax, 10h
      add   eax, esi
      mov   [ecx], edx
      mov   [ecx+4], eax
      pop   esi
      test   edx, edx
      jnz   short loc_495EA2
      mov   dword ptr [ecx], 1
loc_495EA2:
      test   eax, eax
      jnz   short loc_495EAD
      mov   dword ptr [ecx+4], 0FFFFFFFFh
loc_495EAD:
      mov   eax, [ecx]
      shl   eax, 10h
      add   eax, [ecx+4]
      retn
Generate_Key_IV   endp


我知道这是在汇编中,但是不幸的是我不知道它如何工作。我当然可以学习它,但是我希望那会花费很多时间,而且我不认为我会用它来弄清楚上面的意思。

所以,是的,如果有人能概述以上内容以及获取密钥和IV的方法和/或算法,我将非常感激。显示了如何使用以上代码:

我假设这只是使用密钥和IV来使用AES解码文件。但是,如果其中包含我应该知道的任何必要内容,那当然也很棒。

#1 楼

这是一个伪随机数生成器:这是一段简单的代码,其生成难以预测的值,而无需花费太长时间即可计算。查看Wikipedia文章以获取更多信息。

编辑:等效的C代码类似于:

int random(unsigned int *seed)
{
  int temp1;
  int temp2;

  temp1 = (*seed >> 16) + 36969 * (unsigned short)*seed;
  temp2 = 18000 * (unsigned short)seed[1] + (seed[1] >> 16);
  *seed = temp1;
  seed[1] = temp2;
  if (!temp1) *seed = 1;
  if (!temp2) seed[1] = -1;
  return seed[1] + (*seed << 16);
}


评论


尽管我很感谢您的回答,但我真正希望的是对代码执行的确切算法进行更具体的描述,以便能够将其移植到其他语言。

– puggsoy
13-10-30在10:46



@puggsoy PRNG是带进位的乘积。在Wikipedia的RNG文章中对此进行了描述。

–彼得·安德森(Peter Andersson)
13-10-30在12:38



这看起来很简单。但是,我有点困惑,这不应该产生两个值,即键和IV吗?如果需要,我可以提供一些示例值。

– puggsoy
13-10-30在20:38