2015-05-11 1 views
2

Здравствуйте, я использую ниже код для шифрования строки. Я нашел, что MD5 работает в -127 - +128 значений.java MD5 шифрование минус значение в массиве байтов

Я получаю значение минус для.

public static void main(String[] args) throws Exception { 
     String message = "smile"; 

     encrypt("Jack the Bear"); 
    } 

    public static void encrypt(String password) throws Exception { 

     byte byteData[] =null; 

    MessageDigest md = null; 
     try { 
     md = MessageDigest.getInstance("MD5"); 
      md.update(password.getBytes("US-ASCII")); 
     } catch (UnsupportedEncodingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (NoSuchAlgorithmException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     byteData = md.digest(); 
     System.out.println(Arrays.toString(byteData)); 


    } 

Мой выход: [101, 23, 66, 106, 91, -51, 6, 119, -13, 23, -101, 108, -122, 27, 20, -124]

Реальный выход: [101, 23, 66, 106, 91, 205, 6, 119, 243, 23, 155, 108, 134, 27, 20, 132]

+1

* Все * байты Java подписаны. Он не имеет ничего общего с MD5. – EJP

ответ

3

Это потому, что byte типа в Java (как и почти все другие типы), что означает, что он имеет диапазон -128..127.

Если вы хотите, чтобы преобразовать этот диапазон без знака диапазона (0..255), сделайте следующее:

byte b = -2; 
int i = b & 0xff; 

распечатать результат byteData так:

for (byte b : byteData) 
    System.out.print((b & 0xff) + " "); 

Если вы хотите, чтобы распечатать результат в шестнадцатеричном формате:

for (byte b : byteData) 
    System.out.printf("%02x ", b); 
+0

Скорее используйте шестнадцатеричный вместо десятичного. В любом случае вы не увидите хэш в десятичном формате. – Kayaman

+0

@ Kayaman Согласитесь, но у айзера есть «реальный» вывод в десятичной форме, поэтому я предложил это для ожидаемого результата. – icza

+0

Yup, я просто поместил комментарий здесь для дополнительной справки или так. – Kayaman

1

Ваш дайджест рассчитан правильно Однако нет ничего плохого в отрицательных байтовых значениях.

Байт-тип в Java имеет диапазон от -128 до +127, что может быть несколько неожиданным - многие считают, что байт является неподписанным, но Java не имеет неподписанных типов номеров.

+1

почти. Единственный неподписанный тип Java - 'char' (я знаю, это не имеет большого значения, поскольку вы не будете делать никаких вычислений с char). – Kayaman

+0

@ Кайман Ну, я не считаю, что char является типом числа (тип поля Character не реализует java.lang.Number в конце концов), хотя он имеет порядковое значение. – qbd

+0

Правда, вы указали «unsigned ** number ** types». Ну, семантика семантики. – Kayaman