Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > длина буквы 3 бита


Автор: Defoult 6.10.2007, 23:25
Здравствуйте!
Столкнулся я вот с такой загвоздочкой:
"Моноалфавитная подстановка (в качестве ключа сохраняется алфавит замены,  длина буквы 3 бита)" 
Сам алгоритм шифрования и дешифрования написал на Си работая со строкой
Код

char text[]="abc";

но в char один символ - один байт
что мне нужно сделать, что бы символы стали длиной в 3 бита? И как с ними потом работать?

Автор: DjoNIK 6.10.2007, 23:31
Код

char ch_arr[] = {"abc"};
или
Код

char ch_arr[] = {'a', 'b', 'c'};
или
Код

char *ch_ptr = new char[4];
strcpy( ch_ptr, "abc" );



Автор: Defoult 6.10.2007, 23:34
т.е в массиве один символ - 3 бита?

Автор: DjoNIK 6.10.2007, 23:43
Цитата

т.е в массиве один символ - 3 бита? 

Нет

Добавлено @ 23:44
Цитата

что бы символы стали длиной в 3 бита?

Без асемблера точно не обойтись.

Добавлено @ 23:46
Но ты уверен что тебе нужно именно это?
Сформулируй четко вопрос! Просто я поначалу подумал, что тебе необходимо в одну переменную запихнуть три символа. И привел пример с массивами.

Автор: Defoult 6.10.2007, 23:58
Вариант №3    Моноалфавитная подстановка (в качестве ключа сохраняется алфавит замены,  длина буквы 3 бита)
Суть моноалфавитной подстановки заключается в замене символов исходной информации, записанных в одном алфавите, символами из другого алфавита по определенному правилу.
... т.е. иходный алфавит латиница а в алфавите шифрования длина буквы одного символа равна 3 битам...
Я так понимаю...

Автор: nickless 7.10.2007, 00:25
Цитата(Defoult @  6.10.2007,  22:58 Найти цитируемый пост)
длина буквы одного символа равна 3 битам

Что-то мало для кодирования символов, тремя битами можно только 8 разных букв закодировать...
Текст задания на бумаге написан? Может там 8 а не 3? smile 

Автор: Kuvaldis 7.10.2007, 00:32
Defoult
Здесь не надо ассемблер: хватит и команд сдвига битов
Делать так: 
1. Берешь очередную букву
2. Находишь ее 3-битовый эквивалент
3. Записываешь эти три бита в младшие разряды выходной последовательности
4. сдвигаешь последовательность в выходном буфере на 3 бита влево ( оператор << )

Единственное, я бы взял буфер кратным 3 и 8 (в битовом представлении)
3 - чтобы влазили все шифрованные буквы, без запоминания не влезших разрядов
8 - чтобы получались целые байты, для записи в файл
т.е. удобно буфер взять размером 3 * 8 = 24 бита = 3 байта
обработка у тебя будет по 8 букв
 

Автор: archimed7592 7.10.2007, 09:51
Цитата(DjoNIK @  6.10.2007,  23:43 Найти цитируемый пост)
Без асемблера точно не обойтись.

Я пацталом smile.


Цитата(nickless @  7.10.2007,  00:25 Найти цитируемый пост)
Что-то мало для кодирования символов, тремя битами можно только 8 разных букв закодировать...
Для начального задания по курсу криптоанализа нормальное себе задание... Вот когда дают полноценные задания(даже для таких элементарных методов) - хрен расшифруешь smile.


Defoult, а в чём проблема просто не позволять букве принимать значение больше 7? Делается очень просто операцией взятия остатка от деления( x &= 8; ).

Автор: MAKCim 7.10.2007, 11:28
archimed7592
Цитата(archimed7592 @  7.10.2007,  09:51 Найти цитируемый пост)
взятия остатка от деления( x &= 8; ). 

может быть
x &= 7  smile 

Автор: archimed7592 7.10.2007, 13:41
Ну, о требованиях к скорости никаких предпосылок не было, но, тем не менее, лови плюс за свою любовь к асемблеру и к преждевременной оптимизации smile.
Вообще говоря, в преждевременной оптимизации(а в асемблере тем более) нет ничего хорошего, но, видимо тебе ставят настолько критичные к ресурсам задачи, что ты любую строчку кода пытаешься избавить от лишних тактов процессора smile.

Автор: Defoult 7.10.2007, 20:59
Цитата

2. Находишь ее 3-битовый эквивалент

Это как????

Цитата

а в чём проблема просто не позволять букве принимать значение больше 7?

но ведь мне надо зашифровать 26 символов

