Я хочу направить несколько строк вывода из файла .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);
}
@Ted Спасибо за ввод, но с вашими предложениями мой код не компилируется, ошибка LNK2001 неразрешенный внешний символ «int __cdecl encrypt (unsigned char const *, int, unsigned char const *, unsigned char const *, unsigned char *)» ( ?шифровать@@YAHPEBEH00PEAE@Z)
Разве это не те функции, которые вы определили сами или скопировали из примера C на домашней странице OpenSSL?
Тед Я не копировал со страницы OpenSSL. Спасибо, вы очень помогли.
Пожалуйста! Сигнатуры функций очень похожи на примеры на вики OpenSSL и, вероятно, имеют ту же проблему (не совсем const
там, где она должна быть), поэтому я думаю, вы можете изменить как объявление, так и определение (если они не определены где-то, где изменить нельзя).
В 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"
Спасибо, Майк, за ответ на MSVS 2019, он дает мне эту ошибку после исправления проблем, которые вы предложили. ошибка C2440: 'static_cast': невозможно преобразовать из '_Elem *' в 'unsigned char *' 1> с 1> [ 1> _Elem=char 1> ]
``` Типы, на которые указывают, не связаны между собой; для преобразования требуется reinterpret_cast, приведение в стиле C или приведение в стиле функции ```
Помимо ошибок, указанных в ответе Майка,
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);