Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Реализация sha1 и Base64 на СИ  (Прочитано 3843 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн xmarat

  • Автор темы
  • Участник
  • *
  • Сообщений: 101
    • Просмотр профиля
Реализация sha1 и Base64 на СИ
« : 04 Февраль 2012, 01:56:17 »
В общем пробую сделать web-socket сервер на C. Однако возник вопрос: как релизовать две функции, которые выдавали хеш строки по алгоритму sha1 и Base64. В инетернете есть библиотеки, однако не очень хочется подключать внешние библиотеки только из-за двух функций. Может кто то уже реализовывал их... Заранее благодарен.

Оффлайн hippi90

  • Активист
  • *
  • Сообщений: 433
    • Просмотр профиля
Re: Реализация sha1 и Base64 на СИ
« Ответ #1 : 04 Февраль 2012, 03:32:52 »
openssl, и не парьте себе мозги.

andrey_p

  • Гость
Re: Реализация sha1 и Base64 на СИ
« Ответ #2 : 04 Февраль 2012, 03:48:47 »
Кто-то уже явно реализовывал...  :)
http://polarssl.org/source_code
Each cipher and hashing algorithm in PolarSSL (AES, MD5, SHA-1, etc.) is self-contained and can be easily reused as a standalone module.

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Реализация sha1 и Base64 на СИ
« Ответ #3 : 04 Февраль 2012, 08:17:24 »
Не помню где я читал, не помню кто проводил исследования, но факт таков:
base64 и md5 самые популярные велосипеды которые все пихают свои исходники а не пользуются фенциями из openssl или crypt например
утянет чтоли зависимость от библиотеки которая есть вообще на всех дистрибутивах в обязательном порядке?
вы еще от libc откажитесь

Оффлайн xmarat

  • Автор темы
  • Участник
  • *
  • Сообщений: 101
    • Просмотр профиля
Re: Реализация sha1 и Base64 на СИ
« Ответ #4 : 04 Февраль 2012, 19:32:17 »
sha1 реализовал с помошью openssl, а base64 в openssl нет?

Оффлайн hippi90

  • Активист
  • *
  • Сообщений: 433
    • Просмотр профиля
Re: Реализация sha1 и Base64 на СИ
« Ответ #5 : 04 Февраль 2012, 20:28:36 »
sha1 реализовал с помошью openssl, а base64 в openssl нет?
Есть, вот пример из официальной документации http://www.openssl.org/docs/crypto/BIO_f_base64.html#

Оффлайн xmarat

  • Автор темы
  • Участник
  • *
  • Сообщений: 101
    • Просмотр профиля
Re: Реализация sha1 и Base64 на СИ
« Ответ #6 : 04 Февраль 2012, 20:54:24 »
А как можно преобразовать BIO в char?

Оффлайн hippi90

  • Активист
  • *
  • Сообщений: 433
    • Просмотр профиля
Re: Реализация sha1 и Base64 на СИ
« Ответ #7 : 04 Февраль 2012, 21:03:24 »
А как можно преобразовать BIO в char?
Первая ссылка в выдаче гугла http://www.ioncannon.net/programming/34/howto-base64-encode-with-cc-and-openssl/

Оффлайн xmarat

  • Автор темы
  • Участник
  • *
  • Сообщений: 101
    • Просмотр профиля
Re: Реализация sha1 и Base64 на СИ
« Ответ #8 : 05 Февраль 2012, 20:57:36 »
Возникла проблема, делаю так:
...
cout << ibuf3 << endl; //выводит нормально
unsigned char *ibuf = (unsigned char*)ibuf3.c_str();
unsigned char obuf[20];
cout << ibuf << endl; //выводит нормально
SHA1(ibuf, sizeof(ibuf), obuf);
cout << obuf << endl; //выводит иероглифы
...

В итоге третья строка состоит из иероглифов, что я не так сделал?

