Форум по Delphi программированию



Вернуться   Форум по Delphi программированию > Все о Delphi > Программа и интерфейс
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 25.01.2010, 17:03
Аватар для Konrad
Konrad Konrad вне форума
Эксперт
 
Регистрация: 19.03.2009
Сообщения: 1,261
Репутация: 45834
По умолчанию

Скажу одно: жесть прога.

Код:
state:array[1..100, 1..100] of string;
- зачем? когда массив 4х4? Зачем текстовые строки?

Код:
s:=copy(str1, 1, 1);
А это к чему?

Код:
block:='';
      for a:=1 to 4 do
        for b:=1 to 4 do
          block:=block+state[a,b];
      memo1.Lines.Add(block);
А если символы будут непечатные?
Ответить с цитированием
  #17  
Старый 25.01.2010, 17:34
km_ km_ вне форума
Прохожий
 
Регистрация: 12.12.2009
Сообщения: 41
Репутация: 10
По умолчанию

Цитата:
Сообщение от Konrad
Скажу одно: жесть прога.

Код:
state:array[1..100, 1..100] of string;
- зачем? когда массив 4х4? Зачем текстовые строки?
А какие? Char?
Цитата:
Сообщение от Konrad
Код:
s:=copy(str1, 1, 1);
А это к чему?
Что-бы из строки вырезать символ и вставить его в массив.

А вобще правильно первый блок шифрует?
Ответить с цитированием
  #18  
Старый 25.01.2010, 17:43
Аватар для Konrad
Konrad Konrad вне форума
Эксперт
 
Регистрация: 19.03.2009
Сообщения: 1,261
Репутация: 45834
По умолчанию

Цитата:
Сообщение от km_
А вобще правильно первый блок шифрует?
Не понял...
Там же нету в программе шифра.

Или может пропущена процедура?

Это вся программа? Вся программа которая реализует указанное шифрование?

Последний раз редактировалось Konrad, 25.01.2010 в 17:48.
Ответить с цитированием
  #19  
Старый 25.01.2010, 18:00
km_ km_ вне форума
Прохожий
 
Регистрация: 12.12.2009
Сообщения: 41
Репутация: 10
По умолчанию

Это вся программа ECB. Только без функции шифрования.
Допустим наши исходные данные - строка с текстом. Если я правильно понял, то строку запихиваем в массив 4х4 в таком порядке:
|x1 |x5 |x9 |x13|
|x2 |x6 |x10|x14|
|x3 |x7 |x11|x15|
|x4 |x8 |x12|x16|
Дальше разбиваем этот массив в строку такого порядка:
x1x5x9x13x2x6x10x14x3x7x11x15x4x8x12x16. И шифруем этот блок по какой нибудь функции. Все верно?
Не знаешь где можно по подробнее почитать о aes. А то подробнее википедии ничего не нашел.
Ответить с цитированием
  #20  
Старый 25.01.2010, 18:46
Аватар для Konrad
Konrad Konrad вне форума
Эксперт
 
Регистрация: 19.03.2009
Сообщения: 1,261
Репутация: 45834
По умолчанию

Цитата:
Сообщение от km_
Дальше разбиваем этот массив в строку такого порядка:
x1x5x9x13x2x6x10x14x3x7x11x15x4x8x12x16. И шифруем этот блок по какой нибудь функции. Все верно?
Нет.
Все проще х1х2х3х4х5х6х7х8х9х10х11х12х13х14х15х16.

Тоесть:
Текст: 1234567890abcdef
записываеться в массив 4х4:
159c
260d
37ae
48bf
Потом этот масив шифруеться, после чего записываеться скажем в файл.
В начальном порядке.


Цитата:
Сообщение от km_
Не знаешь где можно по подробнее почитать о aes. А то подробнее википедии ничего не нашел.
Та всюду.
В гугле набери.
Описаний полно почти на каждом сайте о криптографии.
Уже даже книгу написали на 160 страниц, полностью о АЕS.

