powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Шифрование данных с помощью openSSL
31 сообщений из 31, показаны все 2 страниц
Шифрование данных с помощью openSSL
    #38535603
La France
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

Изучаю библиотеку openSSL. Есть пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
#include <openssl/des.h>
 
int main()
{
    int key, i = 0, j = 0;
    DES_cblock cb;
    DES_key_schedule ks;
    
    /*Создаём ключевой файл*/
    key = open(KEYS, O_CREAT|O_TRUNC|O_RDWR, 0600);
    
    /*Генрируем три ключа*/
    for(; i < 3; i++)
    {
        DES_random_key(&cb);
        if((j = DES_set_key_checked(&cb, &ks)) != 0)
            return j;
        if(write(key, (unsigned char*)&ks, DES_SCHEDULE_SZ) < 0)
            return -1;
    }
    
    return 0;
}


Взят здесь.
В методе open первым параметром передается KEYS - он нигде не определен, о чем и говорит мне среда. Примеры вроде даются на C, я делаю на C++. Если кто-нибудь знает, где определен параметр KEYS, буду рад узнать об этом от вас тоже. С представленной мной ссылки предшествующие этому три примера выполняются отлично на C++, правда при компиляции вместо -lssl необходимо было указать -lcrypto и во втором примере добавить некоторые инклуды.

Спасибо!
...
Рейтинг: 0 / 0
Шифрование данных с помощью openSSL
    #38535656
La France
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все понятно - это тот файл куда запишутся ключи, наверно ключи. Пока еще не понял.
...
Рейтинг: 0 / 0
Шифрование данных с помощью openSSL
    #38535814
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Функция open - создаёт/открывает файл. И у нее первый аргумент - это путь+имя файла.
...
Рейтинг: 0 / 0
Шифрование данных с помощью openSSL
    #38536274
La France
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Теперь вопрос по следующему примеру: в методе
Код: plaintext
1.
DES_ede3_ofb64_encrypt(inbuf, outbuf, (long)inlen, &ks1, &ks2, &ks3, (DES_cblock*)ivec, &num);


параметры ivec и num - не были инициализированы. Как должен быть инициализирован вектор инициализации ivec? Для num мне необходимо написать функцию возвращающую сколько байт последнего блока используется?
...
Рейтинг: 0 / 0
Шифрование данных с помощью openSSL
    #38540665
La France
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

Разобрался с openSSL на linux - все работает. Теперь нужно тоже сделать для windows. Установил все что нужно. Код практически такой же, как и на linux, за исключением чтения и записи файлов, но это не важно, так как это не влияет на появление моей ошибки. В ubuntu для подключения библиотеки к проекту я использовал флаг -lcrypto. На windows необходимо было указать директорию с заголовками, директорию с библиотеками и указать в зависимостях две библиотеки. Я все сделал, но при выполнении кода генерации ключа выдает ошибку:
Список ошибок
Ошибка 10 error LNK1120: 6 неразрешенных внешних элементов *путь\OpenSSLAPPAsymmetric.exe Проект - OpenSSLAPPAsymmetric
Ошибка 8 error LNK2001: неразрешенный внешний символ "_EVP_get_cipherbyname" *путь\Main.obj Проект - OpenSSLAPPAsymmetric
Ошибка 5 error LNK2001: неразрешенный внешний символ "_OpenSSL_add_all_ciphers" *путь\Main.obj Проект - OpenSSLAPPAsymmetric
Ошибка 7 error LNK2001: неразрешенный внешний символ "_PEM_write_RSAPrivateKey" *путь\Main.obj Проект - OpenSSLAPPAsymmetric
Ошибка 9 error LNK2001: неразрешенный внешний символ "_PEM_write_RSAPublicKey" *путь\Main.obj Проект - OpenSSLAPPAsymmetric
Ошибка 6 error LNK2001: неразрешенный внешний символ "_RSA_free" *путь\Main.obj Проект - OpenSSLAPPAsymmetric
Ошибка 4 error LNK2001: неразрешенный внешний символ "_RSA_generate_key" *путь\Main.obj Проект - OpenSSLAPPAsymmetric

Функция генерации ключей
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
void create_keys(char* passphrase)
{
    //Указатель на структуру для хранения ключей
    RSA * rsa = NULL;
    //Длина ключа в битах
    unsigned long bits = 2048;
    FILE *priv_key_file = NULL, *pub_key_file = NULL;
    //контекст алгоритма шифрования
    const EVP_CIPHER *cipher = NULL;
	
    priv_key_file = fopen(PRIVAT, "wb");
    pub_key_file = fopen(PUBLIC, "wb");

    //Генерируем ключи
    rsa = RSA_generate_key(bits, RSA_F4, NULL, NULL);

    //Формируем контекст алгоритма шифрования
    OpenSSL_add_all_ciphers();
    cipher = EVP_get_cipherbyname("bf-ofb");

    //Получаем из структуры rsa открытый и секретный ключи и сохраняем в файлах.
    //Секретный ключ шифруем с помощью парольной фразы "hello"
    PEM_write_RSAPrivateKey(priv_key_file, rsa, cipher, NULL, 0, NULL, passphrase);
    PEM_write_RSAPublicKey(pub_key_file, rsa);

    //Освобождаем память, выделенную под структуру rsa
    RSA_free(rsa);
    //закрываем файлы с ключами
    fclose(priv_key_file);
    fclose(pub_key_file);
}



Повторюсь, что на ubuntu данная функция прекрасно работает.
Если кто-нибудь сталкивался с подобной проблемой буду рад, если поделитесь опытом.

Спасибо!
...
Рейтинг: 0 / 0
Шифрование данных с помощью openSSL
    #38540703
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мы не знаем, какой у тебя компиллятор.
...
Рейтинг: 0 / 0
Шифрование данных с помощью openSSL
    #38540729
La France
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton,

На винде пишу на VS соответственно и компилятор майкрософтовский.
...
Рейтинг: 0 / 0
Шифрование данных с помощью openSSL
    #38540869
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну сделай скрин где ты указал опции линкера.
...
Рейтинг: 0 / 0
Шифрование данных с помощью openSSL
    #38540972
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Шифрование данных с помощью openSSL
    #38541035
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Ошибка 10 error LNK1120: 6 неразрешенных внешних элементов *путь\OpenSSLAPPAsymmetric.exe Проект - OpenSSLAPPAsymmetric
Ошибка 8 error LNK2001: неразрешенный внешний символ "_EVP_get_cipherbyname" *путь\Main.obj Проект - OpenSSLAPPAsymmetric
Ошибка 5 error LNK2001: неразрешенный внешний символ "_OpenSSL_add_all_ciphers" *путь\Main.obj Проект - OpenSSLAPPAsymmetric
Ошибка 7 error LNK2001: неразрешенный внешний символ "_PEM_write_RSAPrivateKey" *путь\Main.obj Проект - OpenSSLAPPAsymmetric
Ошибка 9 error LNK2001: неразрешенный внешний символ "_PEM_write_RSAPublicKey" *путь\Main.obj Проект - OpenSSLAPPAsymmetric
Ошибка 6 error LNK2001: неразрешенный внешний символ "_RSA_free" *путь\Main.obj Проект - OpenSSLAPPAsymmetric
Ошибка 4 error LNK2001: неразрешенный внешний символ "_RSA_generate_key" *путь\Main.obj Проект - OpenSSLAPPAsymmetric

Вот эти все символы _EVP_get_cipherbyname и так далее , должны быть в каких-то библиотеках, и ты их должен указать при сборке.
...
Рейтинг: 0 / 0
Шифрование данных с помощью openSSL
    #38541460
La France
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonНу сделай скрин где ты указал опции линкера.
MasterZivВот эти все символы _EVP_get_cipherbyname и так далее , должны быть в каких-то библиотеках, и ты их должен указать при сборке.
Для установки библиотеки на ubuntu и на windows пользовался этой статьей. На linux все нормально прошло. На windows первые две команды прошли нормально, третья выдала ошибку, поэтому взял здесь установщик - все поставилось без проблем. В корне диска "C" создалась папка с инклудами, библиотеками, и двумя файлами библиотек, которые необходимо указать в зависимостях, ну и много чего еще.
Далее делаю как сказано здесь :
Необходимые действия для подключения библиотеки к проекту
Additional Include Directories: c:/Temp/openssl/include
Additional Library Directories: c:/Temp/openssl/lib
Additional Dependencies: libeay32.lib ssleay32.lib

Скриншоты



К слову, если убрать флаг -lcrypto (с флагом -lssl, как показано в статье у меня не работает на ubuntu) в проекте на ubuntu, то будут такие же ошибки как и на винде сейчас.
...
Рейтинг: 0 / 0
Шифрование данных с помощью openSSL
    #38541855
La France
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все, проблему решил.

Теперь возникает ошибка в строке вышеуказанной функции:
Код: plaintext
1.
2.
3.
    //Получаем из структуры rsa открытый и секретный ключи и сохраняем в файлах.
    //Секретный ключ шифруем с помощью парольной фразы "hello"
    PEM_write_RSAPrivateKey(priv_key_file, rsa, cipher, NULL, 0, NULL, passphrase);


Ошибка:
Код: plaintext
1.
OPENSSL_Uplink(10100000,08): no OPENSSL_Applink


Если кто-нибудь знает её значение прошу поведать мне об этом.

Спасибо!
...
Рейтинг: 0 / 0
Шифрование данных с помощью openSSL
    #38542142
