def rc4_ksa( key ):
	S = list( range( 256 ) )
	j = 0

	for i in range( 256 ):
		j = ( j + S[i] + key[i % len( key )] ) % 256
		S[i], S[j] = S[j], S[i]

	return S, 0, 0


def rc4_prga( s, i, j, n ):
	out = []
	for _ in range( n ):
		i = ( i + 1 ) % 256
		j = ( j + s[i] ) % 256
		s[i], s[j] = s[j], s[i]
		out.append(  s[( s [i] + s[j] ) % 256] )

	return bytes( out ), s, i, j


s, i, j = rc4_ksa( b"skibidi" )       # init
_, s, i, j = rc4_prga( s, i, j, 38 )  # consume the first 38 bytes

ct = bytes(
	[
		0xD2, 0x38, 0xBD, 0x57, 0x18, 0x9E, 0xC1, 0x37,	0x5A, 0xC9, 0xB7, 0xBF, 0x93, 0xDA, 0xD3, 0x4B, 0xA4,
	]
 )

ct_1  = bytes( [ 0xD5, 0x62, 0xFB, 0x65, 0x4A, 0x1A, 0x46, 0x03, 0xBC, 0xF4, 0xAE, 0x73, 0x9E ] )
ct_2  = bytes( [ 0xB4, 0xB2, 0xE4, 0x8E, 0x6D ] )
ct_3  = bytes( [ 0x78, 0xC8, 0x50, 0xA5, 0x17, 0x82, 0x7A, 0xFD, 0xBB, 0x88 ] )

ks, s, i, j = rc4_prga( s, i, j, 17 )
print( bytes( a ^ b for a, b in zip( ct, ks ) ).decode() )

ks, s, i, j = rc4_prga( s, i, j, 13 )
print( bytes( a ^ b for a, b in zip( ct_1, ks ) ).decode() )

ks, s, i, j = rc4_prga( s, i, j, 5 )
print( bytes( a ^ b for a, b in zip( ct_2, ks ) ).decode() )

ks, s, i, j = rc4_prga( s, i, j, 10 )
print( bytes( a ^ b for a, b in zip( ct_3, ks ) ).decode() )

ct_4  = bytes( [ 0xF3, 0x29, 0x27, 0xC9, 0x62, 0x3A, 0x59, 0x45, 0x15 ,0x5F, 0xBD, 0xD9, 0x75, 0x84, 0x79, 0x7A, 0x5F, 0xAC, 0x1E, 0xA3, 0x30, 0x15, 0x0C, 0xFA, 0x87, 0x0C, 0xC6, 0x3A, 0x26, 0xD9, 0x8B ] )
ct_5  = bytes( [ 0x39, 0x4D, 0x54, 0x26, 0x35 ] )[ :1 ]
ct_6  = bytes( [ 0x39, 0x4D, 0x54, 0x26, 0x35 ] )[ 1: ]

ct_a9mt5 = bytes([0x39,0x4D,0x54,0x26,0x35])

ks, s, i, j = rc4_prga( s, i, j, 31 )
print( bytes( a ^ b for a, b in zip( ct_4, ks ) ).decode() )

ks, s, i, j = rc4_prga( s, i, j, 1 )
print( bytes( a ^ b for a, b in zip( ct_5, ks ) ).decode() )

ks, s, i, j = rc4_prga( s, i, j, 4 )
print( bytes( a ^ b for a, b in zip( ct_6, ks ) ).decode() )




# sub_7F5D decryptions
ct_7    = bytes([0x53,0xD9,0xC6,0xD8,0x09,0x82,0x27,0xCF,0xA1,0xDE,0x17,0x8A])
ct_8    = bytes([0xD2,0x20,0x8A,0x73,0x75,0x62,0xCB,0x5B,0xB5,0x65,0xDA,0x5F,0x74,0xB1,0xB5,0x4A,0x19,0x7D,0x57,0x92])
ct_9    = bytes([0x10,0xDB,0xF5,0x06,0x99])
ct_10   = bytes([0xC4])
ct_11   = bytes([0x13,0x45,0x0F,0x8E,0xC6,0x01,0x59,0xB1,0x13,0x61,0x49,0x04,0x29,0x12,0xE4,0x9B])
ct_12   = bytes([0x5C,0xF8,0x80,0x3D,0xC8,0x84,0xFC,0x82,0x5A,0xAA,0x1B,0x13,0x9C,0xB2])

ks, s, i, j = rc4_prga( s, i, j, 12 )
print( bytes( a ^ b for a, b in zip( ct_7, ks ) ).decode() )

ks, s, i, j = rc4_prga( s, i, j, 20 )
print( bytes( a ^ b for a, b in zip( ct_8, ks ) ).decode() )

ks, s, i, j = rc4_prga( s, i, j, 5 )
print( bytes( a ^ b for a, b in zip( ct_9, ks ) ).decode() )

ks, s, i, j = rc4_prga( s, i, j, 1 )
print( bytes( a ^ b for a, b in zip( ct_10, ks ) ).decode() )

ks, s, i, j = rc4_prga( s, i, j, 16 )
print( bytes( a ^ b for a, b in zip( ct_11, ks ) ).decode() )

ks, s, i, j = rc4_prga( s, i, j, 14 )
print( bytes( a ^ b for a, b in zip( ct_12, ks ) ).decode() )
