學了這么多加密算法,首先要了解的是:對明文使用同一個密鑰異或兩次最后是得到原文的
RC4加密算法其實也是比較簡單的,重點是在秘鑰流生成器那里,其實也是比較簡單的。
重點講解RC4秘鑰生成步驟
感覺這個流程圖畫的很不錯,拿過來作為大家參考一下(圖片轉載地址:https://www.cnblogs.com/block2016/p/5601925.html)

1、先初始化狀態向量S(256個字節,用來作為密鑰流生成的種子1)
按照升序,給每個字節賦值0,1,2,3,4,5,6.....,254,255
2、初始密鑰(由用戶輸入),長度任意
如果輸入長度小於256個字節,則進行輪轉,直到填滿
例如輸入密鑰的是1,2,3,4,5 , 那么填入的是1,2,3,4,5,1,2,3,4,5,1,2,3,4,5........
由上述輪轉過程得到256個字節的向量T(用來作為密鑰流生成的種子2)
3、開始對狀態向量S進行置換操作(用來打亂初始種子1)
按照下列規則進行
從第零個字節開始,執行256次,保證每個字節都得到處理
j = 0;
for (i = 0 ; i < 256 ; i++){
j = (j + S[i] + T[i]) mod 256;
swap(S[i] , S[j]);
}
這樣處理后的狀態向量S幾乎是帶有一定的隨機性了
4、最后是秘鑰流的生成與加密,很多人在這里不是特別理解,別的博客也沒有寫的很簡潔明了
假設我的明文字節數是datalength=1024個字節(當然可以是任意個字節)
i=0;
j=0;
while(datalength--){//相當於執行1024次,這樣生成的秘鑰流也是1024個字節
i = (i + 1) mod 256;
j = (j + S[i]) mod 256;
swap(S[i] , S[j]);
t = (S[i] + S[j]) mod 256;
k = S[t];這里的K就是當前生成的一個秘鑰流中的一位
//可以直接在這里進行加密,當然也可以將密鑰流保存在數組中,最后進行異或就ok
data[]=data[]^k; //進行加密,"^"是異或運算符
}
解密按照前面寫的,異或兩次就是原文,所以只要把密鑰流重新拿過來異或一次就能得到原文了
這樣就完成了一次生成密鑰流及加密的過程,這也是RC4的全部工作,是不是很簡單呢?
