Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.04.2014, 21:36   #1
gunsoy
Форумчанин
 
Регистрация: 30.12.2010
Сообщений: 280
Вопрос OpenSSL AES - шифрование

Здравствуйте.

Опять у меня проблемы с шифрованием, с RSA разобрался, а с AES проблемы. Вот есть код

Код:
#include <openssl/evp.h>
#define BUFSIZE 1024

void aes_encrypt()
{
    int outlen, inlen;
    FILE *in = fopen("data.dat", "rb"), *out = fopen("encrypt.aes", "wb");
    unsigned char inbuf[BUFSIZE], outbuf[BUFSIZE];
    unsigned char key[32]; /* 256- битный ключ */
    unsigned char iv[8]; /* вектор инициализации */
    const EVP_CIPHER * cipher;
    EVP_CIPHER_CTX ctx;
    /* обнуляем структуру контекста */
    EVP_CIPHER_CTX_init(&ctx);
    /* выбираем алгоритм шифрования */
    cipher = EVP_bf_ofb();
    /* инициализируем контекст алгоритма */
    EVP_EncryptInit(&ctx, cipher, key, iv);
    /* шифруем данные */
    for(;;)
    {
        inlen = fread(inbuf, 1, BUFSIZE, in);
        if(inlen <= 0) break;
        EVP_EncryptUpdate(&ctx, outbuf, &outlen, inbuf, inlen);
        fwrite(outbuf, 1, outlen, out);
    }
    EVP_EncryptFinal(&ctx, outbuf, &outlen);
    fwrite(outbuf, 1, outlen, out);
    EVP_CIPHER_CTX_cleanup(&ctx);
    fclose(in);
    fclose(out);
}

void aes_decrypt()
{
    int outlen, inlen;
    FILE *in = fopen("encrypt.aes", "rb"), *out = fopen("decrypt.aes", "wb");
    unsigned char inbuf[BUFSIZE], outbuf[BUFSIZE];
    unsigned char key[32]; /* 256- битный ключ */
    unsigned char iv[8]; /* вектор инициализации */
    const EVP_CIPHER * cipher;
    EVP_CIPHER_CTX ctx;
    /* обнуляем структуру контекста */
    EVP_CIPHER_CTX_init(&ctx);
    /* выбираем алгоритм шифрования */
    cipher = EVP_bf_ofb();
    /* инициализируем контекст алгоритма */
    EVP_DecryptInit(&ctx, cipher, key, iv);
    /* шифруем данные */
    for(;;)
    {
        inlen = fread(inbuf, 1, BUFSIZE, in);
        if(inlen <= 0) break;
        EVP_DecryptUpdate(&ctx, outbuf, &outlen, inbuf, inlen);
        fwrite(outbuf, 1, outlen, out);
    }
    EVP_DecryptFinal(&ctx, outbuf, &outlen);
    fwrite(outbuf, 1, outlen, out);
    EVP_CIPHER_CTX_cleanup(&ctx);
    fclose(in);
    fclose(out);
}

int main()
{
    aes_encrypt();
    aes_decrypt();
return 0;
}
В таком виде код работает как нужно, но если я сделаю сперва так

Код:
int main()
{
    aes_encrypt();
    //aes_decrypt();
return 0;
}
А потом так

Код:
int main()
{
    //aes_encrypt();
    aes_decrypt();
return 0;
}
То данные зашифруются, но не расшифруются.

Подскажите кто-нибудь как это исправить?

Спасибо за внимание.
gunsoy вне форума Ответить с цитированием
Старый 11.04.2014, 23:55   #2
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

слабо ориентируюсь в OpenSSL, но по коду не совсем понятно в каком режиме используется AES. если режим не ECB или CTR, то наверно значение iv будет оказывать влияние на результат.
если EVP_EncryptInit просто устанавливает текущее состояние кодера, то где происходит инициализация key и iv?

кстати, разве для AES размер iv должен быть не 16?

Последний раз редактировалось f.hump; 12.04.2014 в 00:14.
f.hump вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
OpenSSL RSA шифрование и кракозябры gunsoy C/C++ Сетевое программирование 0 02.02.2014 14:43
aes 256 cbc - шифрование строки frommars Общие вопросы C/C++ 3 19.10.2012 12:54
Шифрование AES. asmars Общие вопросы C/C++ 3 03.05.2012 16:22
Шифрование AES Samara Помощь студентам 3 29.10.2011 18:10
Шифрование AES SergunchikSK Общие вопросы Delphi 13 25.08.2009 10:36