La France
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ошибку исправил. Второй раз уже нашел ответ на китайском форуме)
...
Рейтинг: 0 / 0
Шифрование данных с помощью openSSL
    #38542753
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
La FranceОшибку исправил. Второй раз уже нашел ответ на китайском форуме)
А написать как решили, чтобы следующий не искал на китайском форуме?
...
Рейтинг: 0 / 0
Шифрование данных с помощью openSSL
    #38542759
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Китайцы рулят.
...
Рейтинг: 0 / 0
Шифрование данных с помощью openSSL
    #38543002
La France
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyА написать как решили, чтобы следующий не искал на китайском форуме?

- В первом случае необходимо было поставить библиотеку для 32-х разрядной системы вместо 64-х разрядной (у меня 64-х разрядная система, но тем не менее).
- Во втором случае к проекту нужно было добавить #include <openssl/applink.c>
...
Рейтинг: 0 / 0
Шифрование данных с помощью openSSL
    #38543005
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
La France- Во втором случае к проекту нужно было добавить #include <openssl/applink.c>
А это точно китайцы посоветовали? Больше похоже на индусов.
Рекомендую вам более полно разобраться в этой проблеме, т.к. это решение, может и работает, но точно некорректно.
...
Рейтинг: 0 / 0
Шифрование данных с помощью openSSL
    #38543006
La France
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyА это точно китайцы посоветовали? Больше похоже на индусов.
Рекомендую вам более полно разобраться в этой проблеме, т.к. это решение, может и работает, но точно некорректно.

Тогда уж это индусы маскирующиеся под китайцев.
...
Рейтинг: 0 / 0
Шифрование данных с помощью openSSL
    #38543007
La France
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovsky,

На чём основаны ваши сомнения?
...
Рейтинг: 0 / 0
Шифрование данных с помощью openSSL
    #38543011
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
La FranceНа чём основаны ваши сомнения?
На том, что если вы так сделаете в двух модулях программы, то программа не соберется из-за дубликатов переменных и функций.
...
Рейтинг: 0 / 0
Шифрование данных с помощью openSSL
    #38543018
La France
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovsky,

О каких модулях вы говорите? Если вы имеете ввиду, что на сервере и клиенте у меня будет подобное, вы ошибаетесь. Во-первых сервер и клиент никогда на одной машине стоять не будут. Во-вторых сервер пишу на netbeans и указывать там данный инклюд нет необходимости. Если я вас неправильно понял, поясните, в каком месте у меня возникнет конфликт одноименных функций и полей?
...
Рейтинг: 0 / 0
Шифрование данных с помощью openSSL
    #38543021
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
La France,

Модуль это в данном случае файл исходника с расширением .c
В нетривиальных программах, модуле обычно несколько.
...
Рейтинг: 0 / 0
Шифрование данных с помощью openSSL
    #38543027
La France
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovsky,

Программа, что я пишу вся из плагинов будет состоять, тут вы правы. Но, думаю, данная библиотека только в клиенте будет использоваться, так что проблем не должно возникнуть. Спасибо за предупреждение!
...
Рейтинг: 0 / 0
Шифрование данных с помощью openSSL
    #38543032
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
La France,

Проблема не только в этом, а в том что вы включаете файл реализации, тогда как включать надо файл заголовков этой реализации, а саму реализацию нужно добавить в проект отдельным модулем, который будет откомпилирован и прилинован к вашему приложению.
...
Рейтинг: 0 / 0
Шифрование данных с помощью openSSL
    #38543055
La France
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyLa France,

Проблема не только в этом, а в том что вы включаете файл реализации, тогда как включать надо файл заголовков этой реализации, а саму реализацию нужно добавить в проект отдельным модулем, который будет откомпилирован и прилинован к вашему приложению.
Что вы подразумеваете под файлом реализации и под файлом заголовков этой реализации?
Клиент я сейчас пишу на консоли, для ускорения тестирования. Потом клиент будет в виде одной динамической библиотеки, к классам, полям, функциям которой я буду обращаться из скриптов.
...
Рейтинг: 0 / 0
Шифрование данных с помощью openSSL
    #38543059
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
La FranceЧто вы подразумеваете под файлом реализации и под файлом заголовков этой реализации?
.c - реализация
.h - заголовок
...
Рейтинг: 0 / 0
Шифрование данных с помощью openSSL
    #38543095
La France
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovsky,

С этим в конечном варианте у меня все в порядке будет. Просто я так всегда код пишу, если его потом в большую программу нужно будет впихивать. Проще и быстрей протестировать работоспособность в программе, которая будет использовать только тот код, который я пишу сейчас.
...
Рейтинг: 0 / 0
Шифрование данных с помощью openSSL
    #38543813
La France
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Создание ключей и шифрование происходит успешно(шифрование - наверно успешно, ну шифрованный файл как и на ubuntu чуть больше получается чем оригинал), формат ключей вроде такой же. Дешифрование останавливается на вызове функции:
Код: plaintext
1.
int outlen = RSA_private_decrypt(key_size - 11, ctext, ptext, privKey, RSA_PKCS1_PADDING);


Функция дешифрования
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
void do_decrypt(char* infile, char* outfile, char* passphrase)
{
    RSA *privKey = NULL;
    FILE *priv_key_file;
    unsigned char *ptext, *ctext;
    //Открываем входной и создаем выходной файл
	
	//------------------------------

	//fstream inf_f;
	//inf_f.open(infile, O_RDWR);
	ifstream if_f;
	if_f.open(infile, ifstream::binary);

	//fstream outf_f;
	//outf_f.open(outfile, O_CREAT|O_TRUNC|O_RDWR, 0600);
	ofstream of_f;
	of_f.open(outfile, ofstream::binary);

	//------------------------------

    //int inf = open(infile, O_RDWR);
    //int outf = open(outfile, O_CREAT|O_TRUNC|O_RDWR, 0600);

	//------------------------------

	//Открываем ключевой файл и считываем секретный ключ
    priv_key_file = fopen(PRIVAT, "rb");
    privKey = PEM_read_RSAPrivateKey(priv_key_file, NULL, NULL, passphrase);

	//Определяем размер ключа
    int key_size = RSA_size(privKey);
    ctext = (unsigned char*)malloc(key_size);
    ptext = (unsigned char*)malloc(key_size);

	//Дешифруем файл
    while(1)
    {
		if_f.read((char*)ptext, key_size - 11);
        //int inlen = read(inf, ctext, key_size);
        //if(inlen <= 0)
            //break;
		int length = if_f.tellg();
		cout<<length<<endl;
        if(length <= 0)
		{
			//system("pause");
            break;
		}
		//ОШИБКА!!!
		//int outlen = RSA_private_decrypt(inlen, ctext, ptext, privKey, RSA_PKCS1_PADDING);
        int outlen = RSA_private_decrypt(key_size - 11, ctext, ptext, privKey, RSA_PKCS1_PADDING);
        if(outlen < 0)
		{
			unsigned long err = ERR_get_error();
			cout<<"error: "<<err<<endl;
			system("pause");
                        exit(0);
		}
		
		of_f.write((char*)ctext, outlen);
        //write(outf, ptext, outlen);

    }
    //Закрываем файл с ключом
    fclose(priv_key_file);
	
	if_f.close();
	of_f.close();
}



Функция RSA_private_decrypt(...) возвращает -1, в документации означает ошибку. Первый параметр в этой функции: key_size - 11 - временное принятие мер, ибо нельзя сделать точно так же как на ubuntu.
Функция ERR_get_error() возвращает 67571819. Что это пока не нашел - наверно код ошибки. Если кто-нибудь подскажет, что не так буду рад.

Спасибо!
...
Рейтинг: 0 / 0
Шифрование данных с помощью openSSL
    #38544457
La France
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С помощью кода ошибки и метода ERR_error_string() получил следующее:
Код: plaintext
1.
error:0407106B:lib(4):func(113):reason(107)


Пытаюсь понять смысл. Методы ERR_lib_error_string, ERR_func_error_string и ERR_reason_error_string названия библиотеки, функции и причину не возвращают, как указано в документации .
...
Рейтинг: 0 / 0
Шифрование данных с помощью openSSL
    #38544507
La France
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Очевидно ошибка происходит по причине не правильности первого параметра в методе
Код: plaintext
1.
int outlen = RSA_private_decrypt(key_size - 11, ctext, ptext, privKey, RSA_PKCS1_PADDING);


На ubuntu это вместо key_size - 11 я передавал inlen, который в цикле инициализировался
Код: plaintext
1.
int inlen = read(inf, ctext, key_size);


На винде такого метода нет, поэтому нужно искать другой способ.

И еще, в функции дешифрования, что я указывал, вместо
Код: plaintext
1.
if_f.read((char*)ptext, key_size - 11);


должно быть
Код: plaintext
1.
if_f.read((char*)ctext, key_size);


В торопях не углядел)
...
Рейтинг: 0 / 0
Шифрование данных с помощью openSSL
    #38545340
La France
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все работает так же, как и на ubuntu, но не дешифруется шифрованный файл. Возможно шифрованный файл шифрован неправильно. Пока у меня только одно предположение - на ubuntu используется unsigned char*, на винде приходится преобразовывать unsigned char* в char*. В связи с этим у меня вопрос: искажаются ли данные в буфере при явном преобразовании unsigned char* в char*?
...
Рейтинг: 0 / 0
31 сообщений из 31, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Шифрование данных с помощью openSSL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]