Convertendo Código Java para Python

1,120 views
Skip to first unread message

mar...@hydrosassessoria.com.br

unread,
Apr 6, 2015, 9:12:02 AM4/6/15
to python...@googlegroups.com
Olá pessoal, recentemente comecei a aprender Python (cerca de 6 meses), e já estou trabalhando com Python (comecei a 2 meses). Ainda estou com alguma dificuldade em alguns códigos e por isso venho pedir a ajuda de vocês. Uma de minhas atribuições é recriar em Python um código Java, responsável por gerar uma chave (um tipo de hash) para autenticar em um sistema com diversos serviços. Já migrei o código, porém, cheguei em um ponto onde não consigo sair. O código java pode ser visto em [1]. Esse é só um pequeno trecho dele (o que estou tendo problemas). O código python que fiz foi esse [2]. Meu código não apresenta erro, mas também não está gerando a chave corretamente, e o pior é que são poucas diferenças, como mostro abaixo:

                                           | |                                                                                                               |
JAVA.....: OJ7qPX+hN4pEMZdoMpwtAqdXH4QXH2l+N4UdQZdNNHEpPY+hA1B2RaolJr-j8L7VA2tkO43CS+
PYTHON: OJ7qPX+hN4pEMapoMpwtAqdXH4QXH2l+N4UdQZdNNHEpPY+hA1B2RaolJr-j8L7VA2tkO43CS

Como podem ver, a semelhança dos códigos gerados é muito grande e como comecei recentemente, não estou conseguindo avaliar o que estou fazendo errado (erro em 3 caracteres apenas). Se alguém puder pelo menos me indicar em que ponto de meu código estou errando, eu agradeceria muito. (Não conheço Java e peguei um livro para ir comparando os tipos da linguagem Java com os do Python e fui codificando). 



Diego Rocha

unread,
Apr 6, 2015, 12:54:20 PM4/6/15
to python...@googlegroups.com
Qual valor que você está usando para gerar o hash?
Quero tentar reproduzir aqui

Atenciosamente,
Diego Rocha

--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasil+unsubscribe@googlegroups.com

---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasil+unsubscribe@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Marcio Bayma

unread,
Apr 6, 2015, 3:22:40 PM4/6/15
to python...@googlegroups.com
Olá Diego, 

Eu coloquei apenas um trecho do código que gera o hash de ambos... é apenas a parte que não consegui ajustar. O código completo são estes:

O Hash que preciso é dado pelo método genHashUsuario. A senha infelizmente não posso passar por ser uma senha de autenticação no serviço, mas pode testar com um valor qualquer que as diferenças são pequenas e semelhantes. 



---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.

Linux - Junior Polegato

unread,
Apr 6, 2015, 4:20:39 PM4/6/15
to python...@googlegroups.com
On 06-04-2015 14:13, Marcio Bayma wrote:
> Olá Diego,
> Eu coloquei apenas um trecho do código que gera o hash de ambos... é
> apenas a parte que não consegui ajustar. O código completo são estes:
> Python: http://pastebin.com/CTSQDcvS
> Java: http://pastebin.com/ehNAzB5V
> O Hash que preciso é dado pelo método genHashUsuario. A senha
> infelizmente não posso passar por ser uma senha de autenticação no
> serviço, mas pode testar com um valor qualquer que as diferenças são
> pequenas e semelhantes.

Olá!

Há um tempo atrás surgiu um tópico desse de C para Python
escovando bits [1], acompanhe para ver que há diferenças intrínsecas das
linguagens que precisam ser ajustadas.

Dei meus pitacos [2] sobre as sutis diferenças, mas não tenho
tempo para ver seu código durante essa semana, quem sabe semana que vem
se ainda não tiver resolvido...

[1]
https://groups.google.com/forum/#!searchin/python-brasil/traduzir/python-brasil/VwsPoM3k8Mc/obSLVbdQtQEJ
[2] https://gist.github.com/JuniorPolegato/c1c2e1270e52945e22c6


--

[]'s

Junior Polegato

Marcio Bayma

unread,
Apr 6, 2015, 6:06:59 PM4/6/15
to python...@googlegroups.com
Em 6 de abril de 2015 15:20, Linux - Junior Polegato <li...@juniorpolegato.com.br> escreveu:

