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 sbox[i], sbox[j] = sbox[j], sbox[i] return sbox
def rc4(key, ciphertext): 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)])
ciphertext_hex = "D5B27CDC90A26E600613E47159B09031B2C71DD77F" ciphertext = bytes.fromhex(ciphertext_hex)
plaintext = rc4(Key, ciphertext) print("解密后的明文:", plaintext)
|
或者直接用RC4解密工具