Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.10.2021, 13:02   #1
prog2222
Новичок
Джуниор
 
Регистрация: 14.10.2021
Сообщений: 2
Вопрос Проблемы с шифрованием, криптография. С++

В функции foo() происходит формирование ключа key2. Потом он передается в функцию ENCODE. В ней шифрование происходит с помощью ^. Проблема в том, что я получаю не совсем те результаты, которые ожидаю.
Проблема, кажется, в самом ключе. Так как при std::bitset<1>(key2) для нуля я имею 0. Но при std::bitset<8>(key2) для того же нуля, я имею 11000010. В чем проблема?

Код:
#include <iostream>
#include <bitset>
#include <string>
#include <vector>
#include <iomanip>

std::vector<char> foo(std::vector<char>& key2) {
    uint32_t state = 0b1111111111111111111111111111111;
    uint32_t start_state2{ state };
    uint32_t period {0};
    uint32_t bit2 {0};
    do {
        bit2 = ((state >> 31) ^ (state >> 30) ^ (state >> 29) ^ (state >> 25) ^ state);
        //bit2 = key2[period];
        (key2[period]) = (bit2);
        std::cout << std::bitset<8>(key2[period]) << " ";
        state = (state >> 1) | (bit2 << 31);

        std::cout << std::bitset<32>(state) << std::endl;
        period++;

    } while ((period != 15) && (start_state2 != state));

    std::cout << "Period: " << period << std::endl;
    return key2;
}

const int SIZE{8};
void ENCODE(std::string data, std::vector<char>& key2) {
    std::vector<std::bitset<SIZE>> vec_bitset_data;

        for(unsigned i=0; i < data.size(); ++i) {
            std::bitset<SIZE> d(data[i]);
            std::bitset<SIZE> k(key2[i]);

            std::bitset<SIZE> encoded = d^k;
           std::cout << encoded << ' ';
        }
        std::cout << " ";
}

int main() {
    std::vector<char> key2(32);


    foo(key2);

    std::string data;
    data = "Hello";

    std::cout << "\nData string: " << data << '\n';
    for(unsigned i = 0; i < data.size(); i++) {
        std::bitset<8> d(data[i]);
        std::cout << d << ' ';
    }
    std::cout << '\n';

    std::cout << "Key: ";
    for(unsigned i=0; i < data.size(); ++i) {
        std::cout << std::bitset<8>(key2[i]) << " ";
    }
    std::cout << '\n';

    ENCODE(data, key2);
    return 0;
}

OUTPUT

Код:
Data string: Hello
01001000 01100101 01101100 01101100 01101111          //СИВОЛЫ КАЖДОЙ БУКВЫ Hello
Key: 11000010 11100001 10110111 10011100 11001110   //КЛЮЧ ПРИ STD::BITSET<8>
10001010 10000100 11011011 11110000 10100001          //РЕЗУЛЬТАТ ^

Последний раз редактировалось prog2222; 14.10.2021 в 13:09.
prog2222 вне форума Ответить с цитированием
Старый 14.10.2021, 14:23   #2
ForenLi
Форумчанин
 
Регистрация: 02.06.2021
Сообщений: 515
По умолчанию

Цитата:
Сообщение от prog2222 Посмотреть сообщение
Так как при std::bitset<1>(key2) для нуля я имею 0. Но при std::bitset<8>(key2) для того же нуля, я имею 11000010.
Все правильно:
Код:
11000010 -> std::bitset<1>(key2) -> 00000000
11000010 -> std::bitset<8>(key2) -> 11000010
ForenLi вне форума Ответить с цитированием
Старый 14.10.2021, 14:36   #3
prog2222
Новичок
Джуниор
 
Регистрация: 14.10.2021
Сообщений: 2
По умолчанию

Цитата:
Сообщение от ForenLi Посмотреть сообщение
Все правильно:
Код:
11000010 -> std::bitset<1>(key2) -> 00000000
11000010 -> std::bitset<8>(key2) -> 11000010
А как это получается? Не совсем понимаю

UPD: А разве при
Код:
std::bitset<1>(key2)
не выводится просто младший бит?
Так как,
Код:
std::bitset<8>(key2)
для разных нулей выдает разные результаты. Например,
Код:
11001110
.
Можно ли тогда считать, что ключ использован правильно?

Последний раз редактировалось prog2222; 14.10.2021 в 14:44.
prog2222 вне форума Ответить с цитированием
Старый 14.10.2021, 16:14   #4
ForenLi
Форумчанин
 
Регистрация: 02.06.2021
Сообщений: 515
По умолчанию

Цитата:
Сообщение от prog2222 Посмотреть сообщение
не выводится просто младший бит?
не выводится, а инициализируется

Цитата:
Сообщение от prog2222 Посмотреть сообщение
для разных нулей выдает разные результаты
для нуля он проинициализируется нулями

Цитата:
Сообщение от prog2222 Посмотреть сообщение
Можно ли тогда считать, что ключ использован правильно?
Если для одинакового входного значения и одинакового ключа выдает разный результат, то что-то явно не то.
ForenLi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Криптография alyan Помощь студентам 1 21.11.2013 22:00
криптография linass Помощь студентам 0 19.05.2013 15:02
Криптография Vladokkk Помощь студентам 1 05.09.2012 05:20
Криптография Shurik(c) Помощь студентам 1 13.06.2011 13:27
Криптография metallist85 Общие вопросы Delphi 5 28.10.2010 09:30