ASCII para Bytes

14 respostas
A

Olá

Eu preciso converter uma cadeia de caracteres ASCII para bytes.
Alguém pode me ajudar?

14 Respostas

M

Faz um for para percorrer um texto.
Para cada caracter você aplica binario = Integer.toBinaryString(str.charAt(i));

Boa sorte!

E

A classe java.lang.String tem um método getBytes. Consulte sempre a documentação.

http://java.sun.com/javase/6/docs/api/java/lang/String.html

G

Seria isso? String str = "arquivo"; byte[]bytes = str.getBytes();
Explique melhor??

Poneis123
String str = "arquivo";  
     
     byte[] bytes = str.getBytes();
     
     for(int i = 0; i<str.length(); i ++){
      System.out.println("byte "+str.charAt(i)+" "+bytes[i]);
     }
Isto gerará a seguinte saída: byte a 97 byte r 114 byte q 113 byte u 117 byte i 105 byte v 118 byte o 111

Esses valores são os valores em decimal da tabela do código ASC que é retornado do getBytes().

A

O getBytes() já retorna o valor da tabela ASCII?

Eu estou tentando gerar um hash de uma determinada string, pra isso eu preciso passar essa cadeia ASCII para bytes para então poder gerar o hash. Porém, quando eu mando gerar o hash com string.getBytes está me retornando um resultado errado :~

E

Resultado errado? Dê um exemplo de uma string, do resultado esperado e do resultado obtido. Diga qual é o algoritmo usado.

A

exemplo:

eu tenho a string: 31000000LLLLL00000000000120070120TNN00000000010000000000000001000002658100018564071878
segundo a manual, essa cadeia de ASCII deve ser convertida para bytes. Depois tenho que gerar o hash utilizando sha-1 e depois assinar utilizando o RSA-SHA1.
o resultado deve ficar algo assim: ro6Og7L5BMPpYZKXfSSITNe8U9C4a95P9dIspX8R0Okg1CRsA87N08Llaq+q6IVOGLhjGMkAELBIkQ8T0BGR3czgtJAuOcgMlOmGZlgziWAg3Kww3pFD+rYxE+DRgL2M5QXTaZEYwVNj0lZyJpt1nS9LHUqO7PB+ivYRk+ewUVA=

Poneis123

Num entendi mto bem esse seu exemplo não, mas assim, vc ta querendo criptografa uma String para SHA-1 e obter o bytes[]?

Se for, utiliza assim:

MessageDigest md = MessageDigest.getInstance( "SHA-1" ); md.update("SuaSenha".getBytes()); byte[] byteSHA = md.digest();

apartir dai vc trabalha com o byte[] do código gerado pelo algoritmo SHA-1… cuidado com esse byte[] gerado, nunca volte-o para String.

A

na verdade, eu preciso criptografar um array de bytes pelo sha-1 (por isso perguntei anteriormente como se converte uma cadeia ASCII para bytes)
e depois assinar esse resultado utilizando o RSA-SHA1

Poneis123

Exatamente, a criptografia se faz com base no array de bytes. como no exemplo q eu passei:

veja os comentários:

MessageDigest md = MessageDigest.getInstance( "SHA-1" ); md.update("SuaSenha".getBytes()); //aqui vc passa o array de bytes do que deseja criptografar byte[] byteSHA = md.digest(); //aqui ele faz a criptografia e retorna o array de bytes critografado

Vc disse no outro post que estava tendo erro, qual erro? vc só passou o resultado esperado.
Agora vc precisa verificar para fazer essa assinatura RSA. ela trabalha apartir de um array de bytes? ou vc precisa converter para hexadecimal ou Base64 e etc…

Se ela trabalhar com byte[] vc pega esse byte[] gerado pelo SHA-1 e manda pra ele assinar.

E

Bom, o SHA-1 (não o RSA-SHA1, que depende de sua chave privada e do padding usado para o algoritmo RSA) dessa sua string, convertida para um array de bytes, é

0000    64 4E 03 90 79 EA 6E 25  DF D0 B3 E4 72 3A 7A BD   dN..yÛn%....r:z.
0010    51 9E 2C 7B                                        Q.,{

Em base-64, o SHA-1 ficaria

ZE4DkHnqbiXf0LPkcjp6vVGeLHs=

Veja primeiro se você está calculando corretamente o SHA-1.

A

Ok,

Mas assim...
Eu utilizo o código, porém, se mando imprimir retorna diferente (talvez tenha uma outra forma de ver o resultado do sha-1 que eu desconheço :~)
segue o código:

public static void teste() throws IOException {

                String texto = "31000000LLLLL00000000000120070120TNN00000000010000000000000001000002658100018564071878";
		byte[] byteSHA = null;

		MessageDigest md = null;
		try {
			md = MessageDigest.getInstance("SHA-1");
			md.update(texto.getBytes());
			byteSHA = md.digest();

		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}

		System.out.println("byteSHA" + byteSHA);

imprime algo assim: [B@addbf1
por quê?

e o erro que eu comentei no post anterior, é que assim... essa criptografia toda será mandada para o webservice da prefeitura. Após o envio, eles me retornam a mensagem de erro indicando que a assinatura está errada.

E

O método toString de qualquer array nunca imprime os elementos do array. Ele sempre imprime algo como “[” + tipo do array + “@” + hashcode do objeto. No seu caso, o hashcode desse array era 0xaddbf1, e o tipo do array é “B” (ou seja, byte), portanto ele imprime sempre esse lixo.

Use o método printHex que o Thingol postou algum tempo atrás, para poder ver os elementos do array em hexadecimal. Veja em:

http://www.guj.com.br/posts/list/36769.java#195284

Poneis123

Então Aline, vc não pode imprimir esse código gerado pelo SHA-1, pra vc imprimir ele vc tem que converter ele para String, vc pode ter uma idéia de como ele fica fazendo assim:

System.out.println("byteSHA" + new String(byteSHA))

MAS ATENÇÃO: Nunca utilize essa String do código SHA para nada… pois quando vc passa o texto pelo algoritmo SHA-1 ele gera diversos caracteres especiais que qdo converte para String da problema!! vc precisa sempre trabalhar com o byteSHA ou como foi dito converter ele para hexadecimal ou Base64 que nesta conversão vai ser utilizado apenas caracteres conhecidos por exemplo A-Z, 0-9, *, / e =

Para converter ele para hexadecimal vc pode usar o seguinte:

BigInteger hash = new BigInteger( 1, byteSHA); //Passando o byte[] gerado e nunca converta esse para String String retornaSenha = hash.toString(16); //este 16 é q informa o hexadecimal System.out.println("Convertendo o SHA em Hex : " + retornaSenha);

Criado 7 de abril de 2010
Ultima resposta 8 de abr. de 2010
Respostas 14
Participantes 5