QT C ++ - OpenSSL AES - EVP.h - PullRequest
       8

QT C ++ - OpenSSL AES - EVP.h

0 голосов
/ 31 августа 2011

Я пытался использовать OpenSSL с QT в последние несколько дней, но документация и примеры редки или отсутствуют.

В любом случае, я придумываю этот код:

void qkCrypto::AES_CBC(const unsigned char *string, const unsigned char *key, const unsigned char *iv)
{

    int outlen;
    unsigned char *out;

    EVP_CIPHER_CTX ctx;
    EVP_CIPHER_CTX_init(&ctx);
    const EVP_CIPHER *cipher = EVP_aes_128_cbc();

    EVP_EncryptInit(&ctx,cipher,key,iv);
    EVP_EncryptUpdate(&ctx,out,&outlen,string,strlen(string));

    EVP_EncryptFinal(&ctx,out,&outlen);

    EVP_CIPHER_CTX_cleanup(&ctx);

    qDebug() << out;

}

Но когда я его компилирую, я получаю некоторые ошибки ... это ошибки преобразования и приведения, и, поскольку я не лучший программист на C ++, я был бы очень признателен за помощь в их решении:

[...]/qkcrypto.cpp: In member function 'void qkCrypto::AES_CBC(const unsigned char*, const unsigned char*, const unsigned char*)':
[...]/qkcrypto.cpp:39: error: invalid conversion from 'const unsigned char*' to 'const char*'
[...]/qkcrypto.cpp:39: error: initializing argument 1 of 'size_t strlen(const char*)'

В любом случае, как я могу сделать это более дружественным к QT преобразованием символов в QByteArrays?

С наилучшими пожеланиями, спасибо всем;)


Обновление кода

I"возился", и я пытаюсь сделать это без всякой удачи:

void qkCrypto::AES_CBC(QByteArray string, QByteArray key, QByteArray iv)
{

    int outlen;
    QByteArray out;

    EVP_CIPHER_CTX ctx;
    EVP_CIPHER_CTX_init(&ctx);
    const EVP_CIPHER *cipher = EVP_aes_128_cbc();

    EVP_EncryptInit(&ctx,cipher, key.constData() , iv.constData() );
    EVP_EncryptUpdate(&ctx, out.constData() ,&outlen, string.constData() ,strlen((const char*)string));

    EVP_EncryptFinal(&ctx, out.constData() ,&outlen);

    EVP_CIPHER_CTX_cleanup(&ctx);

    qDebug() << "OUT: "<< out;


}

Я получил много ошибок относительно конверсий:

[...]/qkcrypto.cpp: In member function 'void qkCrypto::AES_CBC(QByteArray, QByteArray, QByteArray)':
[...]/qkcrypto.cpp:38: error: invalid conversion from 'const char*' to 'const unsigned char*'
[...]/qkcrypto.cpp:38: error:   initializing argument 3 of 'int EVP_EncryptInit(EVP_CIPHER_CTX*, const EVP_CIPHER*, const unsigned char*, const unsigned char*)'
[...]/qkcrypto.cpp:38: error: invalid conversion from 'const char*' to 'const unsigned char*'
[...]/qkcrypto.cpp:38: error:   initializing argument 4 of 'int EVP_EncryptInit(EVP_CIPHER_CTX*, const EVP_CIPHER*, const unsigned char*, const unsigned char*)'
[...]/qkcrypto.cpp:39: error: invalid conversion from 'const char*' to 'unsigned char*'
[...]/qkcrypto.cpp:39: error:   initializing argument 2 of 'int EVP_EncryptUpdate(EVP_CIPHER_CTX*, unsigned char*, int*, const unsigned char*, int)'
[...]/qkcrypto.cpp:39: error: invalid conversion from 'const char*' to 'const unsigned char*'
[...]/qkcrypto.cpp:39: error:   initializing argument 4 of 'int EVP_EncryptUpdate(EVP_CIPHER_CTX*, unsigned char*, int*, const unsigned char*, int)'
[...]/qkcrypto.cpp:41: error: invalid conversion from 'const char*' to 'unsigned char*'
[...]/qkcrypto.cpp:41: error:   initializing argument 2 of 'int EVP_EncryptFinal(EVP_CIPHER_CTX*, unsigned char*, int*)'

Спасибо.

Ответы [ 3 ]

1 голос
/ 31 августа 2011

Кажется, что strlen требует константного указателя на char со знаком. Так что вам нужно разыграть это. Либо с использованием простых C-бросков ((const char*)), static_cast<const char*> или reinterpret_cast<const char*>. Все должно идти хорошо.


В любом случае, как я могу сделать это более дружественным к QT, конвертируя символы в QByteArrays?

Глядя на документацию , самое простое решение будет выглядеть примерно так:

QByteArray arr((const char*)string);
1 голос
/ 31 августа 2011

Ну, как говорится в ошибке, вы пытаетесь конвертировать между указателями в char и unsigned char, что недопустимо. Вы должны добавить явное приведение, например

EVP_EncryptUpdate(&ctx, out, &outlen, string, strlen((const char*)string));
                                                     ^^^^^^^^^^^^^
0 голосов
/ 03 сентября 2011

У меня новый код, теперь почти идеальный.

QByteArray qkCrypto::encrypt_AES_CBC(QByteArray string, QByteArray key, QByteArray ivv)
{

    char mykey[EVP_MAX_KEY_LENGTH] = { 0 };
    strcpy(mykey,key.constData());

    char iv[EVP_MAX_IV_LENGTH] = { 0 };
    strcpy(iv,ivv.constData());

    char ciphertext[1024];

    const EVP_CIPHER *cipher = EVP_aes_256_cbc();
    int in_len;
    int out_len=0;

    in_len = (string.length());

    qDebug() << "Before encrypt: " << string << "\r\n";

         EVP_EncryptInit(&ctx, cipher, (const unsigned char*)mykey, (const unsigned char*)iv);
         EVP_EncryptUpdate(&ctx, ( unsigned char*)ciphertext, &out_len, (const unsigned char*)string.data(), in_len);
         EVP_EncryptFinal(&ctx, ( unsigned char*)&ciphertext[out_len], &out_len);
    EVP_CIPHER_CTX_cleanup(&ctx);
    qDebug() << "Encrypted: " << ciphertext << "\r\n";

    return ciphertext;

}

По какой-то причине выходные данные являются правильными только несколько раз ... в других случаях выходные данные неверны, и я не могу расшифровать его позже с помощью OpenSSL.

Что в этом плохого? : S

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...