powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Шифрование данных с помощью openSSL
6 сообщений из 31, страница 2 из 2
Шифрование данных с помощью 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
6 сообщений из 31, страница 2 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Шифрование данных с помощью openSSL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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