Форум программистов, компьютерный форум CyberForum.ru

ошибка в шифровании - C++

Восстановить пароль Регистрация
 
admsasha
12 / 12 / 4
Регистрация: 11.06.2011
Сообщений: 199
19.06.2011, 08:32     ошибка в шифровании #1
Пытаюсь сделать шифрование через SLL, проблема в том, что если задавать строку для шифрования большую, то строка обрезается (маленькие строки нормально работают). Помогите разобраться что и где я ошибся

Encrypt и Decrypt всяты с доки по openssl
myEncrypt и myDecrypt - это мои функии, в качестве параметра string и выводят string.
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
95
96
97
98
99
100
101
#include <stdio.h>
#include <math.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <openssl/des.h>
#include <unistd.h>
#include <string>
#include <string.h>
 
using namespace std;
 
char * Encrypt( char *Key, char *Msg, int size){
 
        static char*    Res;
        int             n=0;
        DES_cblock      Key2;
        DES_key_schedule schedule;
 
        Res = ( char * ) malloc( size );
 
        /* Prepare the key for use with DES_cfb64_encrypt */
        memcpy( Key2, Key,8);
        DES_set_odd_parity( &Key2 );
        DES_set_key_checked( &Key2, &schedule );
 
        /* Encryption occurs here */
        DES_cfb64_encrypt( ( unsigned char * ) Msg, ( unsigned char * ) Res,
                           size, &schedule, &Key2, &n, DES_ENCRYPT );
 
         return (Res);
}
 
 
char * Decrypt( char *Key, char *Msg, int size){
 
        static char*    Res;
        int             n=0;
 
        DES_cblock      Key2;
        DES_key_schedule schedule;
 
        Res = ( char * ) malloc( size );
 
        /* Prepare the key for use with DES_cfb64_encrypt */
        memcpy( Key2, Key,8);
        DES_set_odd_parity( &Key2 );
        DES_set_key_checked( &Key2, &schedule );
 
        /* Decryption occurs here */
        DES_cfb64_encrypt( ( unsigned char * ) Msg, ( unsigned char * ) Res,
                           size, &schedule, &Key2, &n, DES_DECRYPT );
 
        return (Res);
 
}
 
string myEncrypt( char *Key, string MsgPlain){
    char* text;
 
    text =(char*) malloc(MsgPlain.length()+1);
    strncpy(text, MsgPlain.c_str(),MsgPlain.length());
 
    char* encrypted =  Encrypt(Key,text,strlen(text)+1);
 
    free(text);
 
    return string(encrypted);
 
}
 
 
string myDecrypt( char *Key, string MsgBase64){
    char* text;
 
    text =(char*) malloc(MsgBase64.length()+1);
    strcpy(text, MsgBase64.c_str());
 
    char* decrypted =  Decrypt(Key,text,strlen(text)+1);
    free(text);
    return string(decrypted);
}
 
 
 
int main(){
    string a;
    string b;
    string c;
 
    a="1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890";
    b=myEncrypt("250420",a);
    c=myDecrypt("250420",b);
 
    printf("a = %s\n",a.c_str());
    printf("b = %s\n",b.c_str());
    printf("c = %s\n",c.c_str());
 
    return (0);
}
Вывод
a = 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
b = 'DW#`CLу2#eWP07D.@90.~ZTHb)m9wzAsmW+j5PuoZǩ#_B@
/U kw#?]bמ#+vSɥȓBfgSA
c = 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
19.06.2011, 12:28     ошибка в шифровании #2
Ошибка в использовании функций и конструкций для работы с ASCIIZ-строками, вроде
C++
1
2
3
4
5
return string(encrypted)
//...
strlen(text) // для ШТ по-крайней мере
//...
b.c_str()
В этих строках нулевой байт является признаком конца строки. Проблема в том, что для шифрованного текста (ШТ) нулевой байт может появляться где угодно совершенно легально.
Возможно в качестве контейнера логичнее использовать vector<char>. В принципе и string подойдёт, но для создания из символьного массива тогда надо использовать интервальный конструктор, вроде string(encrypted, encrypted+size)
Ну а выводить ШТ на экран в сыром виде вообще мало смесла. Его можно либо преобразовать в текстовое 16-ричное представление, либо использовать какой-нибудь другой подходящий код (например, base64).

Добавлено через 1 минуту
И в общем случае, нулевой байт может встречаться и в исходном блоке, если зашифровывается нетекстовая информация.
admsasha
12 / 12 / 4
Регистрация: 11.06.2011
Сообщений: 199
19.06.2011, 12:36  [ТС]     ошибка в шифровании #3
grizlik78,
Вот, что получилось после долгих эксперементов, но код всё равно не работает
Зашифрованный текс, я конечно же не буду выводить на экран, это просто для отладки, чтобы знать, что она хотябы отработала)

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
95
96
97
98
99
100
101
102
103
104
105
#include <stdio.h>
#include <unistd.h>
#include <string>
#include <string.h>
#include <stdlib.h>
#include <openssl/des.h>
 
