1. 程式人生 > 其它 >RC4加密演算法學習

RC4加密演算法學習

為了水部落格不擇手段(其實是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確保了這種打亂的處理是近似於隨機的

偽隨機子密碼生成演算法(PRGA)