Оффлайн hippi90

  • Активист
  • *
  • Сообщений: 433
    • Просмотр профиля
Re: Реализация sha1 и Base64 на СИ
« Ответ #9 : 05 Февраль 2012, 21:16:19 »
Потому, что obuf не строка, а массив байт.

Оффлайн xmarat

  • Автор темы
  • Участник
  • *
  • Сообщений: 101
    • Просмотр профиля
Re: Реализация sha1 и Base64 на СИ
« Ответ #10 : 05 Февраль 2012, 23:29:21 »
решил попробовать подставить значение из википедии http://ru.wikipedia.org/wiki/WebSocket#.D0.9F.D1.80.D0.BE.D1.82.D0.BE.D0.BA.D0.BE.D0.BB_07

но результат совсем другой, решил попробовать подставить эти же значения в онлайн энкодеры sha1 и Base64 и опять же получается не то что в википедии, кто занчет в чем подвох?

Оффлайн hippi90

  • Активист
  • *
  • Сообщений: 433
    • Просмотр профиля
Re: Реализация sha1 и Base64 на СИ
« Ответ #11 : 06 Февраль 2012, 00:59:36 »
Потому, что ibuf - указатель, соответственно sizeof(ibuf) == размерности указателя, а длина строки возвращается функцией strlen().
SHA1(ibuf, strlen(ibuf), obuf);

Оффлайн xmarat

  • Автор темы
  • Участник
  • *
  • Сообщений: 101
    • Просмотр профиля
Re: Реализация sha1 и Base64 на СИ
« Ответ #12 : 06 Февраль 2012, 09:45:35 »
hippi90 спасибо что поправил. Однако дело не в этом. В википедии(и в RFC тоже) сказано:
1. взять строковое значение из заголовка Sec-WebSocket-Key и объединить со строкой 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 (в приведённом примере получится dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11)
2. вычислить хеш SHA-1 от полученой строки (получится 0xb3 0x7a 0x4f 0x2c 0xc0 0x62 0x4f 0x16 0x90 0xf6 0x46 0x06 0xcf 0x38 0x59 0x45 0xb2 0xbe 0xc4 0xea)
3. закодировать хеш в Base64 (s3pPLMBiTxaQ9kYGzzhZRbK+xOo=)

Т.к. в коде программы может быть что то не правильным, я решил проделать это с разными онлайн енкодерами(например http://www.sha1.cz/)

dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11 перевел в SHA1 - получил b37a4f2cc0624f1690f64606cf385945b2bec4ea

b37a4f2cc0624f1690f64606cf385945b2bec4ea перевел в Base64 - получил YjM3YTRmMmNjMDYyNGYxNjkwZjY0NjA2Y2YzODU5NDViMmJlYzRlYQ==

но это ни как не похоже на s3pPLMBiTxaQ9kYGzzhZRbK+xOo= в примере

Пользователь решил продолжить мысль 06 Февраль 2012, 15:14:28:
Выяснил что нужно эту строку упаковать в бинарную... В PHP это делается так
$key = pack('H*', $key);

Только вот как такое сделать в C/C++?
« Последнее редактирование: 06 Февраль 2012, 15:14:28 от xmarat »

Оффлайн xmarat

  • Автор темы
  • Участник
  • *
  • Сообщений: 101
    • Просмотр профиля
Re: Реализация sha1 и Base64 на СИ
« Ответ #13 : 07 Февраль 2012, 23:32:15 »
Разобрался. В общем ничего переводить не нужно было, строка и так в бинарном виде, сделал так:
SHA1(ibuf, strlen((const char*)ibuf), obuf);и все заработало. Всем спасибо за ответы!!!

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: Реализация sha1 и Base64 на СИ
« Ответ #14 : 09 Февраль 2012, 15:58:18 »
А что б код не скопипастить?
В FFmpeg тоже есть.
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

 

Страница сгенерирована за 0.128 секунд. Запросов: 25.