using namespace std;
 
 
char * Encrypt( char *Key, char *Msg, int size){
    static char*    Res;
    int             n=0;
    DES_cblock      Key2;
    DES_key_schedule schedule;
 
    Res = ( char * ) malloc( size );
 
    // Prepare the key for use with DES_cfb64_encrypt
    memcpy( Key2, Key,8);
    DES_set_odd_parity( &Key2 );
    DES_set_key_checked( &Key2, &schedule );
 
    // Encryption occurs here
    DES_cfb64_encrypt( ( unsigned char * ) Msg, ( unsigned char * ) Res, size, &schedule, &Key2, &n, DES_ENCRYPT );
 
     return (Res);
}
 
 
char * Decrypt( char *Key, char *Msg, int size){
    static char*    Res;
    int             n=0;
 
    DES_cblock      Key2;
    DES_key_schedule schedule;
 
    Res = ( char * ) malloc( size );
 
    // Prepare the key for use with DES_cfb64_encrypt
    memcpy( Key2, Key,8);
    DES_set_odd_parity( &Key2 );
    DES_set_key_checked( &Key2, &schedule );
 
    // Decryption occurs here
    DES_cfb64_encrypt( ( unsigned char * ) Msg, ( unsigned char * ) Res, size, &schedule, &Key2, &n, DES_DECRYPT );
 
    return (Res);
 
}
 
string myEncrypt( char *Key, string MsgPlain){
    char* text;
 
    text =(char*) malloc(MsgPlain.length()+1);
    strncpy(text, MsgPlain.c_str(),MsgPlain.length());
    text[MsgPlain.length()]='\0';
 
 
    char* encrypted =  Encrypt(Key,text,MsgPlain.length());
 
    string rez(encrypted, MsgPlain.length());
 
    free(text);
    free(encrypted);
 
    return rez;
}
 
 
string myDecrypt( char *Key, string MsgBase64){
    char* text;
 
    text =(char*) malloc(MsgBase64.length() +1);
    strncpy(text, MsgBase64.c_str(),MsgBase64.length());
    text[MsgBase64.length()]='\0';
 
    char* decrypted =  Decrypt(Key,text,MsgBase64.length());
 
    string rez(decrypted, MsgBase64.length());
 
    free(text);
    free(decrypted);
 
    return rez;
}
 
 
 
int main(){
    string a;
    string b;
    string c;
 
   // должна быть именно большая строка
    a="1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890";
    b=myEncrypt("250420",a);
    c=myDecrypt("250420",b);
 
    printf("a = %s\n",a.c_str());
    printf("b = %s\n",b.c_str());
    printf("c = %s\n",c.c_str());
 
    return (0);
}
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
19.06.2011, 12:56     ошибка в шифровании #4
Ну вот, в строке 75 осталось сразу 2 строковые функции. strncpy (которую можно заменить на memcpy) и .c_str() вместо которой, наверное, нужна .data()

Добавлено через 1 минуту
Кстати, название MsgBase64 как бы намекает Хотя тут никакого base64 нету. Выброшено за ненадобностью?

Добавлено через 6 минут
И вообще, memcpy()+data() можно заменить функцией строки copy(), т.е. вместо
C++
1
strncpy(text, MsgBase64.c_str(),MsgBase64.length());
можно использовать
C++
1
MsgBase64.(text, MsgBase64.length());
admsasha
12 / 12 / 4
Регистрация: 11.06.2011
Сообщений: 199
19.06.2011, 12:58  [ТС]     ошибка в шифровании #5
Цитата Сообщение от grizlik78 Посмотреть сообщение
Ну вот, в строке 75 осталось сразу 2 строковые функции. strncpy (которую можно заменить на memcpy) и .c_str() вместо которой, наверное, нужна .data()

Добавлено через 1 минуту
Кстати, название MsgBase64 как бы намекает Хотя тут никакого base64 нету. Выброшено за ненадобностью?
Ограмадное спасибо ! работает ! Где тут + ставить ?)

А base64 я хочу ввести, но пока разбирался без него, чтобы меньше было цепочек.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
19.06.2011, 13:06     ошибка в шифровании #6

Не по теме:

Ну как где... У сообщений внизу кнопочка специальная...


Ну, это правильно, в общем-то. Задачу надо усложнять постепенно
Yandex
Объявления
19.06.2011, 13:06     ошибка в шифровании
Ответ Создать тему
Опции темы

Текущее время: 03:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru