RC4加密演算法學習
阿新 • • 發佈:2021-12-23
為了水部落格不擇手段(其實是ida自動繞反除錯的外掛沒安上做不動NCTF了,嗚嗚嗚)
tea已經水過了,那就水一篇rc4吧(
簡介
RC4(來自Rivest Cipher 4的縮寫)是一種流加密演算法,金鑰長度可變。它的加解密使用相同的金鑰,因此也屬於對稱加密演算法。RC4是有線等效加密(WEP)中採用的加密演算法,也曾經是TLS可採用的演算法之一。其最重要的實現是初始化演算法和偽隨機子密碼的生成。
RC4的實現是以位元組流的方式依次加密明文中的每一個位元組,解密的時候也是依次對密文中的每個位元組解密。(只有異或操作和S盒,所以加解密的過程相同,這是其可逆性的原理)
演算法實現
先貼一份c++實現的程式碼
void init(char *s, char *key, int len) { char t[256] = {0}; char tmp = 0; for (int i = 0; i < 256; ++i) { s[i] = i; t[i] = key[i % len]; } int j = 0; for (int i = 0; i < 256; ++i) { j = (j + s[i] + t[i]) % 256; swap(s[i], s[j]); } } void crypt(char *s, char *data, int len) { int i = 0, j = 0, t = 0; char tmp; for (int k = 0; k < len; ++k) { i = (i + 1) % 256; j = (j + s[i]) % 256; swap(s[i], s[j]); t = (s[i] + s[j]) % 256; data[k] ^= s[t]; } }
初始化演算法(KSA)
先來看看初始化演算法,此處我們假設S盒的長度是256,金鑰key的長度為len(注意,RC4的金鑰長度和密文長度/明文長度是相等的)且key的內容由使用者規定,其長度的可變範圍不限(超過256的不要就行)
void init(char *s, char *key, int len) { char t[256] = {0}; char tmp = 0; for (int i = 0; i < 256; ++i) { s[i] = i; t[i] = key[i % len]; } int j = 0; for (int i = 0; i < 256; ++i) { j = (j + s[i] + t[i]) % 256; swap(s[i], s[j]); } }
初始化演算法的步驟為:
- 初始化S盒為0-255
- 擴充套件金鑰長度,具體操作是:若key的長度小於256,則不斷將其複製進t盒,直到t盒長度剛好達到256(多的就不要了)
- 打亂S盒,使S盒近似為一個隨機生成的、內含元素只有0-255的陣列
在該演算法中,i確保了s盒的每個元素都被處理過,而j確保了這種打亂的處理是近似於隨機的