之前做的幾道題目,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 = 0for i in range(256):j = (j + S[i] + K[i]) % 256S[i], S[j] = S[j], S[i]return Sdef encrypt(data, key):key_len = len(key)data_len = len(data)S = S_init(key, key_len)i = 0j = 0enc = bytearray()for byte in data:i = (i + 1) % 256j = (j + S[i]) % 256S[i], S[j] = S[j], S[i]tmp = (S[i] + S[j]) % 256k = S[tmp]enc.append(byte ^ k)return bytes(enc)def decrypt(ciphertext, key):# RC4 decryption is the same as encryptionreturn 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的了,之后遇到再寫上。