Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > длина буквы 3 бита |
Автор: Defoult 6.10.2007, 23:25 | ||
Здравствуйте! Столкнулся я вот с такой загвоздочкой: "Моноалфавитная подстановка (в качестве ключа сохраняется алфавит замены, длина буквы 3 бита)" Сам алгоритм шифрования и дешифрования написал на Си работая со строкой
но в char один символ - один байт что мне нужно сделать, что бы символы стали длиной в 3 бита? И как с ними потом работать? |
Автор: DjoNIK 6.10.2007, 23:31 | ||||||
|
Автор: Defoult 6.10.2007, 23:34 |
т.е в массиве один символ - 3 бита? |
Автор: DjoNIK 6.10.2007, 23:43 | ||||
Нет Добавлено @ 23:44
Без асемблера точно не обойтись. Добавлено @ 23:46 Но ты уверен что тебе нужно именно это? Сформулируй четко вопрос! Просто я поначалу подумал, что тебе необходимо в одну переменную запихнуть три символа. И привел пример с массивами. |
Автор: Defoult 6.10.2007, 23:58 |
Вариант №3 Моноалфавитная подстановка (в качестве ключа сохраняется алфавит замены, длина буквы 3 бита) Суть моноалфавитной подстановки заключается в замене символов исходной информации, записанных в одном алфавите, символами из другого алфавита по определенному правилу. ... т.е. иходный алфавит латиница а в алфавите шифрования длина буквы одного символа равна 3 битам... Я так понимаю... |
Автор: nickless 7.10.2007, 00:25 |
Что-то мало для кодирования символов, тремя битами можно только 8 разных букв закодировать... Текст задания на бумаге написан? Может там 8 а не 3? ![]() |
Автор: Kuvaldis 7.10.2007, 00:32 |
Defoult, Здесь не надо ассемблер: хватит и команд сдвига битов Делать так: 1. Берешь очередную букву 2. Находишь ее 3-битовый эквивалент 3. Записываешь эти три бита в младшие разряды выходной последовательности 4. сдвигаешь последовательность в выходном буфере на 3 бита влево ( оператор << ) Единственное, я бы взял буфер кратным 3 и 8 (в битовом представлении) 3 - чтобы влазили все шифрованные буквы, без запоминания не влезших разрядов 8 - чтобы получались целые байты, для записи в файл т.е. удобно буфер взять размером 3 * 8 = 24 бита = 3 байта обработка у тебя будет по 8 букв |
Автор: MAKCim 7.10.2007, 11:28 |
archimed7592, может быть x &= 7 ![]() |
Автор: archimed7592 7.10.2007, 13:41 |
Ну, о требованиях к скорости никаких предпосылок не было, но, тем не менее, лови плюс за свою любовь к асемблеру и к преждевременной оптимизации ![]() Вообще говоря, в преждевременной оптимизации(а в асемблере тем более) нет ничего хорошего, но, видимо тебе ставят настолько критичные к ресурсам задачи, что ты любую строчку кода пытаешься избавить от лишних тактов процессора ![]() |
Автор: Defoult 7.10.2007, 20:59 | ||||
Это как????
но ведь мне надо зашифровать 26 символов |
Автор: archimed7592 7.10.2007, 21:15 | ||
Да хоть миллион символов... Ну и шифруй себе на здоровье... В чём проблема то? Если я не забыл что такое моноалфавитная подстановка, то вот тебе пример. У тебя алфавит 01234567. Нужно заменить на алфавит 76543210.
|
Автор: Defoult 7.10.2007, 21:28 |
это если мы числа шифруем, а мне ведь надо текст на латинице зашифровать... |
Автор: archimed7592 7.10.2007, 21:31 |
Ты понимаешь что весь этот текст должен состоять из букв, которых можно пересчитать по пальцам, ибо у тебя не может быть больше 8-ми различных букв(по условию)? |
Автор: Defoult 7.10.2007, 21:54 | ||
Т.е. по условию у меня просто работа с числами??? А что тогда имел ввиду Kuvaldis???
|
Автор: archimed7592 7.10.2007, 22:11 |
Ты условие знаешь? Ты сам понимаешь что нужно сделать? Я давно с криптоанализом дела не имел... Возможно тебе нужно представить весь текст(с произвольным количеством символов в алфавите) в виде потока бит и каждые 3 бита менять по заданной маске... Если так, то тебе нужно что-то, вроде, того, что имел ввиду Kuvaldis. Ты с задачей для начала определись(сформулируй её получше)... |
Автор: Defoult 7.10.2007, 22:29 |
![]() ctrl+C ctrl+V )) ошибки быть не может, если тока байты из флешки не вылетают ))) в том-то и проблема...что само задание сложности не предстваляет если работать со строкой, в которой 1 буква - 1 байт, а вот эта небольшая оговорочка о 3 битах ввела меня в великий ступор я просто абстрактно не могу представить.....кака я буду шифровать алфавит, когда у меня в распоряжении всего 3 бита на 1 букву |
Автор: archimed7592 7.10.2007, 22:34 | ||||
Продолжение(об определённом правиле) в студию ![]()
IIRC, в моноалфавитной подстановке исходный алфавит имеет такую же мощность, как и целевой. |
Автор: Defoult 7.10.2007, 23:03 |
http://orel-lsr.narod.ru/LAB1/l1_1.html может у меня алфавит шифрования - набор чисел? но опять же числа от 0 до 7 ![]() |
Автор: archimed7592 8.10.2007, 09:35 | ||
Из этой цитаты делаем вывод что у тебя алфавит шифрование имеет такую же мощность, как и нормативный алфавит. В условии у тебя сказано, что длина символа из алфавита - 3 бита. Что это означает? Только то, что алфавит содержит 8 различных символов, пофиг каких. Хочешь набор чисел - пожалста. Хочешь abcdefgh - пожалста. И это отностися как к нормативному алфавиту, так и к алфавиту шифрования. |
Автор: _Michael 8.10.2007, 18:57 | ||
ето я думаю соответствует действительности. и не вижу никакой проблемы с тремя битами. И не плутайте пожалуйста понятие слова символ в общем случае и в криптоанализе. В задании наверное имелось ввиду под словом символ - символ алфавита который имеет размер 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, ты читал описание его алгоритма по ссылке? ![]() |
Автор: _Michael 8.10.2007, 19:03 | ||
оно правильно но в корне неверно для нашего случая. возьмем например числа 13 и 5 остача от деления их на 8 дает число 5. вот ету пятерку например согласно нашему закону подстановки мы заменили на 7 например. Потом при расшифровке ету ж семерку как мы будем знать на что заменять? на 5 или на 13? или ж может на 21? так-что здесь теряется как уже ктото казал взаимная однозначность или соответствие между символами двух алфавитов. Добавлено @ 19:06 Читал и что? ![]() Добавлено @ 07:49 Ето ж самое елементарное что есть в криптографии. Простая моноалфавитная подстановка. |
Автор: archimed7592 8.10.2007, 19:34 | ||
Для вашего - возможно...
Как ты установишь взаимнооднозначное соответствие, если мощность нормативного алфавита 26, а алфавита шифрования - 8? Что же касается условия как такового - там нигде явно не сказано, что нужно шифровать именно английский текст(и, таким образом, дробить его на трёхбитные токены). Там лишь сказано, что мощность алфавита - 8. Зачем выдумывать себе(или кому-либо) задачу? ![]() |
Автор: _Michael 8.10.2007, 19:40 | ||||||
А кто сказал что именно английский алфавит длиной 26 есть нормативный? сказано просто зашифровать алфавитом с длиной символа три биты или както так. значит мы вибираем етот нормативный алфавит также таким самым по размеру. Не надо привязываться к длине 1 байт. ето для нас один символ - 1 байт, там же поток бит которы й мы сами делим по три биты потому что так мы условились и зашифровать нам надо также алфавитом с терхбитовыми символами Добавлено через 3 минуты и 31 секунду
Вот как дословно звучит задание. там не сказано какого именно алфавита. поетому имеется ввиду навероное и того и того. Добавлено через 7 минут и 14 секунд И почему все привязались к одному байту? потому что в С длина типа данных char - 1 байт? а есть еще юникодовские 2 байта. Ето ж просто заблуждение. Не надо плутать символи(char ) в программировании и в криптографии Добавлено через 12 минут и 54 секунды
Вот именно что не указано и потому мы его принимаем за "свой" так сказать текст с длиной символа в три биты. И почему судя по твоих словах из английского текста следует что раз он английский то надо дробить по три биты? именно потому чтоб абстрагироваться от английского кириличного мы принимаем свой алфавит по три бита. Добавлено через 13 минут и 7 секунд ![]() |
Автор: archimed7592 8.10.2007, 20:46 | ||||||||
Будем на бобах гадать что имеется ввиду а что нет? А может быть ещё имеется выводить на экран "кукареку"? Что написано то и имеется ввиду.
Привязался только ты. И топикстартер.
Покажешь мне хоть одно место, не выдранное из контекста, где я предлагаю дробить? Я лишь один раз озвучил предположение о том, что "возможно, задание предполагает дробить" и попросил показать задание. Увидев задание я опроверг это предположение. Ну и напоследок - ты САМ предлагаешь дробить:
Так может быть ты определишься со своими хаотическими мыслями и не будешь тут нести ересь? |
Автор: Defoult 8.10.2007, 21:50 |
Я сегодня уточнил задание..... вобщем так: мы работаем не с самими символами, а с их битами, весь текст мы представляем ввиде последовательности бит 0111011010111010011000100101100011001011100111111 затем разбиваем на группы по 3 бита, т.к. 1 буква - 1 бит (по заданию) если у меня 1 буква может занимать 3 бита, то ключ будет состоять у меня из 8 различных комбинаций этих битов 000 010 100 011 110 это ключ 101 001 111 и по этому ключу мы выполняем перестановку. Вот в принципе суть задания. Всем спасибо ![]() 2archimed7592 и _Michael хотел вам +1 дать, но пока не могу....Как только смогу, соазу вспомню вашу помощь ![]() |
Автор: _Michael 8.10.2007, 22:37 | ||||
archimed7592, Вот из етих твоих "и, таким образом, " выходит что если текст английский, таким образом дробить его на трёхбитные токены. Но ето все по большему счету несуттево(неважно наверное правильнее по русски). Видишь что моя интерпретация( не знаю более подходящего слова чтоб меня правильно поняли) задания оказалась верной. То-есть что действительно надо все подряд писать и разбивать по 3 бита:
Просто у меня тоже лабораторные были по етому и я примерно знаю что надо сделать. ![]() archimed7592, не обижайся, мы ж здесь пробуем помогти разобраться вместе, а не показать кто умнее. в каждого какие-то идеи есть, вот он ими и делится, и вместе мы приходим к какому-то общему знаменателю. ![]() Добавлено @ 22:42 Defoult, когда все задание уже стало ясно, думаю разберешся как по порциях по три бита брать. и подставлять ;) |