抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

RC4简介

RC4加密算法 - shelmean - 博客园 (cnblogs.com)

RC4(来自Rivest Cipher 4的缩写)是一种流加密算法,密钥长度可变。它加解密使用相同的密钥,因此也属于对称加密算法。所谓对称加密,就是加密和解密的过程是一样的。

不说废话了,直接上题

LitCTF-Reverse-ezfc4

主程序,输入的Str经过rc4加密后与Buff1=0xD5B27CDC90A26E600613E47159B09031B2C71DD77F进行比较,看是否相等。

这直接标出来了rc4初始化函数:rc4_init((__int64)v10, (__int64)key, v4)

rc4加密函数:rc4_crypt((__int64)v10, Str, v3)

key点进去显示:’fenkey?’,我当时就以为这就是key了,因为也没有看到什么函数对它加密,结果就是解不出来。看了wp才知道这是加密后的key…….,主函数一点都不显示…….

没办法,只能这样看一下了,结果发现还有一个函数

点进去,是把key与自身xor了一下,进行相同的操作,求出原来的key。求出正确的key后就直接进行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
47
key = "fenkey?"
key1 = [0x0A, 0x0C, 0x1A, 0x08, 0x11, 0x1F, 0x1E, 0x0]
Key = ""
for i in range(len(key)):
Key += chr(ord(key[i]) ^ key1[i])
print("Key:", Key)


import struct

def generate_rc4_key_sbox(key):
key_length = len(key)
sbox = list(range(256))
j = 0
for i in range(256):
j = (j + sbox[i] + key[i % key_length]) % 256 # 确保key[i % key_length]是整数
sbox[i], sbox[j] = sbox[j], sbox[i]
return sbox

def rc4(key, ciphertext):
# 确保key是字节序列
if isinstance(key, str):
key = key.encode()
sbox = generate_rc4_key_sbox(key)
key_stream = []
i = j = 0
for _ in range(len(ciphertext)):
i = (i + 1) % 256
j = (j + sbox[i]) % 256
sbox[i], sbox[j] = sbox[j], sbox[i]
k = sbox[(sbox[i] + sbox[j]) % 256]
key_stream.append(k)
return bytes([c ^ key_stream_idx for c, key_stream_idx in zip(ciphertext, key_stream)])

# 假设我们有一个密钥key
#Key = b"secret_key" # 这里需要替换为实际的密钥

# 密文Buff1
ciphertext_hex = "D5B27CDC90A26E600613E47159B09031B2C71DD77F"
ciphertext = bytes.fromhex(ciphertext_hex)

# 解密
plaintext = rc4(Key, ciphertext)
print("解密后的明文:", plaintext)

# Key: litctf!
# 解密后的明文: b'LitCTF{rc4_love_nice}'

或者直接用RC4解密工具

评论