Olá!

        Há um tempo atrás surgiu um tópico desse de C para Python escovando bits [1], acompanhe para ver que há diferenças intrínsecas das linguagens que precisam ser ajustadas.

Olá Junior, antes de qualquer coisa, muito obrigado pela força...

Dei uma olhada no link que você mostrou, mas não esclareceu muita coisa aqui. Apesar de não saber muito sobre Java, consegui me virar relativamente bem com as definições de tipos e tal (maiores dúvidas com relação a tipos, como o StringBuilder, CharsetEncoder, etc). Meu problema está mais em não conhecer a fundo a linguagem Python e não conseguir criar uma referência entre um e outro (tem coisas que consegui entender no java como funciona. Até achei na documentação do Python como deveria ser, mas não sei se fiz corretamente). 

 
        Dei meus pitacos [2] sobre as sutis diferenças, mas não tenho tempo para ver seu código durante essa semana, quem sabe semana que vem se ainda não tiver resolvido...

[1] https://groups.google.com/forum/#!searchin/python-brasil/traduzir/python-brasil/VwsPoM3k8Mc/obSLVbdQtQEJ
[2] https://gist.github.com/JuniorPolegato/c1c2e1270e52945e22c6

Beleza. Irei revisar o código todo. Fiz uma depuração "meia boca" no código Java, onde peguei o código e saí vendo o valor das variáveis. Fiz o mesmo no Python. O (primeiro) problema está aparecendo dentro do método genHashUsuario, no retorno do self.toByteArray. O valor da chave está sendo pego corretamente. Por consequencia, como o retornor de toByteArray vem errado, o retorno de toString também, mas não sei dizer se o problema do método toString está errado devido a entrada errada apenas, ou se ele em si também está errado (estou tentando resolver o problema do toByteArray antes de partir para o próximo problema, pois nem sei se este problema realmente existe).

Mas de qualquer forma, muito obrigado!

Renzo Nuccitelli

unread,
Apr 7, 2015, 6:19:43 PM4/7/15
to python...@googlegroups.com
Bom, como as chaves estâo parecidas, o processo de hashing deve estar correto. Afinal, como esse tipo de funçâo tem a propriedade de avalanche, com uma mĩnima alteraçâo de chave ou conteúdo o hash seria bastante diferente. Idealmente, mudando 50% com uma simples mudança de caracter.

Sendo a assim, acredito que o problema possa ser enconding. Qual versâo de Python está usando? Se for 3, as strings sâo unicode e vc teria que colocar no encoding desejado. No java, vc setou o encoding "Windows-1252" na primeira linha, mas nâo fez o  mesmo no Python.

Marcio Bayma

unread,
Apr 7, 2015, 6:54:36 PM4/7/15
to python...@googlegroups.com
Olá Renzo, primeiramente muitíssimo obrigado pela ajuda...

Em 7 de abril de 2015 17:19, Renzo Nuccitelli <ren...@gmail.com> escreveu:
Bom, como as chaves estâo parecidas, o processo de hashing deve estar correto. Afinal, como esse tipo de funçâo tem a propriedade de avalanche, com uma mĩnima alteraçâo de chave ou conteúdo o hash seria bastante diferente. Idealmente, mudando 50% com uma simples mudança de caracter.

Sendo a assim, acredito que o problema possa ser enconding. Qual versâo de Python está usando? Se for 3, as strings sâo unicode e vc teria que colocar no encoding desejado. No java, vc setou o encoding "Windows-1252" na primeira linha, mas nâo fez o  mesmo no Python.

Estou usando Python 2.7. Sobre o encoding, eu até tentei colocar no início do arquivo # coding=Windows-1252 e mudar no meu editor (Notepad++) para o Windows-1252, mas começou a aparecer alguns erros de encoding, daí acabei voltando para o UTF-8. Acho que pode ter sido vacilo meu, porque comecei a pouco tempo e só tinha trabalhado com arquivos utf-8. Vou tentar mudar o encoding apenas nas strings de senha e chaves, será que resolve?  Pensei em fazer mais ou menos assim: 
KEY = '...'.encode('windows-1252')
Isso para a chave e para o dado a ser criptografado. Será que resolveria, ou eu teria mesmo que usar no arquivo todo?

De qualquer forma, vou testar aqui. Muito obrigado pela força! 

