Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/48: Рейтинг темы: голосов - 48, средняя оценка - 4.54
4 / 3 / 4
Регистрация: 06.12.2011
Сообщений: 63

Шифратор и дешифратор файлов ассиметричным алгоритмом DSA 512 bits

14.05.2012, 23:19. Показов 9706. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Шифратор и дешифратор файлов ассиметричным алгоритмом DSA 512 bits. На вход программы передается входной файл, ключ, флаг шифрования/дешифрования, выходной файл.

Объясните, как решить эту задачу? dsa - Алгоритм с использованием открытого ключа для создания электронной подписи, но не для шифрования.
Перерыл много книг, ничего не нашёл!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.05.2012, 23:19
Ответы с готовыми решениями:

Шифратор/дешифратор
Код ворованный (из исходника), но я не могу разобрать... unit Unit1; interface uses Windows, Messages, SysUtils, Variants,...

Шифратор Дешифратор
Ребят, нужна очень программа которая будет шифровать и дешифровать информацию, слова например. Метод не важен, можно Цезаря например ...

шифратор/дешифратор
вот у меня шифрация/дешифрация текста происходит так procedure TForm1.Button1Click(Sender: TObject); var m2: string; begin ...

15
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
15.05.2012, 08:46
nicklifs, может быть имеется в виду именно создание и проверка подписи?
0
4 / 3 / 4
Регистрация: 06.12.2011
Сообщений: 63
15.05.2012, 20:07  [ТС]
Цитата Сообщение от fasked Посмотреть сообщение
nicklifs, может быть имеется в виду именно создание и проверка подписи?
Мне нужно написать программу, которая будет шифровать или дешифровать файл в зависимости от одного из параметров командной строки. Я искал алгоритмы, исходные коды, ничего нормального про DSA не нашёл. Понял только одно, что с помощью dsa данные не шифруют, а делают подпись.

Например шифруют с помощью какого-то либо алгоритма(с сгенерированным ключом) данные. А этот сгенерированный ключ шифруют с помощью ключей DSA.

Может есть исходники? Или реализация с помощью RSA?

Добавлено через 6 минут
Можно ли использовать DSA для шифрования/дешифрования файлов?

Перерыл файл dsa.h, функций шифрования не нашёл.
_http://openssl.org/docs/crypto/dsa.html
Или всё таки они есть?

Добавлено через 8 минут
Вот что-то про подписи. Но не понимаю зачем они нужны и как мне их использовать для моей задачи!
_http://forum.sources.ru/index.php?act=Print&client=printer&f=30& t=2344
Может с помощью ключа DSA шифруются данные другим ассиметричным алгоритмом, типа RSA?
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
15.05.2012, 23:53
nicklifs, с помощью DSA нельзя шифровать, так как внутри используется односторонняя функции. Я бы порекомендовал уточнить задание.
1
4 / 3 / 4
Регистрация: 06.12.2011
Сообщений: 63
16.05.2012, 10:49  [ТС]
Цитата Сообщение от fasked Посмотреть сообщение
nicklifs, с помощью DSA нельзя шифровать, так как внутри используется односторонняя функции. Я бы порекомендовал уточнить задание.
Но создавать подписи можно, подпись - это в принципе и есть шифрование. Или я чего то не понимаю?
Для чего тогда подписи, и как с ними работать(в двух словах)?
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
16.05.2012, 16:54
Цитата Сообщение от nicklifs Посмотреть сообщение
Для чего тогда подписи, и как с ними работать(в двух словах)?
ЭЦП позволяют убедиться в том, что отправитель сообщения настоящий, а не подставной + неотказуемость от своих слов В общем почти полная аналогия ручной человеческой подписи.
0
4 / 3 / 4
Регистрация: 06.12.2011
Сообщений: 63
16.05.2012, 17:07  [ТС]
Цитата Сообщение от fasked Посмотреть сообщение
ЭЦП позволяют убедиться в том, что отправитель сообщения настоящий, а не подставной + неотказуемость от своих слов В общем почти полная аналогия ручной человеческой подписи.
а каким образом это происходит? При DSA создаются 2 ассиметричных ключа, что дальше...?
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
16.05.2012, 17:27
Цитата Сообщение от nicklifs Посмотреть сообщение
а каким образом это происходит? При DSA создаются 2 ассиметричных ключа, что дальше...?
Один ключ (закрытый) хранится у владельца подписи, поскольку этот ключ знает только владелец, то никто больше не может создать такую же ЭЦП. Другой ключ (открытый) доступен всем - с его помощью остальные проверяют подлинность подписи.

