-
-
Save ffernandoalves/3f7ee051cffbfe990bf0cf0db3be28d6 to your computer and use it in GitHub Desktop.
from Crypto.Cipher import AES | |
from Crypto import Random | |
import base64 | |
import requests | |
import xml.etree.ElementTree as ET | |
block_size = AES.block_size | |
unpad = lambda s : s[0:-ord(s[-1])] | |
lg_deckey = b"wleldpadptmdkdnt" | |
lg_enckey = b"qlxnTldlsvntzl!#" | |
def pad(plain_text): | |
""" | |
func to pad cleartext to be multiples of 8-byte blocks. | |
If you want to encrypt a text message that is not multiples of 8-byte blocks, | |
the text message must be padded with additional bytes to make the text message to be multiples of 8-byte blocks. | |
""" | |
number_of_bytes_to_pad = block_size - len(plain_text) % block_size | |
ascii_string = chr(number_of_bytes_to_pad) | |
padding_str = number_of_bytes_to_pad * ascii_string | |
padded_plain_text = plain_text + padding_str | |
return padded_plain_text | |
def lg_encrypt(string): | |
key=lg_enckey | |
plain = pad(string) | |
iv = b"\x00"*AES.block_size | |
cipher = AES.new(key, AES.MODE_CBC, iv) | |
encrypted_text = cipher.encrypt(plain.encode("utf8")) | |
return base64.b64encode(encrypted_text).replace(b"+", b"m").replace(b"/", b"f") | |
def lg_decrypt(string): | |
if len(string) == 0 or string == "\n": | |
return "" | |
key=lg_deckey | |
crypted = base64.b64decode(string) | |
cipher = AES.new(key, AES.MODE_ECB) | |
decrypted_text = cipher.decrypt(crypted) | |
return unpad(decrypted_text.decode("utf8")) | |
imei="lol" | |
esn = lg_encrypt(imei) | |
data = {'esn':esn} | |
r = requests.post(url = "https://csmg.lgmobile.com:49002/csmg/nb2c/gn_auth_model_check2.jsp", data=data) | |
def xml_recurse(node): | |
dec = lg_decrypt(node.text) | |
if (node.tag == "sw_url"): | |
dec = "http://tool.lime.gdms.lge.com/dn/downloader.dev?" + dec.split("?")[1] | |
print (node.tag, node.attrib, dec) | |
for child in node: | |
xml_recurse(child) | |
root = ET.fromstring(r.text) | |
xml_recurse(root) |
@kelisonbessa você pode tentar comentar as linha 54 e 55, que vai aparecer um link diferente pro sw_url
.
@kelisonbessa você tentar comentar as linha 54 e 55, que vai aparecer um link diferente pro
sw_url
.
Eu percebi que ele troca o link nessa linha, amigo muito obrigado. Eu sou programador iniciante em php e c#. Python achei bem diferente, o comentário pelo que pude perceber é feito com """ comentário """ as funções sem os {}, estou tentando rescrever o mesmo programa em c#, mas vou ter que estudar python antes ela é uma linguagem diferente na escrita comparado ao conhecimento que já tenho em php e c#. Amigo uma pergunta se possível poderia me falar o que é esse comando AES.new(key, AES.MODE_CBC, iv) isso é um tipo de criptografia?
Amigo uma pergunta se possível poderia me falar o que é esse comando AES.new(key, AES.MODE_CBC, iv) isso é um tipo de criptografia?
Sim, AES faz parte da biblioteca PyCryptodome do python. Aparentemente é preciso criptografar o imei usando AES e depois codifica usando base64 para depois fazer o POST no servidor, acho que deve ser por causa do tipo de requisição que o servidor deve aceitar. Os resultado do POST na linha 50, retorna tudo criptografado em AES e codificado em base64. Deve ter dado trabalho pro cara conseguir as key das linhas 12 e 13 que são usadas pra a criptografar e descriptografar.
Para falar a verdade usei essa lib somente uma vez por curiosidade, não sei muito bem como é que funciona a criptografia dela.
Mas nessa parte (AES.new(key, AES.MODE_CBC, iv)
), é instanciado um objeto com a chave de encriptação, sinaliza que é para usar o modo CBC e um 'initialization vector' (iv), esse obj vai possuir dois metódos encrypt() e decrypt(), neles você passa a sua mensagem (plain_text ou crypted_text).
Amigo novamente muito obrigado, graças a sua ajuda ao consertar o código, consegui entender o funcionamento do script, ainda não rescrevi o código em c#, mas já consegui rescrever em PHP que é a linguagens que tenho mais conhecimento. O mais complicado foi entender essa criptografia, mas ela é "aes-128-cbc" 128 bits e nessa função o key precisa ser de 32 bits, mas a api tem um key com 16 então tem que ser adicionado mais 16 bits que no python é feito na linha 30 e 31 e os dados é enviado via post e o retorno da api é criptografado também, para descriptografar é usado "aes-128-ecb".
Muito obrigado amigo, testei o código e funcionou, muito obrigado mesmo. no momento estou estudando c#, assim que puder vou estudar python. Muito Obrigado. Vou dá uma estuda básica para ver se consigo rescrever o código em c#. Muito obrigado.