Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
admsasha
19 / 19 / 4
Регистрация: 11.06.2011
Сообщений: 270
#1

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

19.06.2011, 08:32. Просмотров 596. Ответов 5
Метки нет (Все метки)

Пытаюсь сделать шифрование через 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 = 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 1234567890123456789012345678901234567890123456789012345678901234567890
b = 'DW#`CLу2#eWP07D.@90.~ZTHb)m9wzAsmW+j5PuoZǩ#_B@
/U kw#?]bמ#+vSɥȓBfgSA
c = 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 1234567890123456789012345
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.06.2011, 08:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос ошибка в шифровании (C++):

Ошибка при шифровании - C++
Приветствую обитателей сего форума. Недавно сел решать задачку, и вроде бы все получилось, но - выводит-то не те значения. Сама задача...

Работа с файлами при шифровании - C++
Доброго времени суток, всем! Дали задание, реализовать шифрование файла произвольного формата алгоритмом AES, используя CryptoPP. Я...

Генерация ключей в DES шифровании - C++
Читаю о генерации ключей в DES шифровании. &quot;Ключи {\displaystyle k_{i}} k_i получаются из начального ключа {\displaystyle k} k (56 бит =...

RC4 увеличение файла при шифровании - C++
реализую шифрование текстового файла шифром RC4 расшифровка - просто применение алгоритма же к шифрованному тексту. но исходный я не...

ошибка в шифровании - Delphi
procedure TForm_2.Edit1Click(Sender: TObject); var st,st2,n,k,i:integer; j:string; begin for i:=1 to length (st) do k:=...

Ошибка: Operator not applicable to this operand type в шифровании RSA - Delphi
Вот часть кода шифрования RSA, эта часть переводит текст из Memo1 в численный аналог и эти числа шифрует, а потом зашифрованные числа опять...

5
grizlik78
Эксперт С++
1971 / 1464 / 122
Регистрация: 29.05.2011
Сообщений: 3,029
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 минуту
И в общем случае, нулевой байт может встречаться и в исходном блоке, если зашифровывается нетекстовая информация.
0
admsasha
19 / 19 / 4
Регистрация: 11.06.2011
Сообщений: 270
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);
}
0
grizlik78
Эксперт С++
1971 / 1464 / 122
Регистрация: 29.05.2011
Сообщений: 3,029
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());
1
admsasha
19 / 19 / 4
Регистрация: 11.06.2011
Сообщений: 270
19.06.2011, 12:58  [ТС] #5
Цитата Сообщение от grizlik78 Посмотреть сообщение
Ну вот, в строке 75 осталось сразу 2 строковые функции. strncpy (которую можно заменить на memcpy) и .c_str() вместо которой, наверное, нужна .data()

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

А base64 я хочу ввести, но пока разбирался без него, чтобы меньше было цепочек.
0
grizlik78
Эксперт С++
1971 / 1464 / 122
Регистрация: 29.05.2011
Сообщений: 3,029
19.06.2011, 13:06 #6

Не по теме:

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


Ну, это правильно, в общем-то. Задачу надо усложнять постепенно
0
19.06.2011, 13:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.06.2011, 13:06
Привет! Вот еще темы с ответами:

Ошибка "Method call expected" при шифровании RSA - Программирование Android
private final static BigInteger one = new BigInteger(&quot;1&quot;); private final static SecureRandom random = new SecureRandom(); ...

Интересный вопрос о шифровании.. - Pascal
Доброго времени суток. Вот какой вопрос, возможно ли узнать метод шифрования пароля если известны оба состояния пароля(зашифрованный и...

математические алгоритмы при шифровании - Delphi
Кто нибудь, может привести самый простой и понятный Пример &quot;математических алгоритмом при шифровании&quot;. С английским алфавитом и какими...

Кодировка при шифровании кириллицы - PHP
Недавно только перешол на виделеній сервер, ищё ево толком не знаю. Когда шыфрую строку и вывожу её, мне выводит &quot;��:�&quot; опять какиет...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.