Как именно этот процесс происходит в алгоритмах DSA я уже не помню. Но для поверхностного ознакомления, я думаю, вполне будет достаточно википедии.
1
4 / 3 / 4
Регистрация: 06.12.2011
Сообщений: 63
16.05.2012, 18:14  [ТС]
При RSA данные шифруются с помощью открытого ключа, а расшифровываются с помощью закрытого???
Каким образом происходит шифрование RSA 512 bits?
Есть кусок кода, не могли бы пояснить?
C
1
2
3
4
5
6
7
8
9
int key_size = RSA_size(pubKey); 
ptext = malloc(key_size); 
ctext = malloc(key_size);
 
inlen = read(inf, ptext, key_size - 11); 
if(inlen <= 0) break; 
outlen = RSA_public_encrypt(inlen, ptext, ctext, pubKey, RSA_PKCS1_PADDING); 
if(outlen != RSA_size(pubKey)) exit(-1); 
write(outf, ctext, outlen);
Почему считываем из файла -11 байт от длины ключа при шифровании данных?

Добавлено через 1 минуту
RSA_PKCS1_PADDING ??
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
16.05.2012, 18:21
Цитата Сообщение от nicklifs Посмотреть сообщение
При RSA данные шифруются с помощью открытого ключа, а расшифровываются с помощью закрытого???
Да, именно так.
Цитата Сообщение от nicklifs Посмотреть сообщение
Почему считываем из файла -11 байт от длины ключа при шифровании данных?
Вообще, если текст будет длиннее, чем ключ, то его невозможно будет потом расшифровать.
Цитата Сообщение от nicklifs Посмотреть сообщение
RSA_PKCS1_PADDING ??
Это видимо OpenSSL, я с ней не особо знаком. Но вообще вряд ли на padding отводят именно 11 байт, во всяком случае звучит это нелепо. Padding это обычно просто наращивание текста до необходимой длины.
0
4 / 3 / 4
Регистрация: 06.12.2011
Сообщений: 63
16.05.2012, 18:55  [ТС]
Да, OpenSSL.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
/* Генерируем ключи */ 
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, "hello"); 
PEM_write_RSAPublicKey(pub_key_file, rsa); 
/* Освобождаем память, выделенную под структуру rsa */ 
RSA_free(rsa);
//секретный ключ шифруется по алгоритму Blowfish с обратной связью по выходу
Можно как по-другому сгенерировать ключи?

Добавлено через 1 минуту
Результаты работы функции RSA_generate_key в виде открытого и закрытого ключа сохраняются в структуре типа RSA (см. include/openssl/rsa.h). Эти ключи необходимо извлечь и записать в файлы для дальнейшей работы с ними. Делается это при помощи следующих двух функций:
int PEM_write_RSAPublicKey(FILE *fp, RSA *x);
int PEM_write_RSAPrivateKey(FILE *fp, RSA *x, const EVP_CIPHER *enc, unsigned char *kstr, int klen, pem_password_cb *cb, void *u);

Добавлено через 6 минут
А в основной программе я их извлекаю
pubKey = PEM_read_RSAPublicKey(pub_key_file, NULL, NULL, NULL);
privKey = PEM_read_RSAPrivateKey(priv_key_file, NULL, NULL, NULL);
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
17.05.2012, 10:11
Цитата Сообщение от fasked Посмотреть сообщение
Но вообще вряд ли на padding отводят именно 11 байт, во всяком случае звучит это нелепо. Padding это обычно просто наращивание текста до необходимой длины.
Как не странно RSA_PKCS1_PADDING_SIZE = 11 Ж) В данном случае используется для противодействия known plaintext attack. В криптографии я как свинья в апельсинах, но помнится была демонстрация успешной атаки для случая RSA_NO_PADDING. Для новых разработок ман рекомендует использовать RSA_PKCS1_OAEP_PADDING
1
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
17.05.2012, 10:20
Так в чем проблема то?

Добавлено через 3 минуты
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
Как не странно RSA_PKCS1_PADDING_SIZE = 11
Какой-то весьма хитрый паддинг
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
помнится была демонстрация успешной атаки для случая RSA_NO_PADDING. Для новых разработок ман рекомендует использовать RSA_PKCS1_OAEP_PADDING
Ну значит надо просто следовать мануалу, они наверняка лучше знают свое дело.
1
4 / 3 / 4
Регистрация: 06.12.2011
Сообщений: 63
17.05.2012, 19:34  [ТС]
Делаю с помощью RSA.
Проблемы с дешифрованием файла.
Создание ключей и запись их в файлы.
C
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
#include <stdio.h>
#include <openssl/dsa.h>
#include <openssl/pem.h>
 
#define PRIVAT "./privat.key"
#define PUBLIC "./public.key"
 
void main(void)
{
    RSA *rsa=NULL;
    unsigned long bits=512;//длина ключп в битах
    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");
    
    PEM_write_RSAPrivateKey(priv_key_file,rsa,cipher,NULL,0,NULL,"pass");
 
    PEM_write_RSAPublicKey(pub_key_file,rsa);
 
    RSA_free(rsa);
}
C
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include <stdio.h> 
#include <string.h>
#include <stdlib.h>
#include <openssl/rsa.h> 
#include <openssl/pem.h>
 
