首页
社区
课程
招聘
[分享]RC4加密
发表于: 2021-9-13 15:00 16831

[分享]RC4加密

2021-9-13 15:00
16831

目录

简介

密码类型:对称加密密码、面向字节操作的流密码
密钥:1-256字节(长度可变)
明文:1字节
密文:1字节
图片描述

RC4于1987年提出,和DES算法一样,是一种对称加密算法,也就是说使用的密钥为单钥(或称为私钥)。但不同于DES的是,RC4不是对明文进行分组处理,而是字节流的方式依次加密明文中的每一个字节,解密的时候也是依次对密文中的每一个字节进行解密。

密钥生成流程

图片描述
RC4算法主要包括两个部分:1)使用 key-scheduling algorithm (KSA) 算法根据用户输入的秘钥 key 生成 S 盒;2)使用 Pseudo-random generation algorithm (PRGA) 算法生成秘钥流用于加密数据。

KSA

KSA算法初始化长度为 256 的 S 盒。
第一个 for 循环将 0 到 255 的互不重复的元素装入 S 盒;
第二个 for 循环根据密钥打乱 S 盒。

1
2
3
4
5
6
7
8
for i from 0 to 255
    S[i] := i
endfor
j := 0
for i from 0 to 255
    j := (j + S[i] + key[i mod keylength]) mod 256
    swap values of S[i] and S[j]
endfor

PRGA

Pseudo-random generation algorithm (PRGA) 算法根据 S 盒生成与明文长度相同的秘钥流,使用秘钥流加密明文。秘钥流的生成如下图所示:
图片描述
循环体中每收到一个字节,a 和 b 定位S盒中的一个元素,并与输入字节异或,得到密文 k;同时,c 还改变了 S 盒。

1
2
3
4
5
6
7
8
9
i := 0
j := 0
while GeneratingOutput:
    i := (i + 1) mod 256  // a
    j := (j + S[i]) mod 256 // b
    swap(S[i],S[j])  // c
    K := inputByte ^ S[(S[i] + S[j]) mod 256] // d
    output K
endwhile

加密与解密

由于异或运算的特性,使得加密与解密过程一致。如果输入的是明文,输出的就是密文;如果输入的是密文,输出的就是明文。

C实现详细RC4算法

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
42
43
44
45
46
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
void swap(unsigned char *a, unsigned char *b) {
  unsigned char t = *a;
  *a = *b;
  *b = t;
}
 
void rc4KSA(unsigned char *s, const unsigned char *key, int len) {
    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 % len)) % 256;
        swap(s + i, s + j);
    }
}
 
void rc4PRGA(unsigned char *s, char *data, size_t len) {
    int i = 0;
    int j = 0;
    for ( size_t idx = 0; idx < len; idx++ ) {
        i = (i + 1) % 256;
        j = (j + s[i]) % 256;
        swap(s + i, s + j);
        unsigned char k = s[(s[i] + s[j]) % 256];
        data[idx] ^= k;  // k是伪随机数,和明文进行XOR进行加密
    }
}
 
int main(int argc, const char * argv[]) {
  unsigned char s[256]; // S-box
  unsigned char key[128]; // key的长度1256字节,本例子使用128字节
  arc4random_buf((unsigned char *)key, sizeof(key)); // 用伪随机数算法生成key
  char data[1000] = "这里是要机密的数据";
 
  // 加密
  rc4KSA(s, key, sizeof(key));
  rc4PRGA(s, data, strlen(data));
 
  // 解密
  rc4KSA(s, key, sizeof(key));
  rc4PRGA(s, data, strlen(data));
  return 0;
}

使用python进行RC4加解密

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from Crypto.Cipher import ARC4
 
def encrypt(message, key):
    des = ARC4.new(key)
    cipher_text = des.encrypt(message)
    return cipher_text
 
def decrypt(cipher_text, key):
    des3 = ARC4.new(key)
    message = des3.decrypt(cipher_text)
    return message
 
if __name__ == "__main__":
    key = "0123456789abcdef"
    message = "www.biaodianfu.com"
    cipher_text = encrypt(message, key)
    print(cipher_text.hex().upper())
    message = decrypt(cipher_text, key)
print(message.decode("utf-8"))

逆向特征

密钥生成
图片描述
加密
图片描述

参考

《加密与解密》
github rc4脚本
逆向中常见的Hash算法和对称加密算法的分析


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//