声明
本文属于OneTS安全团队成员flatcc的原创文章,转载请声明出处!本文章仅用于学习交流使用,因利用此文信息而造成的任何直接或间接的后果及损失,均由使用者本人负责,OneTS安全团队及文章作者不为此承担任何责任。
RC4流密码
RC4流密码
可魔改的地方有两处:s盒初始化时候,模可以不是256,另外可以在解密或者加密的地方再多异或一个值。
01、代码案例及原理
⚫基本原理
RC4 主要包含三个流程:
🔸初始化 S 和 T 数组。
🔸初始化置换 S。
🔸生成密钥流。
⚫C代码案例:
/******************************************************/
/* 描述:C版本RC4算法
/* 日期:2021/8/9
/* 作者:flatcc
/******************************************************/
#include <stdio.h>
#include <string.h>
void rc4_init(unsigned char *s, unsigned char *key, unsigned long Len) //初始化函数
{
int i = 0, j = 0;
char k[256] = { 0 };
unsigned char tmp = 0;
for (i = 0; i < 256; i++) {
s[i] = i;
k[i] = key[i%Len];
}
for (i = 0; i < 256; i++) {
j = (j + s[i] + k[i]) % 256;
tmp = s[i];
s[i] = s[j]; // 交换s[i]和s[j]
s[j] = tmp;
}
}
void rc4_crypt(unsigned char *s, unsigned char *Data, unsigned long Len) //加解密
{
int i = 0, j = 0, t = 0;
unsigned long k = 0;
unsigned char tmp;
for (k = 0; k < Len; k++) {
i = (i + 1) % 256;
j = (j + s[i]) % 256;
tmp = s[i];
s[i] = s[j]; //交换s[x]和s[y]
s[j] = tmp;
t = (s[i] + s[j]) % 256;
Data[k] ^= s[t];
}
}
int main()
{
unsigned char s[256] = {0};
unsigned char key[64] = "key";
unsigned char enc[64] = "hello world!";
int enc_len = strlen((const char *)enc);
rc4_init(s, key, strlen((const char *)key));
rc4_crypt(s, enc, enc_len);
for (int i = 0; i < enc_len; i++) {
printf("%02x", enc[i]);
}
printf("\n");
return 0;
}
02、例题
题目来自于n1book的BabyAlgorithm。
关注公众号了解其它加密算法的使用及识别技巧