RC4算法分析
標籤(空格分隔): Reverse Crypto
RC4簡介
- RC4是一種對稱的流加密算法,它的密鑰長度可變,通過隨機數生成的核心與異或運算完成對於數據流的加密。相對於AES,DES對於固定長度數據塊加密,RC4輸入的plaintext爲任意的。RC4的特點是運算速度快,密鑰長度爲1–256BYTE可變。
- RC4的核心可以分爲對密鑰空間s的初始化與密文的交換。
- 初始化密鑰空間InitS_Box過程如下:
其中key的元素引入j是爲了更徹底的隨機,而i從0到256是爲了保證S盒每個元素都得到隨機。for(int i=0;i<256;i++) S[i]=i; for(int i=0;i<256;i++){ j=(j+S[i]+key[i%len_k])%len_s; xchg(S[i],S[j]); }
- 對密文交換Crypt如下:
while(len<len_plaintext){ i=(i+1)%len_s; j=(j+S[i])%len_s; xchg(S[i],S[j]); plaintext[k++]^=((S[i]+S[j])%len_s); }
- RC4的加密流程與解密流程共用一個s盒且完全相同。
InitS_Box(S,key,len_k); Crypt(S,key,plaintext,len_k); //此時輸出密文 Crypt(S,key,plaintext,len_k); //當使用同樣的初始化S盒後輸出原文
RC4在逆向中的識別
-
S盒賦初值較爲特殊,長度爲256且賦值爲相對數組初始的偏移,這個可以作爲一個參考但是可行度不是非常高,因爲將數組偏移賦值給數組的情況同樣較多。
-
將S盒(或者一個未知數組)取出的數據處理後作爲數組下標取元素,若存在這樣的循環可以考慮RC4。相對第一個而言這種可能性會小很多。
-
此外當我們判斷一個函數爲加密算法時我們可以查看有無對輸入密文或密鑰的分組,如果沒有則可以猜測爲RC4,因爲RC4是流加密
-
此外對於RC4及其變種RC6,一旦確定還有一種特殊利用方法,當程序的判定邏輯爲時,可以使用原代碼解密。就是使用OD(去除反調試後)斷在RC4/6的Crypt函數入口後,將UnknowEncrypt(hadcode)的結果直接作爲plaintext輸入Crypt函數(RC4/6的),則可以從輸入中直接得到flag。