Автор: archimed7592 7.10.2007, 21:15
Да хоть миллион символов...
Ну и шифруй себе на здоровье... В чём проблема то?

Если я не забыл что такое моноалфавитная подстановка, то вот тебе пример.
У тебя алфавит 01234567. Нужно заменить на алфавит 76543210.
Код

const char alphabetLength = 8;
const char originalAlphabet[alphabetLength] = {0, 1, 2, 3, 4, 5, 6, 7};
const char chiperAlphabet[alphabetLength] = {7, 6, 5, 4, 3, 2, 1, 0};

const int textLength = 4; // Надо - сделай здесь хоть 26, хоть 126  символов.
const char text[textLength] = {0, 1, 2, 1}; //  Каждый из них должен быть от 0 до 7.
char char chiperText[textLength];
for (int i = 0; i < textLength; ++i)
    chiperText[i] = chiperAlphaber[originalAlphabet[text[i]]];

Автор: Defoult 7.10.2007, 21:28
это если мы числа шифруем, а мне ведь надо текст на латинице зашифровать...

Автор: archimed7592 7.10.2007, 21:31
Ты понимаешь что весь этот текст должен состоять из букв, которых можно пересчитать по пальцам, ибо у тебя не может быть больше 8-ми различных букв(по условию)?

Автор: Defoult 7.10.2007, 21:54
Т.е. по условию у меня просто работа с числами???

А что тогда имел ввиду Kuvaldis???
Цитата
Делать так: 
1. Берешь очередную букву
2. Находишь ее 3-битовый эквивалент
3. Записываешь эти три бита в младшие разряды выходной последовательности
4. сдвигаешь последовательность в выходном буфере на 3 бита влево ( оператор << 

Автор: archimed7592 7.10.2007, 22:11
Ты условие знаешь? Ты сам понимаешь что нужно сделать? Я давно с криптоанализом дела не имел... Возможно тебе нужно представить весь текст(с произвольным количеством символов в алфавите) в виде потока бит и каждые 3 бита менять по заданной маске... Если так, то тебе нужно что-то, вроде, того, что имел ввиду Kuvaldis. Ты с задачей для начала определись(сформулируй её получше)...

Автор: Defoult 7.10.2007, 22:29
 smile всю задачу я выкладывал уже несколько раз....
ctrl+C ctrl+V )) ошибки быть не может, если тока байты из флешки не вылетают )))
в том-то и проблема...что само задание сложности не предстваляет если работать со строкой, в которой 1 буква - 1 байт, а вот эта небольшая оговорочка о 3 битах ввела меня в великий ступор я просто абстрактно не могу представить.....кака я буду шифровать алфавит, когда у меня в распоряжении всего 3 бита на 1 букву

Автор: archimed7592 7.10.2007, 22:34
Цитата(Defoult @  6.10.2007,  23:58 Найти цитируемый пост)
Суть моноалфавитной подстановки заключается в замене символов исходной информации, записанных в одном алфавите, символами из другого алфавита по определенному правилу.

Продолжение(об определённом правиле) в студию smile.


Цитата(Defoult @  7.10.2007,  22:29 Найти цитируемый пост)
.кака я буду шифровать алфавит, когда у меня в распоряжении всего 3 бита на 1 букву 

IIRC, в моноалфавитной подстановке исходный алфавит имеет такую же мощность, как и целевой.

Автор: Defoult 7.10.2007, 23:03
http://orel-lsr.narod.ru/LAB1/l1_1.html
может у меня алфавит шифрования - набор чисел?
но опять же числа от 0 до 7  smile  ничего не понимаю

Автор: archimed7592 8.10.2007, 09:35
Цитата
Затем выбирается алфавит шифрования и устанавливается взаимно однозначное соответствие между символами нормативного алфавита и символами алфавита шифрования.

Из этой цитаты делаем вывод что у тебя алфавит шифрование имеет такую же мощность, как и нормативный алфавит.
В условии у тебя сказано, что длина символа из алфавита - 3 бита. Что это означает? Только то, что алфавит содержит 8 различных символов, пофиг каких.
Хочешь набор чисел - пожалста. Хочешь abcdefgh - пожалста. И это отностися как к нормативному алфавиту, так и к алфавиту шифрования.

Автор: _Michael 8.10.2007, 18:57
Цитата(archimed7592 @  7.10.2007,  22:11 Найти цитируемый пост)
Ты условие знаешь? Ты сам понимаешь что нужно сделать? Я давно с криптоанализом дела не имел... Возможно тебе нужно представить весь текст(с произвольным количеством символов в алфавите) в виде потока бит и каждые 3 бита менять по заданной маске...