void rsa_e(const char* str1,const char* str2,const char* str4)
{
    printf("Encrypt.\n");
    
    RSA * pubKey = NULL; 
    FILE * pub_f,*in_f,*out_f = NULL; 
    
    in_f = fopen(str1,"rb"); 
    out_f = fopen(str4,"wb"); 
    pub_f = fopen(str2, "rb");
 
    pubKey = PEM_read_RSAPublicKey(pub_f, NULL, NULL, NULL); 
    
    int key_size = RSA_size(pubKey); 
    unsigned char buff1[key_size],buff2[key_size];
    
    int inlen,outlen;
    while(1) 
    {
        inlen = fread( &buff1, 1, key_size - 11, in_f);  
        if(inlen <= 0) break; 
        outlen = RSA_public_encrypt(inlen, buff1, buff2, pubKey, RSA_PKCS1_PADDING); 
        if(outlen != key_size) exit(-1); 
        fwrite(buff2, 1, outlen,out_f); 
    } 
    fclose(in_f);
    fclose(out_f);
    fclose(pub_f);
    RSA_free(pubKey);
    printf("ok.\n");
}
 
void rsa_d(const char* str1,const char* str2,const char* str4)
{
    printf("Decrypt.\n");
 
    RSA *privKey = NULL; 
    FILE *priv_f,*in_f,*out_f; 
        
    in_f = fopen(str1, "rb"); 
    out_f = fopen(str4, "wb"); 
    priv_f = fopen(str2, "rb"); 
 
    privKey = PEM_read_RSAPrivateKey(priv_f, NULL, NULL, "pass"); 
    
    int key_size=64;
    
    unsigned char buff1[key_size],buff2[key_size];
 
    int inlen,outlen;
    while(1) 
    { 
        inlen=fread( &buff1, 1, key_size, in_f); 
printf("3333\n");
        if(inlen <= 0) break; 
        outlen = RSA_public_decrypt(inlen, buff1, buff2, privKey, RSA_PKCS1_PADDING); 
printf("44444\n");
        if(outlen < 0) {printf("Error decrypt.\n"); break;}; 
 
        fwrite(&buff2, 1, outlen, out_f); 
    } 
    fclose(in_f);
    fclose(out_f);
    fclose(priv_f);
    RSA_free(privKey);
    printf("ok.\n");
}
 
int main(int argc, char *argv[]) 
{
    if (argc < 4) 
    {
        printf("Need more arguments.\n");
        return 1;
    }
    
    int oper=argv[3][0]=='e'?0:(argv[3][0]=='d'?1:-1);
    printf("%s %d \n",argv[3],oper);
 
    switch(oper)
    {
        case 0: rsa_e(argv[1],argv[2],argv[4]); break;
        case 1: rsa_d(argv[1],argv[2],argv[4]); break;
        default: printf("Error key.\n");return 2;   
    }
 
    return 0;
}
Ошибка в команде outlen = RSA_public_decrypt(inlen, buff1, buff2, privKey, RSA_PKCS1_PADDING);
Ошибка сегментирования.

Добавлено через 2 минуты
параметры командной строки: исходный файл, файл ключа(privat.key или public.key), флаг операции(e - шифрование, d - дешифрование ), результирующий файл.

Добавлено через 30 минут
RSA_private_decrypt (62 строка исправил)
ничего не изменилось - ошибка сегментирования
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
17.05.2012, 21:56
Добавьте после 50й строки проверку, что ключ загружен, с детальной диагностикой в случае ошибки . Скорее всего нужно, что-то типа OpenSSL_add_all_ciphers() перед этим.
1
4 / 3 / 4
Регистрация: 06.12.2011
Сообщений: 63
17.05.2012, 23:21  [ТС]
Разобрался, нужно было дописать пару строк перед чтением закрытого ключа.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.05.2012, 23:21
Помогаю со студенческими работами здесь

Шифратор и дешифратор
Помогите пожалуйста написать программу, которая зашифровывает файл и расшифровывает, заранее благодарю!

Дешифратор и шифратор
помогите ответить Какая комбинация будет на выходе дешифратора, если на вход подана комбинация: 1) 101 2) 000 3) 111 Какая...

Шифратор-дешифратор
Задача реализовать подстановочный шифр, зашифровать произвольное сообщение, а потом дешифровать его. Проблема в том, что когда я...

Шифратор/дешифратор
Всем привет! Помогите пожалуйста! Описываю задачу: Есть зашифрованный файл. Его текст примерно такой: А Б В ... 0 1 ... 9

Шифратор и дешифратор
Народ, кому не сложно, можете понакидать ссылок на реализацию или какую-нибудь другую инфу на шифраторы и дешифраторы в qt и алгоритм des?...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru