Closed carlesm closed 7 years ago
+1
Fa una mica de coisor als ulls!!!!
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
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....
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
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.
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
No, amb python2.7. Vaig a vore sí ho conseguisc amb python3.
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.
He gastat el pyCryptodome, es veu que el pyCrypto està deprecated i no funciona amb python 3.6. I m'ha funcionat.
Perfecte! Fet i funcionant amb el nou codi.
Mil gràcies!
El procés de llençar un nodejs per executar el desxifrat castiga molt, no el podem mirar de refer en python nadiu?