前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >RC4算法的使用及逆向中的识别技巧

RC4算法的使用及逆向中的识别技巧

作者头像
OneTS安全团队
发布2025-02-07 16:01:04
发布2025-02-07 16:01:04
9000
代码可运行
举报
文章被收录于专栏:OneTS安全团队
运行总次数:0
代码可运行

声明

本文属于OneTS安全团队成员flatcc的原创文章,转载请声明出处!本文章仅用于学习交流使用,因利用此文信息而造成的任何直接或间接的后果及损失,均由使用者本人负责,OneTS安全团队及文章作者不为此承担任何责任。

RC4流密码

RC4流密码

可魔改的地方有两处:s盒初始化时候,模可以不是256,另外可以在解密或者加密的地方再多异或一个值。

01、代码案例及原理

⚫基本原理

RC4 主要包含三个流程

🔸初始化 S 和 T 数组。

🔸初始化置换 S。

🔸生成密钥流。

⚫C代码案例:

代码语言:javascript
代码运行次数:0
复制
/******************************************************/
/* 描述: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。

关注公众号了解其它加密算法的使用及识别技巧

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-04-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OneTS安全团队 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档