Последний раз редактировалось Konrad, 25.01.2010 в 18:58.
Ответить с цитированием
  #21  
Старый 25.01.2010, 19:53
Аватар для Konrad
Konrad Konrad вне форума
Эксперт
 
Регистрация: 19.03.2009
Сообщения: 1,261
Репутация: 45834
По умолчанию

Кста
Код:
state:array[0..3,0..3] of byte;
(этим съэкономишь памяти в 160000 раз).

и используй файлы.

Последний раз редактировалось Konrad, 25.01.2010 в 22:25.
Ответить с цитированием
  #22  
Старый 26.01.2010, 14:57
km_ km_ вне форума
Прохожий
 
Регистрация: 12.12.2009
Сообщения: 41
Репутация: 10
По умолчанию

Цитата:
Сообщение от Konrad
Потом этот масив шифруеться, после чего записывается скажем в файл.
Как шифруется? По собственной функции или уже раундовые преобразования: SubBytes, ShiftRows и т.д.?

Еще проблема в том, что когда state заполняется второй раз происходит ошибка:

Пробую отчищать
Код:
for a:=1 to 4 do
     for b:=1 to 4 do
     state[a, b]:='';
но это не помогает. Может дело не в этом?
Ответить с цитированием
  #23  
Старый 26.01.2010, 16:15
Аватар для Konrad
Konrad Konrad вне форума
Эксперт
 
Регистрация: 19.03.2009
Сообщения: 1,261
Репутация: 45834
По умолчанию

Функциями SubBytes, ShiftRows и т.д.

Если ты пишешь
state[a, b]:='';
значит state у тебя тип string?
Я же наприсал: используй byte, и забудь о string, string нужен только когда будешь получать пасс или вводить данные с клавы, но не в шифpoвании!

П.с.: ошибку выдает в той программе. текст которой ты привел?
Та программа сплошная ошибка. Её все равно придеться переписывать.
Ответить с цитированием
  #24  
Старый 26.01.2010, 16:34
km_ km_ вне форума
Прохожий
 
Регистрация: 12.12.2009
Сообщения: 41
Репутация: 10
По умолчанию

Цитата:
Сообщение от Konrad
П.с.: ошибку выдает в той программе. текст которой ты привел?
Та программа сплошная ошибка. Её все равно придеться переписывать.
Нет, в новой.
Код:
procedure TForm1.Button1Click(Sender: TObject);
var str, podstr, s:string; t, f, i, a, b, j:byte;
state:array[1..4,1..4] of byte;
begin
a:=0; b:=1;
str:=edit1.text;
t:=length(str) mod 16; 
f:=length(str) div 16; 
if t<>0 then
  for i:=1 to 16*(f+1)-length(str) do //заполняем недостающие байты нулями
  str:=str+'0'
  else f:=f-1;
for i:=1 to f+1 do //отделяем блоки
  begin
    podstr:=copy(str, 1, 16);
    delete(str, 1, 16);
    for j:=1 to 16 do  
      begin
        s:=copy(podstr, 1, 1); //отделяем символы
        delete(podstr, 1, 1);
        a:=a+1;
        state[a, b]:=strtoint(s); 
        if a=4 then
          begin
            a:=0;
            b:=b+1;
          end;
      end;
  end;
end;
Эта вроде пограмотнее). Правда, запись в файл еще не написал.
Поменял string на byte. Но теперь после ввода текста появляется ошибка

Последний раз редактировалось km_, 26.01.2010 в 16:42.
Ответить с цитированием
  #25  
Старый 26.01.2010, 16:47
Аватар для Konrad
Konrad Konrad вне форума
Эксперт
 
Регистрация: 19.03.2009
Сообщения: 1,261
Репутация: 45834
По умолчанию

Уже лучше, но
вот этот бред
Код:
for j:=1 to 16 do  
      begin
        s:=copy(podstr, 1, 1); //отделяем символы
        delete(podstr, 1, 1);
        a:=a+1;
        state[a, b]:=strtoint(s); 
        if a=4 then
          begin
            a:=0;
            b:=b+1;
          end;
      end;
