Ⅰ简介:包括初始化算法(KSA)和加密算法两大部分
解题:直接在内存改或将最后的异或数据提取出来或直接使用脚本
Ⅱ主要代码:
初始化部分:(这个基本上是固定的)
在初始化的过程当中,密钥的主要功能是将s搅乱,i确保每个元素都得到处理,j保证s的搅乱是随机的。将s和明文进行xor运算,解密过程也完全相同。
加解密部分:(既可加密,也可解密)
main函数中的调用顺序示例:
Ⅲ综合示例:(极客baby_re的解题)
Ⅳ总结归纳:
解密思路:
RC4加解密相当于对合运算,所有只要输入的密钥相同(找到密钥,我们就得到了s),那么执行相同操作即可对数据(找到加密后的数据)进行加密与解密
即:
①:找到key,并使用key对s进行初始化(加解密使用的s均是相同的)
②: 找到加密之后的数据,传入加解密函数即可
③:得出结果
伪代码发现是RC4加密的特征:
出现很多循环条件都<256,也出现多次%256,最后还进行了异或等。对照上面源码进行分析
void rc4_init(unsigned char
*
s,unsigned char
*
key,unsigned
long
len
)
/
/
s最开始是传入的长度为
256
的char型空数组,用来存放初始化后的s
/
/
key是密钥,内容可定义
/
/
最后一个
len
是密钥的长度
{
int
i
=
0
;
int
j
=
0
;
unsigned char k[
256
]
=
{};
unsigned char temp
=
0
;
for
(i
=
0
;i<
256
;i
+
+
)
{
s[i]
=
i;
/
/
0
-
255
赋给s
k[i]
=
key[i
%
len
];
/
/
将k重新计算
}
for
(i
=
0
;i<
256
;i
+
+
)
{
j
=
(j
+
s[i]
+
k[i])
%
256
;
/
/
给j赋
temp
=
s[i];
s[i]
=
s[j];
s[j]
=
temp;
/
/
s[i]和s[j]交换
}
}
void rc4_init(unsigned char
*
s,unsigned char
*
key,unsigned
long
len
)
/
/
s最开始是传入的长度为
256
的char型空数组,用来存放初始化后的s
/
/
key是密钥,内容可定义
/
/
最后一个
len
是密钥的长度
{
int
i
=
0
;
int
j
=
0
;
unsigned char k[
256
]
=
{};
unsigned char temp
=
0
;
for
(i
=
0
;i<
256
;i
+
+
)
{
s[i]
=
i;
/
/
0
-
255
赋给s
k[i]
=
key[i
%
len
];
/
/
将k重新计算
}
for
(i
=
0
;i<
256
;i
+
+
)
{
j
=
(j
+
s[i]
+
k[i])
%
256
;
/
/
给j赋
temp
=
s[i];
s[i]
=
s[j];
s[j]
=
temp;
/
/
s[i]和s[j]交换
}
}
void rc4_crypt(unsigned char
*
s,unsigned char
*
data,unsigned
long
len
)
/
/
s是上面初始化之后的,data是我们要加密的数据,
len
是data的长度
{
int
i
=
0
,j
=
0
,t
=
0
;
unsigned
long
k
=
0
;
unsigned char temp;
for
(k
=
0
;k<
len
;k
+
+
)
{
i
=
(i
+
1
)
%
256
;
/
/
固定方式生成的i
j
=
(j
+
s[i])
%
256
;
/
/
固定方式生成的j
temp
=
s[i];
s[i]
=
s[j];
s[j]
=
temp;
/
/
交换
t
=
(s[i]
+
s[j])
%
256
;
/
/
固定方式生成的t
data[k]^
=
s[t];
/
/
异或运算
}
}
void rc4_crypt(unsigned char
*
s,unsigned char
*
data,unsigned
long
len
)
/
/
s是上面初始化之后的,data是我们要加密的数据,
len
是data的长度
{
int
i
=
0
,j
=
0
,t
=
0
;
unsigned
long
k
=
0
;
unsigned char temp;
for
(k
=
0
;k<
len
;k
+
+
)
{
i
=
(i
+
1
)
%
256
;
/
/
固定方式生成的i
j
=
(j
+
s[i])
%
256
;
/
/
固定方式生成的j
temp
=
s[i];
s[i]
=
s[j];
s[j]
=
temp;
/
/
交换
t
=
(s[i]
+
s[j])
%
256
;
/
/
固定方式生成的t
data[k]^
=
s[t];
/
/
异或运算
}
}
int
main()
{
unsigned char s[
256
]
=
{
0
};
/
/
s来接收初始化后的s,用来加密
unsigned char s2[
256
]
=
{
0
};
/
/
用来存放初始化后的s,解密可用
char key[
256
]
=
{
"just a test"
};
/
/
密钥
char data[
512
]
=
{
"要加密的数据"
};
unsigned
long
len
=
strlen(data);
rc4_init(s,(unsigned char
*
)key,strlen(key));
for
(i
=
0
;i<
256
;i
+
+
)
{
s2[i]
=
s[i];
/
/
存放加密后的s
}
rc4_crypt(s,(unsigned char
*
)data,
len
);
/
/
加密
printf(
"加密后为:%s"
,data);
rc4_crypt(s,(unsigned char
*
)data,
len
);
/
/
解密
printf(
"解密后为:%s"
,data);
return
0
;
}
int
main()
{
unsigned char s[
256
]
=
{
0
};
/
/
s来接收初始化后的s,用来加密
unsigned char s2[
256
]
=
{
0
};
/
/
用来存放初始化后的s,解密可用
char key[
256
]
=
{
"just a test"
};
/
/
密钥
char data[
512
]
=
{
"要加密的数据"
};
unsigned
long
len
=
strlen(data);
rc4_init(s,(unsigned char
*
)key,strlen(key));
for
(i
=
0
;i<
256
;i
+
+
)
{
s2[i]
=
s[i];
/
/
存放加密后的s
}
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课