rc4基本原理

生成密钥之后,由密钥与明文异或后生成密文(加密过程),由同一密钥与密文异或后得到明文(解密过程)

CTF题

首先如果有rc4加密你会看到一个莫名其妙的字符串【该字符串是定义好的】,这个莫名奇妙的字符串不是密文而是key。

会有一个对key进行i循环的取模的操作【也就算是得到key循环的东西】

比如:key==abc123,就会有一个循环来得到abc123abc123abc123…【这个主要是用于后面 ^ 操作】

某个函数有4个传参:

  • 密文
  • 密文的长度
  • Key
  • Key的长度

当发现如上的时候,点进去看。如果还有for循环比如for(i ; i<256;i++)这种对256次循环进行操作的。并且在for循环里面是进行xor操作的。可能是rc4加密。


而RC4加密算法的特征也是比较明显的:

    1. 有很多取模操作
    1. 有很多256
    1. 有多个次数为256的循环
    1. 最后操作为异或

题目:

image-20231017163705753

sub_140001120 和 sub_140001240 函数组合在一起就是rc4加密。

sub_140001120

这个函数有256

image-20231017163758986

sub_140001240

这个函数进行xor

image-20231017163836315


用python脚本来魔改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
def rc4_decrypt(key, ciphertext):
S = list(range(256))
j = 0
key = [ord(char) for char in key]

# Key-scheduling algorithm
for i in range(256):
j = (j + S[i] + key[i % len(key)]) % 256
S[i], S[j] = S[j], S[i]

plaintext = bytearray()

# Pseudo-random generation algorithm
i = 0
j = 0
for char in ciphertext:
y = 'FSCTF'
i = (i + 1) % 256
j = (j + S[i]) % 256
S[i], S[j] = S[j], S[i]
keystream_byte = S[(S[i] + S[j]) % 256]
plaintext_byte = ord(char) ^ keystream_byte ^ ord(y[i % len(y)])
plaintext.append(plaintext_byte)

return plaintext

# 用你的密钥和密文替换下面的值
key = "XFFTnT"
ciphertext = "=.#MØQïò tÂЭv|·"

plaintext = rc4_decrypt(key, ciphertext)
print("Decrypted Text:", plaintext.decode('utf-8'))
#Decrypted Text: FSCTF{G00d_j0b!!!}