лучше переписать так:
Код:
for a:=1 to 4 do 
for b:=1 to 4 do 
state[a, b]:=ord(podstr[(a-1)*4+b]);
И ненадо придумывать велосипед.
Правда код, который я привел в качестве примера, можно оптимизировать и он будет работать еще быстрее.
Но для учебных целей и так сойдет.

Последний раз редактировалось Konrad, 26.01.2010 в 17:20.
Ответить с цитированием
  #26  
Старый 26.01.2010, 20:05
km_ km_ вне форума
Прохожий
 
Регистрация: 12.12.2009
Сообщения: 41
Репутация: 10
По умолчанию

Теперь пытаюсь реализовать SubBytes.
Сложение и умножение вроде понял. Теперь же надо написать их функции? И что за таблица замен 8х256? Элементы поля GF{2^8} - x^7, x^6,..., x, 1? Они не изменяются?
Ответить с цитированием
  #27  
Старый 26.01.2010, 20:25
Аватар для Konrad
Konrad Konrad вне форума
Эксперт
 
Регистрация: 19.03.2009
Сообщения: 1,261
Репутация: 45834
По умолчанию

Цитата:
Сообщение от km_
Теперь пытаюсь реализовать SubBytes.
Сложение и умножение вроде понял. Теперь же надо написать их функции? И что за таблица замен 8х256? Элементы поля GF{2^8} - x^7, x^6,..., x, 1? Они не изменяются?

Там применяеться умножение в поле Галуа:
http://ru.wikipedia.org/wiki/Конечное_поле

С помощью этого поля и получаем таблицу замен.

Эти поля используються практически во всех функциях алгоритма.

По сути использование конечного поля есть особенностью АЕS.( как и ряда других алгоритмов).

Последний раз редактировалось Konrad, 26.01.2010 в 20:28.
Ответить с цитированием
  #28  
Старый 27.01.2010, 00:56
km_ km_ вне форума
Прохожий
 
Регистрация: 12.12.2009
Сообщения: 41
Репутация: 10
По умолчанию

Цитата:
Сообщение от Из книги
Алгоритм оперирует байтами, которые рассматриваются как элементы конечного поля GF{2^8}
Значит в поле 256 элементов. А если у нас меньше элементов? Тоже нулями заполнять?
Таблица замен это и есть s-блок? Никак ни могу понять как заполняется s-блок.
Ответить с цитированием
  #29  
Старый 27.01.2010, 09:06
Аватар для Konrad
Konrad Konrad вне форума
Эксперт
 
Регистрация: 19.03.2009
Сообщения: 1,261
Репутация: 45834
По умолчанию

Там таблица, состоящая из 256 элементов.
Она заполняеться по определенному правилу с помощью операций в поле Галуа, а потом используеться при шифpoвании.Нулевой элемент там 1-н.

Последний раз редактировалось Konrad, 27.01.2010 в 09:40.
Ответить с цитированием
  #30  
Старый 27.01.2010, 15:44
km_ km_ вне форума
Прохожий
 
Регистрация: 12.12.2009
Сообщения: 41
Репутация: 10
По умолчанию

После того, как мы заполнили state идут раундовые преобразования или сначало AddRoundKey?
В KeyExpansion используются массивы Rcon[] и w[]. Rcon[] - массив битов 32-ух разрядных слов. Т.е. Rcon[] состоит из слов представленных в двоичном виде? Rcon[] и w[] берут слова со state?
Konrad, объясни пожалуйста, как можно более подробно, работу AddRounKey. Сразу скажу, что уже перечитал массу литературы=)

ПС Названия массивов я взял из википедии.

Последний раз редактировалось km_, 27.01.2010 в 16:04.
Ответить с цитированием
Ответ



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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:46.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2021

ВКонтакте   Facebook   Twitter   Ссылка на Telegram