Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проблемы с шифрованием 
:(
    Опции темы
admsasha
Дата 18.6.2011, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: нет
Всего: 6



Пытаюсь сделать шифрование через SLL, проблема в том, что если задавать строку для шифрования большую, то строка обрезается (маленькие строки нормально работают). Помогите разобраться что и где я ошибся

Encrypt и Decrypt всяты с доки по openssl
myEncrypt и myDecrypt - это мои функии, в качестве параметра string и выводят string.

Код

#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=(char*) MsgPlain.c_str();
    char* encrypted =  Encrypt(Key,text,strlen(text)+1);
    return string(encrypted);

}


string myDecrypt( char *Key, string MsgBase64){
    char* text=(char*) MsgBase64.c_str();
    char* decrypted =  Decrypt(Key,text,strlen(text)+1);
    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


Это сообщение отредактировал(а) admsasha - 18.6.2011, 18:36
PM MAIL WWW ICQ Jabber   Вверх
afiskon
Дата 18.6.2011, 18:53 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 31.3.2011
Где: Россия, Москва

Репутация: 1
Всего: 4



Блочные шифры шифруют данные используя характерный для них размер блока. Для шифрования данных используются различные режимы шифрования. Напримем, CTR. Описание есть на википедии.

Добавлено через 2 минуты и 31 секунду
Код

    char* text=(char*) MsgBase64.c_str();
    char* decrypted =  Decrypt(Key,text,strlen(text)+1);


А за это вас вообще нужно жестоко наказать! c_str() возвращает const char, от которого вы решили избавиться приведением типов в стиле Си. Если хотите как-то его менять - выделяйте память и работайте с копией!

Добавлено через 3 минуты и 32 секунды
И память, выделенную с помощью malloc() не освободили. Подучите-ка язык для начала...

Добавлено через 5 минут и 28 секунд
Хотя вижу, что у вас CFB. Но учитывая другие ошибки, вообще удивительно, что оно работает.
PM MAIL WWW   Вверх
boostcoder
Дата 18.6.2011, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



скомпиль эти коды: http://www.codealias.info/technotes/des_en..._simple_example
они у тебя работают?

есть подозрение, что std::string при инициализации тут:
Код

return string(encrypted);

обрезает исходную строку из-за того что встречает '\0' или что-то в этом роде.

PM WWW   Вверх
admsasha
Дата 19.6.2011, 07:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: нет
Всего: 6



afiskon,  Это я экспериментировал всяко разно, вот и получилось что без очистки памяти.

boostcoder,  Да, от туда и брал, если подставлять там этот же кусок для шифрования, то всё нормально работает. Ошибка, явно, где то в моем переходе string-> char. Только не пойму где.

переписал фунцию, и добавил отладку

Код

string myEncrypt( char *Key, string MsgPlain){
    char* text;

    text =(char*) malloc(MsgPlain.length()+1);
    strncpy(text, MsgPlain.c_str(),MsgPlain.length());

    printf("text len = %i\n",strlen(text));

    char* encrypted =  Encrypt(Key,text,strlen(text)+1);

    printf("encrypted len = %i\n",strlen(encrypted));

    string rez=string(encrypted);
    
    free(text);
    free(encrypted);
    
    return rez;

}


Вывод
Код
text len = 190
encrypted len = 144


Это до всяких string


Самое интересное, если после strncpy поставить "text[144]='1';" То код, работает нормально. Будто бы и вправду \0 существует, но строка вообще сплошная, да и strlen показывает все 190 символов.





Это сообщение отредактировал(а) admsasha - 19.6.2011, 08:09
PM MAIL WWW ICQ Jabber   Вверх
boostcoder
Дата 19.6.2011, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



admsasha, ну так инициализируй строку нормально!
Код

string rez(encrypted, MsgPlain.length());

PM WWW   Вверх
admsasha
Дата 19.6.2011, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: нет
Всего: 6



boostcoder, Это никак не помогло.
PM MAIL WWW ICQ Jabber   Вверх
boostcoder
Дата 19.6.2011, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



ну хз что ты там накодил. у меня все работает.
PM WWW   Вверх
admsasha
Дата 19.6.2011, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: нет
Всего: 6



Цитата(boostcoder @  19.6.2011,  17:30 Найти цитируемый пост)
ну хз что ты там накодил. у меня все работает.


Это весь пример, ничего более нету.
PM MAIL WWW ICQ Jabber   Вверх
boostcoder
Дата 19.6.2011, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



показывай. я не телепат.
PM WWW   Вверх
admsasha
Дата 19.6.2011, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: нет
Всего: 6



Причем тут телепат ? В самом верху был весь код + одна правка 

Вот, что в итоге получилось
Код

#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());
    
    char* encrypted =  Encrypt(Key,text,strlen(text)+1);
   
    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());

    char* decrypted =  Decrypt(Key,text,MsgBase64.length()+1);

    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);
}





