Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Надо перевести функцию из Java в PHP, ручной расчет MD5 
V
    Опции темы
evgenyboom
Дата 6.9.2012, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 6.9.2012

Репутация: нет
Всего: нет



Коллеги, в яве не силен, но очень надо перевести не сложную функцию подсчета хэша аля MD5 на язык PHP. Будет время, уделите ...
Код

  public static final String a(String paramString)
  {
    byte[] arrayOfByte = MessageDigest.getInstance("MD5").digest(paramString.getBytes());
    int i = arrayOfByte.length;
    int j = 0;
    String str1 = "";
    while (true)
    {
      if (j >= i)
        return str1;
      String str2 = Integer.toHexString(0xFF & arrayOfByte[j]);
      if (str2.length() == 1)
        str2 = 0 + str2;
      str1 = str1 + str2;
      j++;
    }
  }

Сразу оговорюсь, в php есть функция md5(string) - но результат получается отличный от вышеизложенной функции.
PM MAIL   Вверх
evgenyboom
  Дата 6.9.2012, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 6.9.2012

Репутация: нет
Всего: нет



или наглядно объясните, что означают:
1. (0xFF & arrayOfByte[j]) - это сложение или присоединение? Т.е. в результате получается сумма? Например 255+5=260 или 255+5=2555?
2. (0 + str2) - это что? '0'+'А'='0А' или 0+'А'=0?
неврубаюсь ... числа присоединяются, буквы суммируются)))
PM MAIL   Вверх
dorogoyIV
Дата 7.9.2012, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 3
Всего: 46



0xFF = 255
0xFF & 5 = 5

String s = "sss";
s = 0 + s; // result - "0sss"
PM MAIL   Вверх
LSD
Дата 7.9.2012, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15719
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(evgenyboom @  6.9.2012,  23:32 Найти цитируемый пост)
1. (0xFF & arrayOfByte[j]) - это сложение или присоединение? Т.е. в результате получается сумма? Например 255+5=260 или 255+5=2555?

По факту, это получение из знакового байта, его беззнакового значения.


Цитата(evgenyboom @  6.9.2012,  23:32 Найти цитируемый пост)
 (0 + str2) - это что?

Конкатенация.


Цитата(evgenyboom @  6.9.2012,  22:47 Найти цитируемый пост)
Сразу оговорюсь, в php есть функция md5(string) - но результат получается отличный от вышеизложенной функции.

Скорее всего дело в преобразовании строки в байты. В этом г0внокоде используется paramString.getBytes() который преобразует строку в байты используя умолчальную кодировку системы. Как поступает md5(string) в php я не в курсе, но надо синхронизировать их поведение.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
evgenyboom
Дата 7.9.2012, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 6.9.2012

Репутация: нет
Всего: нет



Спасибо, за разъяснение.
Пытаюсь написать ява скрипт и php скрипт, чтобы сравнивать, что на выходе получается, и опять столкнулся с проблемой. Делаю так:
Код

<body >
<script type="text/javascript">
<!--  
    String paramString = "крякозябра";
    byte[] arrayOfByte = MessageDigest.getInstance("MD5").digest(paramString.getBytes());
    int i = arrayOfByte.length;
    int j = 0;
    String str1 = "";
    while (true)
    {
      if (j >= i)
        document.write(str1);
      String str2 = Integer.toHexString(0xFF & arrayOfByte[j]);
      if (str2.length() == 1)
        str2 = 0 + str2;
      str1 = str1 + str2;
      j++;
    }
  }
  //-->
</script>
</body>