ето я думаю соответствует действительности. 
и не вижу никакой проблемы с тремя битами. И не плутайте пожалуйста понятие слова символ в общем случае и в криптоанализе. В задании наверное имелось ввиду под словом символ - символ алфавита который имеет размер 8 поскольку три бита всего на кодирование одного символа а не то значение которое обычно мы имееем ввиду. Допустим у тебя есть набор символов "abcd" соответственно он в памяти представляется четырьмя байтами или 32мя битами.  вроде так, точно в АSCII не смотрел:
а - 01100001 b - 01100010 c - 01100011 d - 01100100 
ето не сутьважно. или если все подряд одним потоком то
01100001011000100110001101100100. 
и так далее сколько у тебя там символов(имею ввиду тех что одним байтом кодируются) Все что тебе надо ето поделить етот поток на группы по три биты т.е:
011 000 010 110 001 001 100 011 011 001 00. 
и заменить каждую группу соответствующей по твоему закону подстановки. Тоесть выходит напркимер что из буквы "а" пролучается две полных группы и два бита остаются, которые ты дополняеш соответственно первым битом буквы "b" и так далее. Усек? 
А как делить ето уж придумай. Проще всего наверное сдвигать по три бита и использовать битовые маски для выделения очередной группы из трех бит. ето даже не С++ а сишка обыкновенная.

Автор: archimed7592 8.10.2007, 19:00
_Michael, ты читал описание его алгоритма по ссылке? smile

Автор: _Michael 8.10.2007, 19:03
Цитата(archimed7592 @  7.10.2007,  09:51 Найти цитируемый пост)
Defoult, а в чём проблема просто не позволять букве принимать значение больше 7? Делается очень просто операцией взятия остатка от деления( x &= 8; ).

оно правильно но в корне неверно для нашего случая. возьмем например числа 13 и 5 остача от деления их на 8 дает число 5. вот ету пятерку например согласно нашему закону подстановки мы заменили на 7 например. Потом при расшифровке ету ж семерку как мы будем знать на что заменять? на 5 или на 13? или ж может на 21? так-что здесь теряется как уже ктото казал взаимная однозначность или соответствие между символами двух алфавитов.

Добавлено @ 19:06
Читал и что? smile

Добавлено @ 07:49
Ето ж самое елементарное что есть в криптографии. Простая моноалфавитная подстановка.

Автор: archimed7592 8.10.2007, 19:34
Цитата(_Michael @  8.10.2007,  19:03 Найти цитируемый пост)
оно правильно но в корне неверно для нашего случая.

Для вашего - возможно...

Цитата(_Michael @  8.10.2007,  19:03 Найти цитируемый пост)
Читал и что?


Цитата
Затем выбирается алфавит шифрования и устанавливается взаимно однозначное соответствие между символами нормативного алфавита и символами алфавита шифрования.

Как ты установишь взаимнооднозначное соответствие, если мощность нормативного алфавита 26, а алфавита шифрования - 8?
Что же касается условия как такового - там нигде явно не сказано, что нужно шифровать именно английский текст(и, таким образом, дробить его на трёхбитные токены). Там лишь сказано, что мощность алфавита - 8. Зачем выдумывать себе(или кому-либо) задачу? smile

Автор: _Michael 8.10.2007, 19:40
Цитата(archimed7592 @  8.10.2007,  19:34 Найти цитируемый пост)
Как ты установишь взаимнооднозначное соответствие, если мощность нормативного алфавита 26, а алфавита шифрования - 8?

А кто сказал что именно английский алфавит длиной 26 есть нормативный? сказано просто зашифровать алфавитом с длиной символа три биты  или както так. значит мы  вибираем етот нормативный алфавит также таким самым по размеру. Не надо привязываться к длине 1 байт. ето для нас один символ - 1 байт, там же поток бит которы й мы  сами делим по три биты  потому что так мы условились и зашифровать нам надо также алфавитом с терхбитовыми символами

Добавлено через 3 минуты и 31 секунду
Цитата(Defoult @  6.10.2007,  23:25 Найти цитируемый пост)
"Моноалфавитная подстановка (в качестве ключа сохраняется алфавит замены,  длина буквы 3 бита)"

Вот как дословно звучит задание. там не сказано какого именно алфавита. поетому имеется ввиду навероное и того и того.

Добавлено через 7 минут и 14 секунд
И почему все привязались к одному байту? потому что в С длина типа данных char - 1 байт? а есть еще юникодовские 2 байта. Ето ж просто заблуждение. Не надо плутать символи(char ) в программировании и в криптографии

Добавлено через 12 минут и 54 секунды
Цитата(archimed7592 @  8.10.2007,  19:34 Найти цитируемый пост)
Что же касается условия как такового - там нигде явно не сказано, что нужно шифровать именно английский текст(и, таким образом, дробить его на трёхбитные токены)

Вот именно что не указано и потому мы его принимаем за "свой" так сказать текст с длиной символа в три биты.
И почему судя по твоих словах из английского текста следует что раз он английский то надо дробить по три биты? именно потому чтоб абстрагироваться от английского кириличного мы принимаем свой алфавит по три бита.

Добавлено через 13 минут и 7 секунд
smile

Автор: archimed7592 8.10.2007, 20:46
Цитата(_Michael @  8.10.2007,  19:40 Найти цитируемый пост)
поетому имеется ввиду навероное и того и того.

Будем на бобах гадать что имеется ввиду а что нет? А может быть ещё имеется выводить на экран "кукареку"?
Что написано то и имеется ввиду.

Цитата(_Michael @  8.10.2007,  19:40 Найти цитируемый пост)
И почему все привязались к одному байту? потому что в С длина типа данных char - 1 байт? а есть еще юникодовские 2 байта. Ето ж просто заблуждение. Не надо плутать символи(char ) в программировании и в криптографии

Привязался только ты. И топикстартер.


Цитата(_Michael @  8.10.2007,  19:40 Найти цитируемый пост)
Вот именно что не указано и потому мы его принимаем за "свой" так сказать текст с длиной символа в три биты.
И почему судя по твоих словах из английского текста следует что раз он английский то надо дробить по три биты? именно потому чтоб абстрагироваться от английского кириличного мы принимаем свой алфавит по три бита.

Покажешь мне хоть одно место, не выдранное из контекста, где я предлагаю дробить? Я лишь один раз озвучил предположение о том, что "возможно, задание предполагает дробить" и попросил показать задание. Увидев задание я опроверг это предположение.


Ну и напоследок - ты САМ предлагаешь дробить:
Цитата(_Michael @  8.10.2007,  18:57 Найти цитируемый пост)
Все что тебе надо ето поделить етот поток на группы по три биты т.е:
011 000 010 110 001 001 100 011 011 001 00. 
и заменить каждую группу соответствующей по твоему закону подстановки.

Цитата(_Michael @  8.10.2007,  19:40 Найти цитируемый пост)
там же поток бит которы й мы  сами делим по три биты  потому что так мы условились и зашифровать нам надо также алфавитом с терхбитовыми символами

Так может быть ты определишься со своими хаотическими мыслями и не будешь тут нести ересь?

Автор: Defoult 8.10.2007, 21:50
Я сегодня уточнил задание.....
вобщем так:
мы работаем не с самими символами, а с их битами,
весь текст мы представляем ввиде последовательности бит 
0111011010111010011000100101100011001011100111111

затем разбиваем на группы по 3 бита, т.к. 1 буква - 1 бит (по заданию)
если у меня 1 буква может занимать 3 бита, то ключ будет состоять у меня из 8 различных комбинаций этих битов
000
010
100
011
110           это ключ
101
001
111


и по этому ключу мы выполняем перестановку.


Вот в принципе суть задания.
Всем спасибо smile 

2archimed7592 и _Michael хотел вам +1 дать, но пока не могу....Как только смогу, соазу вспомню вашу помощь smile 

Автор: _Michael 8.10.2007, 22:37
Цитата(archimed7592 @  8.10.2007,  19:34 Найти цитируемый пост)
Что же касается условия как такового - там нигде явно не сказано, что нужно шифровать именно английский текст(и, таким образом, дробить его на трёхбитные токены).

archimed7592, Вот из етих твоих "и, таким образом, " выходит что если текст английский, таким образом дробить его на трёхбитные токены. Но ето все по большему счету несуттево(неважно наверное правильнее по русски). Видишь что моя интерпретация( не знаю более подходящего слова чтоб меня правильно поняли) задания оказалась верной. То-есть что действительно надо все подряд писать и разбивать по 3 бита: 
Цитата(Defoult @  8.10.2007,  21:50 Найти цитируемый пост)
весь текст мы представляем ввиде последовательности бит 
0111011010111010011000100101100011001011100111111
затем разбиваем на группы по 3 бита


Просто  у меня тоже лабораторные были по етому и я примерно знаю что надо сделать. smile

archimed7592, не обижайся, мы ж здесь пробуем помогти разобраться вместе, а не показать кто умнее. в каждого какие-то идеи есть, вот он ими и делится, и вместе мы приходим к какому-то общему знаменателю. smile

Добавлено @ 22:42
Defoult, когда все задание уже стало ясно, думаю разберешся как по порциях по три бита брать. и подставлять ;)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)