Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.05.2013, 02:48   #1
ekscalibur
Новичок
Джуниор
 
Регистрация: 22.05.2013
Сообщений: 2
По умолчанию Гаммирование с обратной связью

Нужна помощь ребят. Я не програмист и С++ учил только самые основы, но в универе по предмету криптологии напрягли с прогой...
Нужна хоть какая то элементарная программа для шифрования гаммированием с обратной связью, что бы могла зашифровать хоть несколько букв. Может кому не сложно подкинуть что-то такое, буду очень благодарен.
ekscalibur вне форума Ответить с цитированием
Старый 22.05.2013, 10:26   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Нужна хоть какая то элементарная программа для шифрования гаммированием с обратной связью, что бы могла зашифровать хоть несколько букв. Может кому не сложно подкинуть что-то такое, буду очень благодарен.
Можете привести аналитическую функцию? Пусть входная последовательность есть X1, X2, ..., Xn, ...; ключ есть K, тогда выходная последовательность Y1, Y2, ..., Yn, ... есть?..
Abstraction вне форума Ответить с цитированием
Старый 22.05.2013, 21:48   #3
ekscalibur
Новичок
Джуниор
 
Регистрация: 22.05.2013
Сообщений: 2
По умолчанию

Для генерации гаммы() используется формула T(i+1)=(A*i+C) mod M.
A,C - константы(целые числа < M )
T0-начальное значение

К примеру есть заданный алфавит:
A B C D E F G H - знаки открытого текста
0 1 2 3 4 5 6 7 - номер(код)
000 001 010 011 100 101 110 111 - (двоичный код)

Нам нужно зашифровать текст ABC

Генерируем число за формулой:
A=5, C=3, T0=7, M=8 (длина алфавита)

T1=(5*7+3)mod 8 = 6 (011)

Тоесть на букву А (000) мы будем накладывать T1 (011).

T2 формируется теперь за такой же формулой и с теми же значениями, но вместо T0 должно выбираться другое значение которое формируется из предыдущей буквы (она у нас А): будем подсчитывать единицы в двоичном коде. Тоесть для буквы А код 000. Значит для генерации T2 используем значение T0=0.

T2=(5*0+3)mod 8 = 3 (010)

Для T3 берем Т0 из буквы В (001), T0=1.

T3=(5*1+3)mod 8 = 0 (000).

В итоге имеем начальный текст АВС 000001010
накладываем на него гамму T1T2T3 011010000
и делаем сложение по модулю 2
000001010
011010000
--------------
011011010 = DDC
ekscalibur вне форума Ответить с цитированием
Старый 23.05.2013, 00:09   #4
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Первый фокус: превращение буквы в число.
Код:
const int M = 8;
const char* alphabet = "ABCDEFGH";

int LetterToCode(char letter){
  for(int i=0; i<M; ++i) if(alphabet[i] == letter) return i;
  return M;
}
Второй фокус: превращение числа в букву.
Код:
char CodeToLetter(int letterCode){
  return alphabet[letterCode];
}
Третий фокус: "подсчёт единиц в двоичном коде" (не уверен, зачем это надо делать так, ибо убивает шифр на корню, ну да ладно).
Код:
int NumberOf1(int x){
  static const int ones[] = {0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4};
  //Это на случай больших x, при вашем алфавите достаточно return ones[x];
  int ret = 0;
  while(x!=0) {ret+=ones[x&0xF]; x>>=4;}
  return ret;
}
А теперь - гамма.
Код:
void EncodeString(char* str, int A, int C, int T0){
  int seed = T0, T;
  for(size_t i = 0; i<strlen(str); ++i){
    T = (A * seed + C) % M; //Ваша формула?..
    //Ваше изменение зерна гаммы
    seed = NumberOf1( LetterToCode(str[i]) );
    //Теперь наложить... только нужно превратить букву в число и обратно
    str[i] = CodeToLetter( LetterToCode(str[i]) ^ T );
  } 
}
Расшифровывание напишите сами. В Вашем случае оно не вполне тождественно зашифровыванию, хотя отличается слабо.
Abstraction вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема со связью TCPclient и TCPserver Siemka Работа с сетью в Delphi 1 09.03.2013 23:26
Проблемка со связью Gul'ka Microsoft Office Access 0 29.11.2011 16:16
гаммирование fascination Помощь студентам 0 16.06.2010 19:43
Вопрос с формой и связью таблиц Broodstar Microsoft Office Access 2 13.11.2008 17:01
Гаммирование Killer_66 Общие вопросы C/C++ 1 08.12.2007 12:54