onvotar-bot / onvotar-base

Codi base i compartit per bots de consulta de col·legi electoral
MIT License
1 stars 3 forks source link

Cal que el desxifat estigui en JS? #1

Closed carlesm closed 7 years ago

carlesm commented 7 years ago

El procés de llençar un nodejs per executar el desxifrat castiga molt, no el podem mirar de refer en python nadiu?

masipcat commented 7 years ago

+1

pokoli commented 7 years ago

Fa una mica de coisor als ulls!!!!

iordic commented 7 years ago

Es deu de poder amb la llibreria de pyCrypto. I el fragment de codi:

letter_num = int(dni_num/23)
letter_num *= 23
letter_num = dni_num-letter_num

Es pot cambiar per:

letter_num = dni_num % 23
carlesm commented 7 years ago

No és que faci cosa mirar-te el javascript (que també), és una qüestiò d'eficiencia, no arrancar 1 procés de shell+1 procés de nodejs cada consulta.

O fer el bot directament en nodejs....

onvotar-bot commented 7 years ago

Estic d'acord, accepto un PR que ho passi a Python. Jo em vaig rendir i per això faig la crida a nodejs, ja que el meu coneixements de criptografia s'han quedat petits. A nodejs, es crida aquesta funció: https://nodejs.org/api/crypto.html#crypto_crypto_createdecipher_algorithm_password_options

Amb la llibreria de pyCrypto, no hi ha manera d'aconseguir desencriptar només per password, s'ha de fer amb key+IV (inicialization_vector). I no acabo d'entendre com treure els necessaris per poder desencriptar de la mateixa forma que fa node.

Si algú ho aconsegueix, PR :D

iordic commented 7 years ago

Crec que ho tinc. Pareix que funciona amb este codi:

from Crypto.Cipher import AES

def EVP_BytesToKey(password, salt, key_len, iv_len):
    """
    Derive the key and the IV from the given password and salt.
    """    
    dtot =  hashlib.md5(password + salt).digest()
    d = [dtot]
    while len(dtot)<(iv_len+key_len):
        d.append(hashlib.md5(d[-1] + password + salt).digest())
        dtot += d[-1]
    return dtot[:key_len], dtot[key_len:key_len+iv_len]

def _decrypt(text, password):
    # crypto.createDecipher() no gasta salt:
    key, iv = EVP_BytesToKey(password, '', 32, 16)
    decipher = AES.new(key, AES.MODE_CBC, iv)
    return decipher.decrypt(text.strip().decode("hex")).decode('utf-8')

Sería canviar la funció _decrypt() per eixa, crear la funció EVP_BytesToKey() (trobada a internet) en el fitxer calculate.py. També faría falta tindre instalat pyCrypto.

onvotar-bot commented 7 years ago

Ho estas executant amb Python 3? A mi aquest codi em dona problemes amb Python3 "TypeError: Unicode-objects must be encoded before hashing"

Ja vaig passar per aquí (vaig provar aquesta funció EVP_BytesToKey), però no vaig ensortir-me en fer-la funcionar en Python 3

iordic commented 7 years ago

No, amb python2.7. Vaig a vore sí ho conseguisc amb python3.

iordic commented 7 years ago

Amb python3 em funciona amb este codi (en debian, no aconseguia instalar pycrypto a windows :/ ):

def EVP_BytesToKey(password, salt, key_len, iv_len):
    dtot = hashlib.md5((password + salt).encode()).digest()
    d = [dtot]
    while len(dtot) < (iv_len + key_len):
        d.append(hashlib.md5(d[-1] + (password + salt).encode()).digest())
        dtot = dtot + d[-1]
    return dtot[:key_len], dtot[key_len:key_len+iv_len]

def _decrypt(text, password):
    # crypto.createDecipher() no gasta salt:
    key, iv = EVP_BytesToKey(password, '', 32, 16)
    decipher = AES.new(key, AES.MODE_CBC, iv)
    return decipher.decrypt(bytes.fromhex(text.strip()))

Si algú te pycrypto instalat a windows podria provar-ho.

iordic commented 7 years ago

He gastat el pyCryptodome, es veu que el pyCrypto està deprecated i no funciona amb python 3.6. I m'ha funcionat.

onvotar-bot commented 7 years ago

Perfecte! Fet i funcionant amb el nou codi.

Mil gràcies!