本文為看雪論壇精華文章
看雪論壇作者ID:jishuzhain
RC4(Rivest Cipher 4)是一種基於密鑰流的加密算法,它的密鑰長度可變,密鑰長度在 1-256 字節範圍。它的特點是算法簡單、運算效率高,而且非線性度良好。
它加解密使用相同的密鑰,假設定義 RC4 的運算過程是RC4(key,data),那麼,密文=RC4(key,明文),明文=RC4(key,密文)。因此也屬於對稱加密算法,WEP 裡也用到了 RC4 算法。
近期分析多個勒索軟體時,會遇到使用 RC4 解密相應字符串或者配置的過程,加之之前閱讀過相關的分析報告後也發現存在勒索軟體使用 RC4 解密相應的內容的行為。
由於筆者之前並未學習過密碼學,於是對 RC4 算法進行學習,並相應記錄筆記。
RC4 由偽隨機數生成器和異或運算組成,RC4 一個字節一個字節地加解密。給定一個密鑰,偽隨機數生成器接受密鑰並產生一個 S 盒。S 盒用來加密數據,而且在加密過程中 S 盒會變化。
出現的幾個變量如下:S、K、T、k
S S 盒,是一個 256 個字節大小的 char 類型數組,char S[256]
K 密鑰 K,長度限定在 1-256 個字節
T 臨時變量 T,大小也是 256 個字節的數組
k 輸出的密鑰流,大小與實際需要加密的內容一致。
S 盒與臨時變量 T 初始化,偽代碼如下:
for i=0 to 255 do
S[i]=i;
T[i]=K[ I % K_len ];
j=0;
for i=0 to 255 do
j= ( j+S[i]+T[i]) % 256;
swap(S[i],S[j]); //交換
i,j=0;
for r=0 to r_len do //r為明文
i=(i+1) % 256;
j=(j+S[i]) % 256;
swap(S[i],S[j]);
t=(S[i]+S[j]) % 256;
k[r]=S[t];
for r=0 to r_len do
d[r] ^= k[r]
#include <stdio.h>
#include<Windows.h>
#include "RC4.h"
int main()
{
unsigned char text[] = "UOIzVDP2Vzs=";
unsigned char key[] = "flag{this_is_not_the_flag_hahaha}";
unsigned int i;
printf("加密前的數據:");
for (i = 0; i < strlen((const char*)text); i++)
printf("%c", text[i]);
printf("\n");
rc4_crypt(text, strlen((const char*)text), key, strlen((const char*)key));
printf("加密後的數據:");
for (i = 0; i < strlen((const char*)text); i++)
printf("%X", text[i]);
printf("\n");
rc4_crypt(text, strlen((const char*)text), key, strlen((const char*)key));
printf("解密後的數據:");
for (i = 0; i < strlen((const char*)text); i++)
printf("%c", text[i]);
printf("\n");
system("pause");
return 0;
}
#include <string.h>
static void rc4_init(unsigned char* s_box, unsigned char* key, unsigned int key_len)
{
unsigned char Temp[256];
int i;
for (i = 0; i < 256; i++)
{
s_box[i] = i;//順序填充S盒
Temp[i] = key[i%key_len];//生成臨時變量T
}
int j = 0;
for (i = 0; i < 256; i++)//打亂S盒
{
j = (j + s_box[i] + Temp[i]) % 256;
unsigned char tmp = s_box[i];
s_box[i] = s_box[j];
s_box[j] = tmp;
}
}
void rc4_crypt(unsigned char* data, unsigned int data_len, unsigned char* key, unsigned int key_len)
{
unsigned char s_box[256];
rc4_init(s_box, key, key_len);
unsigned int i = 0, j = 0, t = 0;
unsigned int Temp;
for (Temp = 0; Temp < data_len; Temp++)
{
i = (i + 1) % 256;
j = (j + s_box[i]) % 256;
unsigned char tmp = s_box[i];
s_box[i] = s_box[j];
s_box[j] = tmp;
t = (s_box[i] + s_box[j]) % 256;
data[Temp] ^= s_box[t];
}
}
#ifndef RC4_H
#define RC4_H
/*
導出rc4_crypt函數,參數為要加密的數據、數據長度、密碼、密碼長度
*/
void rc4_crypt(unsigned char* data, unsigned int data_len, unsigned char* key, unsigned int key_len);
#endif
看雪ID:jishuzhain
https://bbs.pediy.com/user-678001.htm
*本文由看雪論壇 jishuzhain 原創,轉載請註明來自看雪社區好書推薦