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

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

14.05.2012, 23:19. Показов 9824. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Дальние перспективы сервера - слоя сети.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru