Olá
Eu preciso converter uma cadeia de caracteres ASCII para bytes.
Alguém pode me ajudar?
Olá
Eu preciso converter uma cadeia de caracteres ASCII para bytes.
Alguém pode me ajudar?
Faz um for para percorrer um texto.
Para cada caracter você aplica binario = Integer.toBinaryString(str.charAt(i));
Boa sorte!
A classe java.lang.String tem um método getBytes. Consulte sempre a documentação.
Seria isso? String str = "arquivo";
byte[]bytes = str.getBytes();
Explique melhor??
[code] String str = “arquivo”;
byte[] bytes = str.getBytes();
for(int i = 0; i<str.length(); i ++){
System.out.println("byte "+str.charAt(i)+" "+bytes[i]);
}[/code]
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().
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 :~
Resultado errado? Dê um exemplo de uma string, do resultado esperado e do resultado obtido. Diga qual é o algoritmo usado.
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=
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.
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
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.
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.
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:
[code]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);
[/code]
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.
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:
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);