Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Шифрование текста алгоритмом Цезаря (на С), Не могу свпомнить 2 функции 
:(
    Опции темы
GriGor1Z
  Дата 8.8.2006, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 8.8.2006

Репутация: нет
Всего: нет



Вообщем, надо написать программу шифрования и дешифровки текстового файла по аглоритму Цезаря ( сдвиг буквы на несколько позиций.

Вообщем планирую делать так. Хочу взять текстовый файл, брать из него по символу. Получить код-ANSII этого символа, потом сдвинуть этот символ на 5 (ключ) и потом снова по коду востановить полученый символ и записывать в другой файл.

Я не могу вспомнить 2 функции в С. (лето...., просто вылетело из головы) Функции получения кода симола и востановления симола по его коду. Программировать буду на TC3 (пока нет Студии еще smile )

И еще, есть ли какие-то ошибки в моих действия по шифрованию?
PM MAIL   Вверх
Mayk
Дата 8.8.2006, 19:58 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(GriGor1Z @  8.8.2006,  23:52 Найти цитируемый пост)
Функции получения кода симола и востановления симола по его коду.

Нету таких в си. В си символ суть код символа и наоборот.
Код

char c = 'a' + 5;
printf("%c\n", c);



--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
En_t_end
Дата 9.8.2006, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 1
Всего: 20



GriGor1Z
Цитата(GriGor1Z @  8.8.2006,  23:52 Найти цитируемый пост)
Вообщем, надо написать программу шифрования и дешифровки текстового файла по аглоритму Цезаря ( сдвиг буквы на несколько позиций.

Кстати, имхо, можно применить циклический "реальный"(битовый) сдвиг, на n-битов, заданных ключем. Стоийкость практически такая же как у выше написанного алгоритма, только вот жать можно не только текстовые файлы и выглядет лучше. PS Ключ имеет реальное ограничение 0 до 7.
PM MAIL ICQ Skype GTalk Jabber   Вверх
MAKCim
Дата 9.8.2006, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата

только вот жать можно не только текстовые файлы

и этим способом можно


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
pablo
Дата 9.8.2006, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 12.2.2005
Где: Вильнюс, Литва

Репутация: 4
Всего: 6



О какой компресии идёт собственно речь ? Ведь колличество данных не меняется. Насколько я помню Rot 3 (шифр цезаря) ничего не сжимает. Это же простой шифр с перестановкой. Код на Python,
Код

#!/usr/bin/env python
# -*- coding: iso-8859-13 -*-
"""
Rot13 ЕЎifras
"""
import sys


class Rot13:
    """Rot13 encoderis"""

    output = sys.stdout
    open = open
    args = sys.argv
    #stdin = sys.stdin

    def __init__(self):
        self.table = {}
        for code in (range(ord('A'), ord('M') + 1) +
                     range(ord('a'), ord('m') + 1)):
            self.table[chr(code)] = chr(code + 13)

        for code in (range(ord('N'), ord('Z') + 1) +
                     range(ord('n'), ord('z') + 1)):
            self.table[chr(code)] = chr(code - 13)

    def encodeChar(self, input):
        """Transponuoja vienД… simbolДЇ"""
        if input in self.table:
            return self.table[input]
        else:
            return input

    def encode(self, input):
        """Transponuoja stringД…"""
        result = []
        for ch in input:
            result.append(self.encodeChar(ch))
        return ''.join(result)

    def run(self):
        if len(self.args) > 1:
            for name in self.args[1:]:
                f = self.open(name)
                print >> self.output, \
                      self.encode(f.read()),
        else:
            print >> self.output, \
                  self.encode(sys.stdin.read()),

if __name__ == '__main__':
    Rot13().run()

 на С++ перевести думаю не составит проблем.



--------------------
Первый блин всегда похож на сферу, иногда бывает и куб.
PM MAIL ICQ   Вверх
MAKCim
Дата 9.8.2006, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата

О какой компресии идёт собственно речь ? Ведь колличество данных не меняется.

может человек описАлся
естественно речь идет не о сжатии


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
bel_nikita
Дата 9.8.2006, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



GriGor1Z
Нужно понять, что такое указатель и базовые принципы работы с ним.
Код

void code(const char* pSource, char* pOut)
{
  while( *pSource )
    *pOut++ = *pSource++ + 5; 
}

void decode(const char* pSource, char* pOut)
{
  while( *pSource )
    *pOut++ = *pSource++ - 5; 
}


int main(int argc, char *argv[ ], char *envp[ ])
{
  const char* pSource = "This string will be coding by Cesar";

  char Coded[512] = {0};  // закодированые данные
  char DeCoded[512] = {0};  // декодированиые данные

  code(pSource,Coded);
  decode(Coded,DeCoded);
  printf(pSource);
  printf(Coded);
  printf(DeCoded);
}



--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
MAKCim
Дата 9.8.2006, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



вот с использованием STL
Код

#include <iterator>
#include <fstream>
#include <iostream>
    
template<class Iter, class Res>
    void code(Iter beg, Iter end, Res res, int Key)
{
    while (beg!=end) *res++=*beg++ + Key;
}

int main(int argc, char* argv[])
{
    std::fstream ifs(argv[1],std::ios_base::in), 
        ofs(argv[2],std::ios_base::out);
    std::istreambuf_iterator<char> i_begin(ifs);
    std::ostreambuf_iterator<char> o_begin(ofs);
    code(i_begin,std::istreambuf_iterator<char>(),o_begin,5);
    return 0;
}



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
En_t_end
Дата 9.8.2006, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 1
Всего: 20



Цитата(MAKCim @  9.8.2006,  13:48 Найти цитируемый пост)
и этим способом можно

Хмм... а если исходный символ будет 255-ым в таблице ASCII ? Переполнение... и не однозначное воспроизведение его потом при дешифровке.
Цитата(MAKCim @  9.8.2006,  16:21 Найти цитируемый пост)
может человек описАлся
естественно речь идет не о сжатии

Естественно...
Цитата(En_t_end @  9.8.2006,  13:23 Найти цитируемый пост)
 Стоийкость практически такая же как у выше написанного алгоритма,

Здесь подразумевается криптостойкость, которая не может быть свойством алгоритмов сжатия информации... Извините.

Добавлено @ 14:25 
Кстати... сложение двух целых программно медленне, чем битовый сдвиг.
PM MAIL ICQ Skype GTalk Jabber   Вверх
bel_nikita
Дата 9.8.2006, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Цитата(En_t_end @ 9.8.2006,  13:11)
Цитата(MAKCim @  9.8.2006,  13:48 Найти цитируемый пост)
и этим способом можно

Хмм... а если исходный символ будет 255-ым в таблице ASCII ? Переполнение... и не однозначное воспроизведение его потом при дешифровке.

Ничего не будет smile Вроде, 255-го символа в ASCII не существует.
Для char'а соответсвует: х + 5 == х - 5. И если вместо Х подставить 255, то будет соответсвие 255 + 5 == 255 - 5


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
En_t_end
Дата 9.8.2006, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 1
Всего: 20



Цитата(bel_nikita @  9.8.2006,  18:28 Найти цитируемый пост)
Вроде, 255-го символа в ASCII не существует.

0xFF, 0FFh.
ИМХО в бинарниках точно имеется.
Цитата(bel_nikita @  9.8.2006,  18:28 Найти цитируемый пост)
то будет соответсвие 255 + 5 == 255 - 5

Да это, то понятно, просто я сначало было подумал о битовом переполнении, но потом понял, что оно ни коем образом не мешает при обратной дешифровке.

PM MAIL ICQ Skype GTalk Jabber   Вверх
Mayk
Дата 9.8.2006, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(bel_nikita @  9.8.2006,  18:28 Найти цитируемый пост)
 Вроде, 255-го символа в ASCII не существует.

В кои-8р это "ъ" кстати. А в cp1251 это "я". 
А так как ascii-8 8 битная, то 255-ого символа в ней не может не существовать.

Это сообщение отредактировал(а) Mayk - 9.8.2006, 15:53


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
GriGor1Z
Дата 9.8.2006, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 8.8.2006

Репутация: нет
Всего: нет



Есть еще пару вопросов.

С помощью этого алгоритма можно шифровать графические файлы? Если да, то как. Там же как я пониаю нет символов, там пиксели. как быть с ними?
PM MAIL   Вверх
MAKCim
Дата 9.8.2006, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата

С помощью этого алгоритма можно шифровать графические файлы? Если да, то как. Там же как я пониаю нет символов, там пиксели. как быть с ними? 

любой файл - последовательность байт на диске
любой байт - число от 0 до 255
соответственно для шифровки
открываешь файл в бинарном виде
читаешь по байту и прибавляешь к нему ключ циклически (т е если байт равер 254, а ключ 10, то новым значением станет 8)


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
GriGor1Z
Дата 11.8.2006, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 8.8.2006

Репутация: нет
Всего: нет



Сделал программу почти, есть попросо как праспознать символы конца строки, перехода на новыю строку и т.д
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1057 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.