2017-01-12 8 views
-1

Я хотел бы хэш простой строки, используя MD5 в Xcode C++. Я много искал, но не смог найти учебник. Я должен #import <CommonCrypto/CommonDigest.h>. Это все? Как я могу вызвать MD5 после этого? Я нашел этот код, но он дает мне ошибку. Как я могу получить хешированное значение, оно обновляется в строковой переменной?Xcode C++ MD5 hash

unsigned char digest[16]; 
const char* string = "Hello World"; 
struct MD5Context context;  **(error: variable has incomplete type 
MD5Init(&context); 
MD5Update(&context, string, strlen(string)); 
MD5Final(digest, &context); 

Я просто использую простое приложение командной строки без заголовков внутри основного файла main.cpp. Я очень ценю любую помощь !!!!

+0

'# include', вероятно, сделает вас компилятором C++ более счастливым, так как будет использовать правильные имена и типы функций. Материал CC начинается с CC_. – WhozCraig

+0

А я благодарю вас за то, что кто-то был в obj C мне плохо. – Tom

+0

Спасибо, что я нашел это руководство и обновлен, как вы предложили. Но я все еще получаю ошибку для переменной. Нужно ли включать дополнительные библиотеки? https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man3/CC_MD5.3cc.html#//apple_ref/doc/man/3cc/CC_MD5 – Tom

ответ

1

Вы используете неправильный API. Я не уверен, где вы получаете те из (они похожи на OpenSSL звонки), но он должен выглядеть следующим образом:

#include <stdio.h> 
#include <string.h> 

#include <CommonCrypto/CommonDigest.h> 

int main() 
{ 
    unsigned char digest[CC_MD5_DIGEST_LENGTH]; 
    const char string[] = "Hello World"; 

    CC_MD5_CTX context; 
    CC_MD5_Init(&context); 
    CC_MD5_Update(&context, string, (CC_LONG)strlen(string)); 
    CC_MD5_Final(digest, &context); 

    for (size_t i=0; i<CC_MD5_DIGEST_LENGTH; ++i) 
     printf("%.2x", digest[i]); 
    fputc('\n', stdout); 
    return 0; 
} 

Выход

b10a8db164e0754105b7a99be72e3fe5 

Подтверждено here.

1

Существует версия одноразовой:

#include <CommonCrypto/CommonDigest.h> 

unsigned char digest[16]; 
const char* string = "Hello World"; 

CC_MD5(string, (CC_LONG)strlen(string), digest); 

Вам нужно будет включать Security.framework (или в аренде применимого файл библиотеки).

+0

Благодарим вас за ответ! Я также попробовал ваше решение, но оно выдает сообщение об ошибке: «Неявное преобразование теряет целую точность unsigned long, в unsigned int. И оно указывает на strlen (string) в последней строке. Если я добавляю (CC_LONG) strlen (string), он исправляет ошибка Но если я пытаюсь напечатать переварить это дает мне некоторые сумасшедшие вещи, как:. \ 261 \ 215 \ 261d \ ...... Я включил эти: #include #include #include #include . – Tom

+0

Правильно, требуется некоторое исправление. MD5 возвращает данные, и большинство значений данных не являются ASCII, если вам нужен ASCII-вывод, который кодируется как шестнадцатеричный или Base64. – zaph

+0

Да, мне нужен Hex. Как можно напрямую передать MD5 fn для вывода hex для меня, как вы предлагаете? Обычно я просто пытаюсь преобразовать вывод но я не знаю, из чего я перехожу. Спасибо за помощь! – Tom