之前做的几道题目,rc4也是经常遇到,今来系统学学,记录一下
对称加密,即加密和解密的密钥可以相互推导,也有的是相同的。
RC4 是以字节流处理每一个字节,而不是 DES 的分组操作。
包含三个参数:key ,enc , len(enc)
首先就是 S 盒的生成,256个字节,先是0-256填充,然后又用 key,len(key) 去替换 S 盒的部分,形成一个伪随机的 S 盒。
然后就是 S 盒和密文逐个字节异或,得到密文。解密再异或回去就可以了。
def S_init(key, key_len):
S = list(range(256))
K = [key[i % key_len] for i in range(256)]
j = 0
for i in range(256):
j = (j + S[i] + K[i]) % 256
S[i], S[j] = S[j], S[i]
return S
def encrypt(data, key):
key_len = len(key)
data_len = len(data)
S = S_init(key, key_len)
i = 0
j = 0
enc = bytearray()
for byte in data:
i = (i + 1) % 256
j = (j + S[i]) % 256
S[i], S[j] = S[j], S[i]
tmp = (S[i] + S[j]) % 256
k = S[tmp]
enc.append(byte ^ k)
return bytes(enc)
def decrypt(ciphertext, key):
# RC4 decryption is the same as encryption
return encrypt(ciphertext, key)
if __name__ == "__main__":
data=[0xD5, 0xB2, 0x7C, 0xDC, 0x90, 0xA2, 0x6E, 0x60,0x06, 0x13, 0xE4, 0x71, 0x59, 0xB0, 0x90, 0x31,0xB2, 0xC7, 0x1D, 0xD7,0x7f]
str='litctf!'
key=list(map(ord,str))
res=encrypt(data,key)
print(res)
[LitCTF 2024]ezrc4
就是一个简单的 RC4,密文就在开头,key 最外面是错的,交叉引用,去得到真 key
enc: 0xD5, 0xB2, 0x7C, 0xDC, 0x90, 0xA2, 0x6E, 0x60,0x06, 0x13, 0xE4, 0x71, 0x59, 0xB0, 0x90, 0x31,0xB2, 0xC7, 0x1D, 0xD7,0x7f
可以直接写脚本,也可以去动调
main函数之前应该还有反调试,但没找到,啧。
这会也没遇到专门的RC4的了,之后遇到再写上。