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

Шифрование строки по паролю - C++

Восстановить пароль Регистрация
 
nubo
 Аватар для nubo
112 / 69 / 8
Регистрация: 31.07.2010
Сообщений: 334
05.08.2010, 10:07     Шифрование строки по паролю #1
В продолжение этой темы.
Всем привет. Выбрал время для дальнейших поползновений в неблагодарном деле изучения C++

Ну и очередной затык. Никак не могу усвоить работу с типами данных. Вот до сюда все вроде двигалось:
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
#include <iostream>
#include <string>
#include <ctime>
 
using namespace std;
 
 
int encodePass(const char* main_pass, const char* new_pass)
{
 
    int code;
    string text;
    srand(time(0));
    size_t new_len  = strlen(new_pass);
    size_t main_len = strlen(main_pass);
 
    for(int j = 0; j < main_len; ++j)
    {
        code = char(main_pass[j]);
 
        for(int i = 0; i < code; ++i)
            text  += char(33 + rand() % 143);
 
        text += new_pass[j];
    }
 
    cout << "Result: " << text << endl;
    return 0;
 
}
 
int main()
{
 
        string select, main_pass, new_pass;
        cout << "Select operation and press Enter\nencode - 1, decode - 2  ";
        getline(cin, select);
 
 
     while(true)
     {
        if(select == "1")
        {
            cout << "Insert main password: ";
            getline(cin, main_pass);
            cout << "Insert new password: ";
            getline(cin, new_pass);            
            encodePass(main_pass.c_str(), new_pass.c_str());
            break;
        }
        
        if(select == "2")
        {
           // decodePass(main_pass.c_str());
           break;
        }
        else
        {
            cout << "Select operation and press Enter\nencode - 1, decode - 2  ";
            getline(cin, select);
        }
     }          
  
        return 0;
}
то есть алгоритм такой - символы шифруемого пароля расставляются на позиции, соответствующие коду символа основного пароля. Промежутки заполняются всяким мусором.

И все бы ничего, но если шифруемый пароль длиннее основного, то будет фиаско. Идея такая, что нужно повторять основной пароль до тех пор, пока его длина не превысит шифруемый.

И вот тут затык с типами данных. На PHP это решилось бы несколькими строчками:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
function test($text1, $text2)
{
  while(strlen($text1) < strlen($text2))
    $text1 .= $text1;
   
    echo $text1;
}
 
$text1 = 'короткий';
$text2 = 'длииииииииииииииииииииииииииииииииииинный';
 
test($text1, $text2);
а тут никак. Я даже варианты решений выкладывать не хочу, что бы не портить вам нервы

Проблема в том, что для конкатенации нужен тип string, как я понял. А для определения длины функцией strlen() - тип char. А они в одном цикле.

Скорее всего такой алгоритм тут неуместен, но как по другому - ума не приложу.
Прошу прощения за кучу букаф и спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MikeSoft
Эксперт C++
 Аватар для MikeSoft
3782 / 1766 / 85
Регистрация: 21.11.2009
Сообщений: 2,540
05.08.2010, 10:13     Шифрование строки по паролю #2
Цитата Сообщение от nubo Посмотреть сообщение
для конкатенации нужен тип string
Необязательно. Попробуйте функцию strcat().
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
05.08.2010, 10:17     Шифрование строки по паролю #3
Цитата Сообщение от nubo Посмотреть сообщение
Проблема в том, что для конкатенации нужен тип string
вообще-то не обязательно, но с ним конечно проще.
Цитата Сообщение от nubo Посмотреть сообщение
А для определения длины функцией strlen() - тип char. А они в одном цикле.
а что вам мешает сделать прототип например таким и работать только с типом std::string
C++
1
int encodePass(const std::string& main_pass, const std::string& new_pass);
nubo
 Аватар для nubo
112 / 69 / 8
Регистрация: 31.07.2010
Сообщений: 334
05.08.2010, 11:01  [ТС]     Шифрование строки по паролю #4
MikeSoft, спасибо, но та же проблема осталась:
error C2664: strlen: невозможно преобразовать параметр 1 из 'const std::string' в 'const char *'
fasked, а вот с прототипом можно поподробнее? Он все равно ругается на несоответствие типов.
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
05.08.2010, 11:09     Шифрование строки по паролю #5
Цитата Сообщение от nubo Посмотреть сообщение
error C2664: strlen: невозможно преобразовать параметр 1 из 'const std::string' в 'const char *'
Чтобы узнать размер строки string, нужно воспользоваться методом size:
C++
1
2
std::string string("Hello, World!");
size_t stringSize = string.size();
Добавлено через 2 минуты
Если же хочется пользоваться функциями Си, которые работают с const char*, то его можно получить методом c_str:
C++
1
2
std::string string("Hello, World!");
size_t stringSize = strlen(string.c_str());
nubo
 Аватар для nubo
112 / 69 / 8
Регистрация: 31.07.2010
Сообщений: 334
05.08.2010, 11:21  [ТС]     Шифрование строки по паролю #6
Большое спасибо всем. Разобрался.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2010, 17:17     Шифрование строки по паролю
Еще ссылки по теме:

Шифрование строки методом гаммирования (нужно упростить код) C++
Шифрование строки типа string методом xtea C++

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

Или воспользуйтесь поиском по форуму:
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
05.08.2010, 17:17     Шифрование строки по паролю #7
Цитата Сообщение от nubo Посмотреть сообщение
PHP
1
2
3
4
5
6
7
function test($text1, $text2)
{
  while(strlen($text1) < strlen($text2))
    $text1 .= $text1;
   
    echo $text1;
}
C++
1
2
3
4
5
6
std::string test(const std::string & t1, const std::string & t2){
    std::string r(t1);
    while ( r.size() < t2.size() )
        r += t1;
    return r;
}
Yandex
Объявления
05.08.2010, 17:17     Шифрование строки по паролю
Ответ Создать тему
Опции темы

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