转自: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。