Allan Douglas R. de Oliveira

unread,
Apr 7, 2015, 10:18:07 PM4/7/15
to python...@googlegroups.com
Não cheguei a testar o código mas existe essa discrepância:

        if (len >= 1) {
            key.setCharAt(20, data.charAt(0));
        }

_lengths = {'1': 10, '2': 34, '3': 46, '4': 12, '5': 4, '6': 32, '7': 20, '8': 11, '9': 25}

Isto é, no python a primeira transformação deveria usar o índice 20 como destino ao invés do 10.

--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com

---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.



--
Allan Douglas R. de Oliveira

Marcio Bayma

unread,
Apr 8, 2015, 12:48:53 AM4/8/15
to python...@googlegroups.com
Em 7 de abril de 2015 21:17, Allan Douglas R. de Oliveira <alland...@gmail.com> escreveu:
Não cheguei a testar o código mas existe essa discrepância:

        if (len >= 1) {
            key.setCharAt(20, data.charAt(0));
        }

_lengths = {'1': 10, '2': 34, '3': 46, '4': 12, '5': 4, '6': 32, '7': 20, '8': 11, '9': 25}

Isto é, no python a primeira transformação deveria usar o índice 20 como destino ao invés do 10.


Allan, show de bola.... acho que foi vacilo de iniciante... Agora, só tem um item estranho.... 

Agora estou tendo o seguinte item...
JAVA.....: OJ7qPX+hN4pEMZdoMpwtAqdXH4QXH2l+N4UdQZdNNHEpPY+hA1B2RaolJr-j8L7VA2tkO43CS+
PYTHON: OJ7qPX+hN4pEMZdoMpwtAqdXH4QXH2l+N4UdQZdNNHEpPY+hA1B2RaolJr-j8L7VA2tkO43CS

Esse "+" no final do código java agora é a única coisa que está faltando resolver. Na verdade, descobri algo interessante: quando a senha para geração do hash tem menos que 8 caracteres, ele bate, quando tem 8 ou mais ele não bate, a menos que eu adicione um '\0' no final. Como preciso entregar isso, realizei esse ajuste e irei entregar amanhã de manhã, e com mais calma vou tentar localizar o problema.

Muito obrigado a todos! Valeu mesmo!

Linux - Junior Polegato

unread,
Apr 8, 2015, 4:44:23 AM4/8/15
to python...@googlegroups.com

Olá!

Esse + provavelmente deve ser pelo fato da string em Java terminar com \x00. Tente adicionar isso na string em Python e veja o resultado.

[]'s

Junior Polegato

Marcio Bayma

unread,
Apr 8, 2015, 4:57:06 AM4/8/15
to python...@googlegroups.com
Eu fiz isso Junior, mas daí falha para alguns valores. Mas já descobri como fazer... eu adicionei o \00  e verifico se a palavra a ser criptografada tem menos de 8 letras. Se tiver, eu removo o "+". Testei com todos os valores possíveis (que tenho aqui) e deu certo. Depois tento descobrir com mais calma isso, porque, se tiro o \00, falha para palavras grandes, se deixo, falha para pequenas. Mas tá tranquilo.. já deu certo! Muito obrigado! Valeu mesmo!

Renzo Nuccitelli

unread,
Apr 8, 2015, 8:49:47 PM4/8/15
to python...@googlegroups.com
O encoding no inícío só indica o codificação do arquivo. E isso tem que estar em conformidade. No Windows é possível ver o mudar o encoding com o Notepad ++. Eu uso Pycharm e quando programo em Python 2.7 eu configuro o seguinte cabeçal
:
# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals

Assim eu trabalho sempre com unicode no código, como acontece em Java e no Python 3.

Mas ao utilizar criptografia, vc deve utilizar a sequência de bytes. Logo, o unicode deve ser transformado com a função encode. A regra geral de string é: ao receber uma string de algum lugar (arquivo, web service), transforme para unicode com a funçâo decode, de acordo com o encoding do recurso. Faça as operações necessárias com o unicode. Ao enviar os dados, encode novamente, deixando claro em sua documentaçâo qual encoding está usando.

O Luciano Ramalho mandou um email explicando string em Python que foi genial. Infelizmente não consegui encontrá-lo. Ele inclusive aborda isso no curso PyPrático, no qual eu realmente entendi toda essa história de Unicode e enconding.