Это сообщение отредактировал(а) admsasha - 19.6.2011, 10:41
PM MAIL WWW ICQ Jabber   Вверх
mes
Дата 19.6.2011, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(admsasha @  19.6.2011,  09:38 Найти цитируемый пост)
 strncpy(text, MsgBase64.c_str(),MsgBase64.length());
    char* decrypted =  Decrypt(Key,text,MsgBase64.length()+1);

на месте завершающего символа, у Вас мусор.. 
Цитата

No null-character is implicitly appended to the end of destination, so destination will only be null-terminated if the length of the C string in source is less than num.

http://www.cplusplus.com/reference/clibrary/cstring/strncpy/

да и нужен ли +1 ? ведь Вы на шифровку передаете массив символов, а не си-строку..



--------------------
PM MAIL WWW   Вверх
admsasha
Дата 19.6.2011, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: нет
Всего: 6



Если правильно понял, то вот что получилось.
Код

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;
}


Но это не помогло.

PM MAIL WWW ICQ Jabber   Вверх
admsasha
Дата 19.6.2011, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: нет
Всего: 6



Окончательный вариант, вроде как работает теперь как нужно smile

Код

#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';
    memcpy(text,MsgPlain.data(),MsgPlain.length()+1);

    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';
    memcpy(text,MsgBase64.data(),MsgBase64.length()+1);

    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);
}



Всем, кто пытался помочь, спасибо !

PM MAIL WWW ICQ Jabber   Вверх
mes
Дата 19.6.2011, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(admsasha @  19.6.2011,  10:25 Найти цитируемый пост)
Но это не помогло.

Цитата(admsasha @  19.6.2011,  10:25 Найти цитируемый пост)
   text[MsgBase64.length()]='\0'

тогда уж логично [..length()+1]..


Цитата(admsasha @  19.6.2011,  10:59 Найти цитируемый пост)
char * Encrypt( char *Key, char *Msg, int 

судж по всему должно быть : (const char *, const char*,

хотя код смотрел только мельком..







--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 19.6.2011, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



вот о чем я говорил:
Код

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <openssl/des.h>

#include <string>
#include <iostream>

std::string Encrypt(const std::string& Key, const std::string& Msg) {
   int             n=0;
   DES_cblock      Key2;
   DES_key_schedule schedule;
   
   std::string Res(Msg.length(), 0);
   
   /* Prepare the key for use with DES_cfb64_encrypt */
   memcpy(Key2, Key.c_str(), 8);
   DES_set_odd_parity( &Key2 );
   DES_set_key_checked( &Key2, &schedule );
   
   /* Encryption occurs here */
   DES_cfb64_encrypt(
      (unsigned char*)Msg.c_str(),
      (unsigned char*)&Res[0],
      Msg.length(),
      &schedule,
      &Key2,
      &n,
      DES_ENCRYPT
   );
   
   return Res;
}
 
std::string Decrypt(const std::string& Key, const std::string& Msg) {
   int             n=0;
   
   DES_cblock      Key2;
   DES_key_schedule schedule;
   
   std::string Res(Msg.length(), 0);
   
   /* Prepare the key for use with DES_cfb64_encrypt */
   memcpy( Key2, Key.c_str(),8);
   DES_set_odd_parity( &Key2 );
   DES_set_key_checked( &Key2, &schedule );
   
   /* Decryption occurs here */
   DES_cfb64_encrypt(
      (unsigned char*)Msg.c_str(),
      (unsigned char*)&Res[0],
      Msg.size(),
      &schedule,
      &Key2,
      &n,
      DES_DECRYPT
   );
   
   return Res;
}

int main() {
 
   char key[]="password";
   char clear[]="1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890";
   std::string enc = Encrypt(key,clear);
   
   std::string dec = Decrypt(key, enc);
   
   std::cout << dec << std::endl;

   return (0);
}


http://liveworkspace.org/code/f9e8c0f7fca2...11720d3d4c0e913
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0605 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.