2012-06-28 6 views
1

У меня есть проблема кросс-языка относительно md5 :). У меня есть этот код в Java:md5 base64 encoder в C++ vs Java

BASE64Encoder encoder = new BASE64Encoder(); 
MessageDigest md = MessageDigest.getInstance("MD5"); 
md.update(someString.getBytes()); 
byte[] bMac = md.digest(); 
String anotherString = encoder.encodeBuffer(bMac); 

Это кодирует и хэш строки в md5 и base64. Строка типа «aaa & 1» становится Fv4eRn4R0/mB + uc4j1GGaA ==

Теперь проблема заключается в следующем: как это сделать на C++? Я использую OpenSSL/md5.h, но, как и любой другой интернет-кодер md5 (после небольшого поиска Google), он получает хэш, как: 16fe1e467e11d3f981fae7388f518668

который находится в шестнадцатеричном это кажется. Если я попытаюсь преобразовать хеш md5 в base64, я получаю совершенно другой хеш (длиннее и уродливее :)).

Помощь !!!

Спасибо!

L.E .: Я использую MD5-метод от openssl/md5.h, как указывал AZI.

+0

Пожалуйста, покажите нам соответствующие части кода C++, которые вы используете. – yms

+2

Я предполагаю, что если функция дает шестнадцатеричную строку, вам придется преобразовать ее в последовательность байтов '{0x16,0xfe, 0x1e, ..., 0x68}', а затем base-64 закодировать это , Однако я недостаточно хорошо разбираюсь в библиотеке, чтобы дать правильный ответ. –

+0

'someString.getBytes()' использует стандартную кодировку OS/language; если бы C++ тоже этого не делал, было бы лучше явно указать кодировку: 'someString.getBytes (« UTF-8 »)' или '" Windows-1252 "'. _К сожалению, маловероятно, что ваш код должен работать на нескольких компьютерах. Для C++ выполните поиск «Base64Encode». –

ответ

3

Здесь C++ код, чтобы получить MD5

#include <openssl/md5.h> 
unsigned char *MD5(const unsigned char *d, 
       unsigned long n, 
       unsigned char *md); 

пример:

unsigned char inbuf[] = "aaa&1"; 
unsigned char outbuf[20]; 
MD5(inbuf, strlen(inbuf), outbuf); 

for (i = 0; i < 20; i++) { 
    printf("%02x ", outbuf[i]); 
} 

если Сглаз 16fe1e467e11d3f981fae7388f518668 преобразуется в Base64 тогда Hex to Base64 вы получите Fv4eRn4R0/mB+uc4j1GGaA==

может относиться к Howto base64 encode with C/C++ and OpenSSL к закодируйте это на Base64

+0

Это именно тот метод, который я использую для получения md5. Но как мне преобразовать из формата md5 в base64 в C++ (точно так же, как в ссылке, которую вы дали)? –

+0

См. Обновленный ответ. – Azi

0

Решение состоит в том, чтобы использовать все, что сказал Ази и Майк Сеймур ... Итак, чтобы получить хэш MD5, вы должны использовать решение, представленное Azi. Тогда вещь в Java использует что-то вроде Майка ... он кодирует base64 из двоичного кода.

Мое решение было посмотреть на код по ссылке, предоставленной азимуте:

http://tomeko.net/online_tools/hex_to_base64.php?lang=en

И портировать его в C++. К счастью, это было не так уж сложно ... Если кому-то нужен код на C++, оставьте комментарий. Спасибо всем!

Смежные вопросы