Abs,




---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasil+unsubscribe@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.

--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:


---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasil+unsubscribe@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.

--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:


---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasil+unsubscribe@googlegroups.com.

Marcio Bayma

unread,
Apr 8, 2015, 10:43:49 PM4/8/15
to python...@googlegroups.com
Em 8 de abril de 2015 19:49, Renzo Nuccitelli <ren...@gmail.com> escreveu:
O encoding no inícío só indica o codificação do arquivo. E isso tem que estar em conformidade. No Windows é possível ver o mudar o encoding com o Notepad ++. Eu uso Pycharm e quando programo em Python 2.7 eu configuro o seguinte cabeçal
:
# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals


Você só adiciona estas duas linhas no cabeçalho? Tipo, não precisa usar essas duas funções (absolute_import e unicode_literals) em lugar nenhum, só importá-las?

 
Assim eu trabalho sempre com unicode no código, como acontece em Java e no Python 3.


Show de bola. Vi no curso do Masanori umas funções com nomes contendo acentos. Achei muito legal.


 
Mas ao utilizar criptografia, vc deve utilizar a sequência de bytes. Logo, o unicode deve ser transformado com a função encode. A regra geral de string é: ao receber uma string de algum lugar (arquivo, web service), transforme para unicode com a funçâo decode, de acordo com o encoding do recurso. Faça as operações necessárias com o unicode. Ao enviar os dados, encode novamente, deixando claro em sua documentaçâo qual encoding está usando.


Então na minha rotina bastaria eu usar o decode e depois pra retornar o encode?
senha = 'senha_inicial_sem_criptografia'.decode('windows-1252')
# processamento
senhaCriptografada = 'senha_ja_criptografada'.encode('utf-8')
Seria isso?
 

 
O Luciano Ramalho mandou um email explicando string em Python que foi genial. Infelizmente não consegui encontrá-lo. Ele inclusive aborda isso no curso PyPrático, no qual eu realmente entendi toda essa história de Unicode e enconding.


Legal. Assim que sobrar um tempinho (e juntar R$ também), se tiver o curso disponível vou fazê-lo.

 
Abs,



Uma abraço e muito obrigado!
Valeu mesmo! 

Alysson Bruno

unread,
Apr 9, 2015, 6:58:50 AM4/9/15
to python-brasil
Olá,


2015-04-08 21:49 GMT-03:00 Renzo Nuccitelli <ren...@gmail.com>:

O Luciano Ramalho mandou um email explicando string em Python que foi genial. Infelizmente não consegui encontrá-lo. Ele inclusive aborda isso no curso PyPrático, no qual eu realmente entendi toda essa história de Unicode e enconding.

Abs,

​Acho que você fala deste email: https://groups.google.com/d/msg/django-brasil/tT4Xa_h1qsA/LmuAPpwLSI0J (sempre o uso como referência para esse assunto), mas foi na lista do django, não na Python Brasil :)​


paz e amor (love and peace),

Alysson Bruno
===============================================
Palmas(TO)
Brasil

Blog: http://abruno.com


=================================================================
Meu alterego Escritor:

Leia alguns contos que escrevo, não esqueça de me dar sua opinião: http://goo.gl/Wjn4p

=================================================================

Nilo Menezes

unread,
Apr 13, 2015, 3:49:09 AM4/13/15
to python...@googlegroups.com
Opa,

Sobre UTF-8 e encodings, eu postei já há algum tempo aqui:
e

Retirado também de um post que tinha feito na lista.

Sem esquecer do texto já traduzido em nossa wiki:


[]

Nilo Menezes


-------------------
Nilo Menezes (@lskbr)

--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:


---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.

Marcio Bayma

unread,
Apr 14, 2015, 2:03:18 AM4/14/15
to python...@googlegroups.com
Poxa, este tópico do Luciano Ramalho é show. Muito legal. Não sabia de quase nada disso aí. Só uma coisa que estranhei: testei colocar len('avião') como o indicado, mas saiu a quantidade correta de caracteres (5). 

Nilo, muito legal esse material também. Ajudou bastante. Na verdade, todos ajudaram bastante. Muito obrigado pessoal. Valeu mesmo!


Reply all
Reply to author
Forward
0 new messages