но выходит туча ошибок. Например после первого же String просит точку с запятой. :о( Ява в HTML и ява для программ - разные языки?

Это сообщение отредактировал(а) evgenyboom - 7.9.2012, 22:48
PM MAIL   Вверх
AntonSaburov
Дата 7.9.2012, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 51
Всего: 118



А надо именно перевести или можно в инете погуглить на предмет готового решения на PHP ?
PM MAIL WWW ICQ   Вверх
evgenyboom
Дата 8.9.2012, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 6.9.2012

Репутация: нет
Всего: нет



Надо эмулировать именно этот метод подсчета хэша, чтобы подставлять свои данные и сервак принимал их за "свои". Он сравнивает данные и хэш, если расхождение не принимает. Данные хочу подменить, хэш пересчитать.
PM MAIL   Вверх
evgenyboom
Дата 9.9.2012, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 6.9.2012

Репутация: нет
Всего: нет



LSD, может снова выручишь?
PM MAIL   Вверх
LSD
Дата 10.9.2012, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15719
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(evgenyboom @  9.9.2012,  21:22 Найти цитируемый пост)
LSD, может снова выручишь? 

1. 
Цитата(LSD @  7.9.2012,  13:53 Найти цитируемый пост)
Как поступает md5(string) в php я не в курсе
 Вопрос в том, какая кодировка у строки в PHP.
2. На чем это должно быть реализованно? Ты выбрал раздел Java но пример кода у тебя на JavaScript.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
evgenyboom
Дата 11.9.2012, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 6.9.2012

Репутация: нет
Всего: нет



LSD, 
Цитата(LSD @  10.9.2012,  09:48 Найти цитируемый пост)
выбрал раздел Java но пример кода у тебя на JavaScript

Это из-за того, что я яву не знаю. Зато теперь знаю, что ява и ява скрипт - разные языки.
В общем задача: исходный код на яве, он просчитывает хэш md5 каким-то кривым способом (в первом посте).
Я пишу php скрипт, с автоматической авторизацией и прочим и мне надо этот хэш в php посчитать именно тем же способом, что и в этом, как ты выразился гОвнокоде.
Для того, чтобы можно было сравнивать PHP MD5 и этот, я хотел этот гОвнокод банально вставить как яваскрипт, теперь понятно что это весело.
Значит буду двигаться дальше, запускать на компе ява машину и запускать гОвнокод на ней.
Кодировки я привожу к одной - UTF-8, дело не в кодировках.
PM MAIL   Вверх
LSD
Дата 11.9.2012, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15719
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Я проверил этот код он возвращает корректный MD5 хэш в умолчальной кодировке для JVM.

Теперь о том почему MD5 могут различаться:
1. MD5 можно посчитать только для байтов. Чтобы посчитать его для строки строку надо преобразовать в байты. В Java коде это делается paramString.getBytes(), который конвертирует строку их внутреннего представления Java в байты используя умолчальную кодировку системы (Charset.defaultCharset()). Как получаются эти байты в PHP я не в курсе.
2. Если кодировка UTF-8, то в нее можно кодировать с BOM или без него. Java getBytes() кодирует без BOM.
3. Поведение getBytes() зависит от настроек ОС и JVM и может меняться, а значит и MD5 будет различаться.  Если хочешь воспроизвести поведение функции на локальной машине, надо сделать так чтобы Charset.defaultCharset() совпадало с сервером.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
math64
Дата 12.9.2012, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Если строка уже известна во время выполнения php скрипта - её можно посчитать в php.
Но часто она известна только к моменту выполнения на машине клиента. Обычно для этого используется JavaScript - поэтому программист php должен знать JavaScript.
Вместо JavaScript можно в код страницы вставить апплет - тогда можно использовать код на Java непосредствено. Но у пользователя должно быть разрешено выполнение апплетов в браузере.
PM   Вверх
evgenyboom
Дата 15.9.2012, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 6.9.2012

Репутация: нет
Всего: нет



LSD и остальным соболезнующим, большое спасибо! Установил JBuilder и ... в проблеме разобрался.  smile Эта функция явы и простая функция в php md5 дают абсолютно одинаковые хэши. Проблема оказалась в том, что перед тем, как передать строку в эту функцию, к строке прибавлялся определенный набор символов. А я, нуб, и не заметил сразу smile 

Можно тему закрыть.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0854 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.