Захотелось мне как то написать программу, шифрующую файлы. Пишу код:
#include #include using namespace std; inline unsigned char uncode ( char ); int main(int argc, char** argv) < setlocale ( 0, «Russian» ); ifstream filein; fstream fileout; cout cout else < cout > else < cout cout inline unsigned char uncode ( char chr )
программа компилируется и запускается нормально. Но вот работает не очень. В выходном файле всегда в конец добавляется «x», что, минимум, нежелательно.
Пытался исправить такой конструкцией:
но теперь в конец добавляется ещё и «я». Есть у вас какие-нибудь мысли по поводу этой ошибки?
P.S.: Вопрос в догонку, раз у создал тему на форуме. Каким образом получается совмещать флаги с помощью | при задании режимов открытия фалов( то же самое у функции MessageBox из Win32Api )?
Что бы избавиться от бага, основной цикл твоей программы может выглядеть так:
. но лучше всего так:
Дело в том, что метод eof() не проверяет файл на окончание, а просто констатирует факт, что конец файла уже достигнут. А само обнаружение конца файла происходит при операции чтения, т.е. при вызове метода read() . Поэтому последний считанный символ, при чтении которого установился флаг конца файла, надо обрабатывать как символ конца файла (в данном случае его надо игнорировать).
Дешифратор, коротко и понятно! [Электроника для начинающих] DIY, Микросхема
В последнем варианте кода используется тот факт, что метод read() возвращает this*, т.е. сам поток. А поток в контексте логического выражения преобразуется в true, если с потоком всё в порядке, и в false** в противном случае (в т.ч. и при EOF). Следовательно при достижении конца файла, считанный символ уже не попадёт в тело цикла.
Чисто технически не понравились два момента. Первый:
для выходного файла флаг ios::in явно лишний.
Я бы всё-таки обозначил размер буфера через именованную константу. Вдруг потом захочется читать не по одному символу?
В логике программы не понравилась организация открытия/закрытия файлов. Например, если входной файл не существует, то всё равно будет запрошено имя выходного файла и, мало того, выходной файл будет создан. Пусть и нулевой длины. Попробуй сам исправить логику работы программы.
Оператор | — это оператор побитового ИЛИ. Читай в книжке про битовые операции. Короткое описание есть в Википедии.
Источник: code-live.ru
Как можно из шифратора сделать дешифратор и как лучше записать ключ?
Нужно разобраться, как работает шифратор и написать код, который будет выполнять обратную работу — дешифровать.
Что именно у вас не получается?
Ответ написан более двух лет назад
Я решил написать шифратор по спирали, ну по спирали я уже заполнял массив, поэтому знаю, что к чему там, я так понимаю, для дешифратора нужен ключ, вот я и не совсем понимаю, из чего он должен состоять
Шифраторы, дешифраторы. Назначение, принцип работы, типовые схемы.
Ваш ответ на вопрос
Войдите, чтобы написать ответ
- Assembler
- +1 ещё
Как это работает?
- 1 подписчик
- 07 июл.
- 69 просмотров
Источник: qna.habr.com
шифратор и дешифратор шифра Виженера [закрыт]
Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы он был сосредоточен только на одной проблеме.
Закрыт 5 лет назад .
Помогите,пожалуйста,необходимо написать программу шифратора и дешифратора с ключом с помощью квадрата Виженера. Я не понимаю как это сделать((
Отслеживать
задан 30 апр 2018 в 11:50
29 1 1 серебряный знак 1 1 бронзовый знак
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Люблю этим заниматься, по этому, так уж и быть, написал примерчик:
final class Vigenener < private final int bias, letters; public Vigenener(final int bias, final int letters) < this.bias = bias; this.letters = letters; >public String encrypt(final String text, final String key) < String encrypt = «»; final int keyLen = key.length(); for (int i = 0, len = text.length(); i < len; i++) < encrypt += (char) (((text.charAt(i) + key.charAt(i % keyLen) — 2 * this.bias) % this.letters) + this.bias); >return encrypt; > public String decrypt(final String cipher, final String key) < String decrypt = «»; final int keyLen = key.length(); for (int i = 0, len = cipher.length(); i < len; i++) < decrypt += (char) (((cipher.charAt(i) — key.charAt(i % keyLen) + this.letters) % this.letters) + this.bias); >return decrypt; > >
А теперь разберемся, что происходит:
Все конечно же зависит от алфавита, которым будем использовать и какой текст будем шифровать — ключ которым будем шифровать также зависит от алфавита, за исключением некоторых (мы не можем использовать русские ключи, при шифре английского алфавита, но зато можем использовать английские ключи при шифровании русской строки).
Каждая первая буква алфавита, есть смещение.
Я приведу примеры только 2х-алфавитов русский и английский.
Русский:
final String key = «ру»; final Vigenener v = new Vigenener(1072, 33); String enc = v.encrypt(«русский», key); System.out.println(enc); // ѐеагъыщ String dec = v.decrypt(enc, key); System.out.println(dec); // русский
В конструкторе класса Vigenener первым аргументом 1072 — это смещение по первому символу алфавита, вторым аргументом 33 передается количество букв алфавита.
Дальше следует метод шифрования encrypt — первым аргументом передается текст который будем шифровать, а вторым аргументом, передается ключ, которым будем шифровать — этот ключ понадобится для расшифровки ранее зашифрованного текста.
Английский:
final String key = «en»; Vigenener v = new Vigenener(97, 26); final String enc = v.encrypt(«english», key); System.out.println(enc); // iakymfl String dec = v.decrypt(enc, key); System.out.println(dec); // english
Также все аналогично, что описано выше.
Как узнать нужное смещение, просто приведите первую букву алфавита к целочисленному типу в одинарных кавычках ‘ — так-как в Java двойные » кавычки = строка, а строку нельзя приводить к целочисленному типу, а символьный тип можно:
Английский (количество букв = 26):
System.out.println((int)’a’); // 97
Русский (количество букв = 33):
System.out.println((int)’а’); // 1072
Источник: ru.stackoverflow.com