1 / 1 / 0
Регистрация: 01.06.2015
Сообщений: 11
1

XOR для строки

10.10.2021, 17:15. Показов 2403. Ответов 9

Author24 — интернет-сервис помощи студентам
здравствуйте. хочу реализовать ксор на строке. строка будет в дальнейшем заполнятся разными символами(цифры буквы пробелы и прочее) этот кусок кода будет использован как функция, т.е. ввод-вывод строка с 4 символами(32 бита итого). в коде
ошибка Expression: string subscript out of range из-за пробела на входе. что вы посоветуете? сменить char на другой тип? или есть методы выполнения побитовых операций на строках? в дальнейшем еще надо замена по таблице(пока в виде строки) шеснадцатиричный символ меняем на другой(sblock стыренный из AES). пишу легенький алгоритм шифрования. возможно даже строки тут не лучший вариант
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "pch.h"
#include <iostream>
#include <string>
 
 
int main()
{
    std::cout << "Hello World!\n";
    std::string s;
    std::cin >> s;
    char p;
    for (int i = 0; i < 4;i++ )
    {
        p = s[i];
        for (int n = 0; n < 8; n++)
        {
            p ^= 1UL << n;
        }
        //добавить в новую строку
        std::cout << p;
    }   
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.10.2021, 17:15
Ответы с готовыми решениями:

Исключающее ИЛИ (XOR). Нужен пример операции побайтного XOR
Может кто-нибудь привести пример операции побайтного XOR?что-то вроде: есть данные,считанные из...

Простой XOR строки
Есть какая-то готовая функция XOR'a строки и deXOR'а?

Запись в файл XOR аргумента командной строки
Помогите пожалуйста решить следующую задачу Нужно сформировать файл следующего содержания u1,...

Напишите программу шифрования строки с помощью метода XOR и ключа, используя цепочечные команды
Напишите программу шифрования строки с помощью метода XOR и ключа, используя цепочечные команды....

XOR для UnicodeString
Доброго! Пробую ввести Юникод в хор через байты. Вроде все нормально, пока в пароле не...

9
фрилансер
5497 / 5093 / 1047
Регистрация: 11.10.2019
Сообщений: 13,321
10.10.2021, 17:21 2
Цитата Сообщение от demidos Посмотреть сообщение
i < 4
тут должно быть i<s.size(), тогда и не будет выхода за край

C++
1
2
3
4
5
6
7
8
9
10
    for (size_t i = 0; i < s.size(); i++)
    {
        char p = s[i];
        for (size_t n = 0; n < 8; n++)
        {
            p ^= (1UL << n);
        }
 
        std::cout << p;
    }
а вообще, непонятно, что хочешь сделать
0
1 / 1 / 0
Регистрация: 01.06.2015
Сообщений: 11
10.10.2021, 17:28  [ТС] 3
тогда блоки будут не 32 битные. и xor с следующим блоком я не выполню. изначально я пробовал < sizeof(s)-1. и дело не в нем. тогда вообще всегда была ошибка. алгоритм: ввод ключа. ввод заметки. заметка делится на 32битные блоки. первый блок xor32 бита ключа. замена из таблицы. результат пишется в файл и одновременно является ключем для второго блока входных данных. далее приписывание к файлу и все.
0
фрилансер
5497 / 5093 / 1047
Регистрация: 11.10.2019
Сообщений: 13,321
10.10.2021, 17:34 4
Цитата Сообщение от demidos Посмотреть сообщение
тогда блоки будут не 32 битные
да и на здоровье с ними, зато выхода за край не будет

Всё равно в std::string нет 32-битных значений, есть char.

Если имеется реинтерпретация данных как сырого массива, то дополни строку нулями до кратности sizeof(uint32_t), затем работай как с массивом uint32_t , при этом количество таких элементов будет s.size()/sizeof(uint32_t)
0
1 / 1 / 0
Регистрация: 01.06.2015
Сообщений: 11
10.10.2021, 17:37  [ТС] 5
каждый символ строки это 8 бит. 4 символа 32 бита. строку конечно дополнять до кратности но пока не знаю чем. нули используются то в тексте
0
фрилансер
5497 / 5093 / 1047
Регистрация: 11.10.2019
Сообщений: 13,321
10.10.2021, 17:45 6
Цитата Сообщение от demidos Посмотреть сообщение
sizeof(s)
а это неправильно в любом случае

Добавлено через 7 минут
demidos,
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
#include <iostream>
#include <string>
 
int main()
{
    std::string s;
    std::cin >> s;
    
    using item_type=uint32_t;
    
    if(const auto rest=s.size()%sizeof(item_type))
    {
        s.append(sizeof(item_type)-rest,'\0');
    }
    
    const auto items_count=s.size()/sizeof(item_type);
    auto* beg=(item_type*)s.data();
    const auto* end=beg+items_count;
    
    for(auto curr=beg; beg!=end; curr++)
    {
        *curr ^= 0x55555555;
    }
}
0
1 / 1 / 0
Регистрация: 01.06.2015
Сообщений: 11
10.10.2021, 18:10  [ТС] 7
можно какую нибудь ссылку на описание и синтаксис uint32_t а то я чего-то не нахожу в инете такого, только малопонятные примеры

Добавлено через 7 минут
а это в какую сторону почитать? "Вызвано исключение: нарушение доступа для чтения.
**curr** было 0x540000., произошло"
C++
1
 *curr ^= 0x55555555;
1
фрилансер
5497 / 5093 / 1047
Регистрация: 11.10.2019
Сообщений: 13,321
10.10.2021, 18:11 8
demidos,
https://en.cppreference.com/w/cpp/types/integer

Defined in header <cstdint>
Добавлено через 44 секунды
Цитата Сообщение от demidos Посмотреть сообщение
а это в какую сторону почитать? "Вызвано исключение
код покажи
0
1 / 1 / 0
Регистрация: 01.06.2015
Сообщений: 11
10.10.2021, 18:13  [ТС] 9
ваш. ctrlc ctrlv

Добавлено через 34 секунды
22 строка
0
фрилансер
5497 / 5093 / 1047
Регистрация: 11.10.2019
Сообщений: 13,321
10.10.2021, 18:19 10
Лучший ответ Сообщение было отмечено demidos как решение

Решение

хм. Щас проверю

Добавлено через 5 минут
demidos, ага, очепятка вкралась beg!=end;.

Вот так попробуй:

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
#include <iostream>
#include <string>
 
int main()
{
    std::string s;
    std::cin >> s;
    
    using item_type=uint32_t;
    
    if(const auto rest=s.size()%sizeof(item_type))
    {
        s.append(sizeof(item_type)-rest,'\0');
    }
    
    std::cout<<"s.size()="<<s.size()<<'\n';
    
    const auto items_count=s.size()/sizeof(item_type);
    std::cout<<"items_count="<<items_count<<'\n';
    
    auto* beg=(item_type*)s.data();
    const auto* end=beg+items_count;
    
    for(auto* curr=beg; curr!=end; curr++)
    {
        (*curr) ^= 0x55555555;
        std::cout<<*curr<<',';
    }
}
1
10.10.2021, 18:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.10.2021, 18:19
Помогаю со студенческими работами здесь

XOR для N переменных
Собственно сабж. Сделал так: function XORN() { a=0 for n in $(seq $#); do (( a = a +...

Xor для текстовых строк
Всем привет. Нуждаюсь в помощи :) Задача похожа на разделение секрета Шамира. Нужно ввести...

Дешифратор для Шифратора XOR
Доброго времени суток. Вчера я сделал шифратор (метод XOR) и сегодня занялся дешифратором. Но...

Оператор для xor шифрования
Разматриваю пример шифрования, возник детский вопрос ^ что делает этот оператор?

функция xor для чисел
Всем доброго времени суток!Скажите пожалуйста, может где-нибудь есть наглядный пример работы...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru