Понимание инициализации механизма в OpenSSL

Вы можете просто создать экземпляр класса своей базы данных в своей деятельности

OpenHelper mOpenHelper = new OpenHelper(this);

И создать метод в своем классе db для создания ваших таблиц

public void createTable(String nomelistafinal ) {
    final SQLiteDatabase db = getWritableDatabase();
    db.execSQL("CREATE TABLE " + nomelistafinal + " (codigo text not null) ");
    db.close();
}
11
задан Fylke 28 October 2008 в 14:04
поделиться

3 ответа

Проблема с Вашим исходным предложением, поскольку Martin сказал, что необходимо инициализировать МЕХАНИЗМ. Проблема с Вашим отредактированным кодом состояла в том, что Вы делали ENGINE_new, который получает Вас абсолютно новый собственный МЕХАНИЗМ, которому затем необходимо предоставить методы шифрования, методы создания дайджеста, и т.д. На самом деле, поскольку, что Вы хотите (и что почти все хотят), просто полностью игнорируя весь материал МЕХАНИЗМА правильный выбор.

Некоторые вспомогательные проблемы:

  • Ваши строки были шестнадцатеричным числом, но Вам был нужен \x на символ для фактического получения того шестнадцатеричного байта в том положении в строке, которую я подозреваю, был тем, что Вы хотели.
  • Вы пытались хешировать 40 байтов от "данных", которые не были что долго (фактический эффект: Вы закончили бы тем частично, что хешировали свою строку результата),
  • Ваш ожидаемый результат был (насколько я могу сказать), неправильный
  • Вы распечатали бы случайные символы к терминалу, так как функция HMAC произведет 32 байта случайных двоичных данных, не печатаемый материал.

Следующие компиляции кода, работы и проходят тест. Это несколько отличается от примера кода, который Вы нашли (так как это все еще использует отдельные функции HMAC_* - полезный, если Вы хотите сделать свое хеширование поразрядно с помощью HMAC_Update):

#include <openssl/engine.h>
#include <openssl/hmac.h>
#include <openssl/evp.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>


int main(void)
{
        unsigned char* key = (unsigned char*) "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b";
        unsigned char* data = (unsigned char*) "\x48\x69\x20\x54\x68\x65\x72\x65";
        unsigned char* expected = (unsigned char*) "\x49\x2c\xe0\x20\xfe\x25\x34\xa5\x78\x9d\xc3\x84\x88\x06\xc7\x8f\x4f\x67\x11\x39\x7f\x08\xe7\xe7\xa1\x2c\xa5\xa4\x48\x3c\x8a\xa6";
        unsigned char* result;
        unsigned int result_len = 32;
        int i;
        HMAC_CTX ctx;

        result = (unsigned char*) malloc(sizeof(char) * result_len);

        ENGINE_load_builtin_engines();
        ENGINE_register_all_complete();

        HMAC_CTX_init(&ctx);
        HMAC_Init_ex(&ctx, key, 16, EVP_sha256(), NULL);
        HMAC_Update(&ctx, data, 8);
        HMAC_Final(&ctx, result, &result_len);
        HMAC_CTX_cleanup(&ctx);

        for (i=0; i!=result_len; i++)
        {
                if (expected[i]!=result[i])
                {
                        printf("Got %02X instead of %02X at byte %d!\n", result[i], expected[i], i);
                        break;
                }
        }
        if (i==result_len)
        {
                printf("Test ok!\n");
        }
        return 0;
}

Конечно, это не отвечает на Ваш исходный вопрос о том, как инициализировать МЕХАНИЗМЫ, но нет действительно никакого правильного ответа на это, не имея большего количества контекста, какой контекст, оказывается, не релевантен в Вашей ситуации...

14
ответ дан 3 December 2019 в 08:06
поделиться

Выглядит, как будто ничто не выделяет механизм, таким образом, первое использование e segfaulting. Я думаю, что необходимо звонить ENGINE *ENGINE_new(void) сначала.

(Обратите внимание, что я использовал OpenSSL, но я не использовал ENGINE функции прежде.)

Обновление: я не действительно доволен своим собственным ответом (я должен был унестись к чаю, прежде). Таким образом, мои дальнейшие примечания:

  1. У меня было что-то вроде взгляда на (длинную) страницу справочника для ENGINE функции, и я не совсем уверен тот вызов ENGINE_new достаточно.

  2. Я не заметил что вызовы к HMAC_CTX_* функции брали неинициализированный указатель, а не указатель на выделенную структуру. HMAC_CTX_init попытается записать в память, на которую указывает ctx параметр, который будет segfault. Необходимо объявить и использовать ctx как это:

    HMAC_CTX ctx;
    HMAC_CTX_init(&ctx);
    HMAC_Init_ex(&ctx, key, 40, EVP_sha256(), e);
    ...
    

    Тем путем Вы выделяете структуру на стеке и затем передаете указатель на него.

  3. HMAC функция не берет указатель на a CTX вообще, таким образом, кроме глобальной или локальной памяти потока, я не уверен, что это - соединение с CTX . Я думаю, что можно обойти это путем вызова HMAC_Update один или несколько раз, сопровождаемый HMAC_Final получить результат. Необходимо было бы выделить место для того результата, таким образом, что-то как следующее будет работать на это:

    unsigned int len;
    HMAC_Final(&ctx, result, &len);
    
0
ответ дан 3 December 2019 в 08:06
поделиться

Хорошо, оказывается, что Вы не должны использовать механизм, но я неправильно понял точно, как не использовать явный механизм. Я также неправильно понял, как правильно отформатировать тестовые векторы. В конце я посмотрел на hmactest.c, который в значительной степени делает все, что я хочу сделать, я просто не понял код.

Конечное решение того, что я пытался сделать, похоже на это:

int main() {
  unsigned char* key = (unsigned char*) "Jefe";
  unsigned char* data = (unsigned char*) "what do ya want for nothing?";
  unsigned char* expected = (unsigned char*) "5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843";
  unsigned char* result;
  unsigned int result_len = 32;
  int i;
  static char res_hexstring[32];

  result = HMAC(EVP_sha256(), key, 4, data, 28, NULL, NULL);
  for (i = 0; i < result_len; i++) {
    sprintf(&(res_hexstring[i * 2]), "%02x", result[i]);
  }

  if (strcmp((char*) res_hexstring, (char*) expected) == 0) {
    printf("Test ok, result length %d\n", result_len);
  } else {
    printf("Got %s instead of %s\n", res_hexstring, expected);
  }
}

Но так как я спрашивал о чем-то совершенно различном, я не уверен в том, что сделать с исходным вопросом. Предложения?

1
ответ дан 3 December 2019 в 08:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: