题目中也遇到过很多次RC4了,一般是都是从加密函数的名字看出,现在学习一下,了解其特征,更方便识别出。
简介
RC4是对称密码算法中的流密码加密算法,对称及加解密的密钥相同,流密码意思是加密是逐字节进行的与之对应的就是块加密。
算法原理
RC4生成一种称为密钥流的伪随机流(S表),他与明文通过异或操作混合,以达到加密的目的,解密时与明文进行异或操作。其密钥流由两部分组成,分别是KSA和PRGA。可以简单的理解为RC4由这两部分组成。
KSA 部分的代码。密钥的长度一般为516字节及40128位,通常不超过256位。
1 2 3 4 5 6 7 8 9 10
| for(i=0;i<256;i++) { S[i]=i; } int j=0; for(i=0;i<256;i++) { j=(j+S[i]+key[i % keylength]) % 256; Swap(S[i],S[j]); }
|
PRGA 根据待加密的data进行置换,得到的子密码k与data进行异或即可得到密文
1 2 3 4 5 6 7 8 9 10
| i,j,t=0; while(m=0;j<datalength;m++) { i=(i+1)%256; j=(j+S[i])%256; Swap(S[i],S[j]); t=(S[i]+S[j])%256; k=S[t]; data[m]^=k; }
|
合并起来的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| #include<stdio.h> void Swap(int*a,int*b) { int t=0; t=*a; *a=*b; *b=t; } int main() { char key[]="fishjump"; int keylength=strlen(key); int S[255]; for(int i=0;i<256;i++) { S[i]=i; } int j=0; for(int i=0;i<256;i++) { j=((j+S[i]+key[i % keylength]) % 256); Swap(&S[i],&S[j]); } int i=0; j=0; int t=0; char data[]="mzyloveyy"; int datalength=strlen(data); for(int m=0;m<datalength;m++) { i=(i+1)%256; j=(j+S[i])%256; Swap(&S[i],&S[j]); t=(S[i]+S[j])%256; int k=S[t]; data[m]^=k; printf("%x\n",data[m]); } }
|
验证一下成果


okk。
特征
总结一下,如何在茫茫人海中一眼认出RC4?256位的数组,交换函数,异或,over。
手写一遍之后以后遇到魔改的RC4应该就能拿捏了。