Ввод адреса файла из текстового файла в функцию шифрования OpenSSL на С++?

Я хочу направить несколько строк вывода из файла .txt в эту функцию encrypt(). Файл .txt содержит адреса файлов, которые я хочу зашифровать. Код компилируется, но шифрование не работает. Я использую EVP_aes_256_cbc() для шифрования. Что я делаю не так?

int encrypt(unsigned char* plaintext, int plaintext_len, unsigned char* key, unsigned char* iv, unsigned char* ciphertext);
int decrypt(unsigned char* ciphertext, int ciphertext_len, unsigned char* key, unsigned char* iv, unsigned char* plaintext);


int main() {
    unsigned char key[16];
    RAND_bytes(key, sizeof(key));

    unsigned char iv[16];
    RAND_bytes(iv, sizeof(iv));

    std::ifstream file("C:\\Users\NULL\source\repos\xFolder\YFolder\\test.txt");
    std::string str;
    while (std::getline(file, str))
    {
        int encrypt(unsigned char* str, int plaintext_len, unsigned char* key,unsigned char* iv, unsigned char* ciphertext);
    } 

Помимо ошибок, указанных в ответе Майка, encrypt и decrypt выглядят неправильно. Исправлено: int encrypt(const unsigned char* plaintext, int plaintext_len, const unsigned char* key, const unsigned char* iv, unsigned char* ciphertext); и int decrypt(const unsigned char* ciphertext, int ciphertext_len, const unsigned char* key, const unsigned char* iv, unsigned char* plaintext);

Ted Lyngmo 26.12.2020 06:20

@Ted Спасибо за ввод, но с вашими предложениями мой код не компилируется, ошибка LNK2001 неразрешенный внешний символ «int __cdecl encrypt (unsigned char const *, int, unsigned char const *, unsigned char const *, unsigned char *)» ( ?шифровать@@YAHPEBEH00PEAE@Z)

Attalus 26.12.2020 08:43

Разве это не те функции, которые вы определили сами или скопировали из примера C на домашней странице OpenSSL?

Ted Lyngmo 26.12.2020 10:57

Тед Я не копировал со страницы OpenSSL. Спасибо, вы очень помогли.

Attalus 26.12.2020 12:53

Пожалуйста! Сигнатуры функций очень похожи на примеры на вики OpenSSL и, вероятно, имеют ту же проблему (не совсем const там, где она должна быть), поэтому я думаю, вы можете изменить как объявление, так и определение (если они не определены где-то, где изменить нельзя).

Ted Lyngmo 26.12.2020 13:29
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
108
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В C++ \ используется в управляющих последовательностях, поэтому вам нужно написать \\, чтобы выразить \ в строковых литералах.

На самом деле вы сделали это для первого и последнего \, но вы должны сделать это для остальных \.

    std::ifstream file("C:\\Users\NULL\source\repos\xFolder\YFolder\\test.txt");

должно быть

    std::ifstream file("C:\\Users\\NULL\\source\\repos\\xFolder\\YFolder\\test.txt");

Также в этом цикле

    while (std::getline(file, str))
    {
        int encrypt(unsigned char* str, int plaintext_len, unsigned char* key,unsigned char* iv, unsigned char* ciphertext);
    } 

Вы не вызывали функцию, а вместо этого только объявили это.

Вы должны вызвать функцию для шифрования. Это может быть так:

    while (std::getline(file, str))
    {
        std::vector<unsigned char> encrypted_str(str.size()); // you may need some more bytes
        encrypt(reinterpret_cast<unsigned char*>(str.data()), str.size(), key, iv, &encrypted_str[0]);
    } 

Альтернативы: R"aw(C:\Users\NULL\source\repos\xFolder\YFolder\test.txt)aw" или "C:/Users/NULL/source/repos/xFolder/YFolder/test.txt"

Ted Lyngmo 26.12.2020 05:40

Спасибо, Майк, за ответ на MSVS 2019, он дает мне эту ошибку после исправления проблем, которые вы предложили. ошибка C2440: 'static_cast': невозможно преобразовать из '_Elem *' в 'unsigned char *' 1> с 1> [ 1> _Elem=char 1> ]

Attalus 26.12.2020 05:48

``` Типы, на которые указывают, не связаны между собой; для преобразования требуется reinterpret_cast, приведение в стиле C или приведение в стиле функции ```

Attalus 26.12.2020 05:52

Другие вопросы по теме