Hey galera. Estou fazendo um cliente bittorrent em python baseado no ABC.
Então é o seguinte estou tentado encriptar um sistema RC4 de forma a contornar o Traffic Shaping dos ISP's. A ideia é encriptar o mais possivel o tráfego bittorrent para que este não seja identificado pela operadora e seja bloqueado.
Deixo aqui o meu código RC4. Por favor ajudem-me a melhorar e tornar o código mais eficiente. Aceito todo o tipo de truques e dicas.
Ficheiro ARC4.py
"""From TLS Lite: Pure-Python RC4 implementation"""
import array
def bytesToString(bytes):
return bytes.tostring()
def createByteArrayZeros(howMany):
return array.array('B', [0] * howMany)
def stringToBytes(s):
bytes = createByteArrayZeros(0)
bytes.fromstring(s)
return bytes
def new(key):
return RC4(key)
class RC4:
def __init__(self, key):
keyBytes = stringToBytes(key)
S = [i for i in range(256)]
j = 0
for i in range(256):
j = (j + S[i] + keyBytes[i % len(keyBytes)]) % 256
S[i], S[j] = S[j], S[i]
self.S = S
self.i = 0
self.j = 0
def encrypt(self, plaintext):
plaintextBytes = stringToBytes(plaintext)
S = self.S
i = self.i
j = self.j
for x in range(len(plaintextBytes)):
i = (i + 1) % 256
j = (j + S[i]) % 256
S[i], S[j] = S[j], S[i]
t = (S[i] + S[j]) % 256
plaintextBytes[x] ^= S[t]
self.i = i
self.j = j
return bytesToString(plaintextBytes)
def decrypt(self, ciphertext):
return self.encrypt(ciphertext)
Ficheiro BTcrypto.py
# Written by John Hoffman
# based on code by Uoti Urpala
# see LICENSE.txt for license information
from __future__ import generators # for python 2.2
from random import randrange,randint,seed
try:
from os import urandom
except:
seed()
urandom = lambda x: ''.join([chr(randint(0,255)) for i in xrange(x)])
from sha import sha
try:
True
except:
True = 1
False = 0
try:
from Crypto.Cipher import ARC4
CRYPTO_OK = True
except:
import ARC4
CRYPTO_OK = False
KEY_LENGTH = 160
DH_PRIME = 0xFFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A63A36210000000000090563
PAD_MAX = 200 # less than protocol maximum, and later assumed to be < 256
DH_BYTES = 96
def bytetonum(x):
return long(x.encode('hex'), 16)
def numtobyte(x):
x = hex(x).lstrip('0x').rstrip('Ll')
x = '0'*(192 - len(x)) + x
return x.decode('hex')
class Crypto:
def __init__(self, initiator, disable_crypto = False):
self.initiator = initiator
self.disable_crypto = disable_crypto
# if not disable_crypto and not CRYPTO_OK:
# raise NotImplementedError, "attempt to run encryption w/ none installed"
self.privkey = bytetonum(urandom(KEY_LENGTH/8))
self.pubkey = numtobyte(pow(2, self.privkey, DH_PRIME))
self.keylength = DH_BYTES
self._VC_pattern = None
def received_key(self, k):
self.S = numtobyte(pow(bytetonum(k), self.privkey, DH_PRIME))
self.block3a = sha('req1'+self.S).digest()
self.block3bkey = sha('req3'+self.S).digest()
self.block3b = None
def _gen_block3b(self, SKEY):
a = sha('req2'+SKEY).digest()
return ''.join([ chr(ord(a[i])^ord(self.block3bkey[i]))
for i in xrange(20) ])
def test_skey(self, s, SKEY):
block3b = self._gen_block3b(SKEY)
if block3b != s:
return False
self.block3b = block3b
if not self.disable_crypto:
self.set_skey(SKEY)
return True
def set_skey(self, SKEY):
if not self.block3b:
self.block3b = self._gen_block3b(SKEY)
crypta = ARC4.new(sha('keyA'+self.S+SKEY).digest())
cryptb = ARC4.new(sha('keyB'+self.S+SKEY).digest())
if self.initiator:
self.encrypt = crypta.encrypt
self.decrypt = cryptb.decrypt
else:
self.encrypt = cryptb.encrypt
self.decrypt = crypta.decrypt
self.encrypt('x'*1024) # discard first 1024 bytes
self.decrypt('x'*1024)
def VC_pattern(self):
if not self._VC_pattern:
self._VC_pattern = self.decrypt('\x00'*8)
return self._VC_pattern
def read(self, s):
self._read(self.decrypt(s))
def write(self, s):
self._write(self.encrypt(s))
def setrawaccess(self, _read, _write):
self._read = _read
self._write = _write
def padding(self):
return urandom(randrange(PAD_MAX-16)+16)
Pergunta
Cheaster
Hey galera. Estou fazendo um cliente bittorrent em python baseado no ABC.
Então é o seguinte estou tentado encriptar um sistema RC4 de forma a contornar o Traffic Shaping dos ISP's. A ideia é encriptar o mais possivel o tráfego bittorrent para que este não seja identificado pela operadora e seja bloqueado.
Deixo aqui o meu código RC4. Por favor ajudem-me a melhorar e tornar o código mais eficiente. Aceito todo o tipo de truques e dicas.
Ficheiro ARC4.py
Ficheiro BTcrypto.pyPor favor me ajudem-me com o meu programa.
Contacto MSN: geral@bt-revolution.net
Cumps
Link para o comentário
Compartilhar em outros sites
0 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.