转自:http://t00ls.net/thread-13721-1-1.html,原作者:xlk111

    昨天偶然发现 Winrar 压缩软件的加密算法碰撞口令后(详情见这里:https://lcx.cc/post/1026/),又到处搜集看了些资料,又看了看 Winrar 的程序。

    Winrar 压缩软件用的核心加密算法是AES,加密时用的CBC模式,密钥长度16字节(128比特),密钥和初始化向量由用户口令经符合 PKCs #5 的复杂变化生成,其生成时的核心是SHA1。

既用户输入的口令为 PW1,密钥和初始化向量的生成过程如下:

    1、RE1=Unicode(PW1),如:Unicode('A')=0x0041;注意intel系列的处理器是littleendian,低位在前。
    2、PW2=Union(RE1||Salt),简单的串接。
    3、M=Ex(PW2,int);其中int为固定值,对PW2做固定int次循环扩展。
    4、Key=Get(SHA1(M),128),IV=LASTBYTE(SHA1(M));

加密:
    AES-CBC:
    C(0)=IV;
    C(i)=AES(KEY,C(i-1)^P(i));

解密:
    P(i)=C(i-1)^AES(C(i))

需要注意的是Salt生成算法:(这个是看雪的天易love写的)

    1、由 SystemTime 得到 FileTime;
    2、分别对 FileTime 的两个 DWORD 进行 hash_process;
    3、hash_final 后得到的 digest 的最前面的两个 DWORD 就是 salt。