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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.07.2011, 00:15   #1
Hottabych
Форумчанин
 
Регистрация: 13.01.2008
Сообщений: 140
По умолчанию Скорость реализации rc6

Всем доброго времени суток!
Реализовал шифрование блока rc6 по спецификации. Так, чисто абстрактная реализация.
Код:
t1 := GetTickCount;
  for i := 0 to bl_cnt do
    begin
      testRgs[0] := Random(mv);
      testRgs[1] := Random(mv);
      testRgs[2] := Random(mv);
      testRgs[3] := Random(mv);
      EncryptBlock(testRgs);
    end;
  t2 := GetTickCount;
...
procedure EncryptBlock(var Rgs: TRegisters); //зашифровать блок длиною 128 бит
var
i: integer;
t,u: Longword;
buf: LongWord;
begin
  Rgs[1] := Rgs[1] + S[0];
  Rgs[3] := Rgs[3] + S[1];
  for i := 1 to R do
    begin
      t := ROL((Rgs[1] * (2*Rgs[1] + 1)), lgw);
      u := ROL((Rgs[3] * (2*Rgs[3] + 1)), lgw);
      Rgs[0] := ROL((Rgs[0] xor t), u) + S[2*i];
      Rgs[2] := ROL((Rgs[2] xor u), t) + S[2*i + 1];

      buf := Rgs[0];
      Rgs[0] := Rgs[1];
      Rgs[1] := Rgs[2];
      Rgs[2] := Rgs[3];
      Rgs[3] := buf;
    end;
  Rgs[0] := Rgs[0] + S[2*R+2];
  Rgs[2] := Rgs[2] + S[2*R+3];
end;
Скорость получилась 63,4 Mbytes/sec. Мне кажется, должно быть быстрее и намного. Прошу развеять мои сомнения.

Последний раз редактировалось Hottabych; 19.07.2011 в 00:30.
Hottabych вне форума Ответить с цитированием
Старый 19.07.2011, 07:02   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,833
По умолчанию

Попробуйте не двигать массив каждый раз, а использовать доп. индекс для 0-го элемента
p51x вне форума Ответить с цитированием
Старый 19.07.2011, 10:02   #3
Hottabych
Форумчанин
 
Регистрация: 13.01.2008
Сообщений: 140
По умолчанию

Имеется ввиду этот участок?
Код:
buf := Rgs[0];
      Rgs[0] := Rgs[1];
      Rgs[1] := Rgs[2];
      Rgs[2] := Rgs[3];
      Rgs[3] := buf;
Hottabych вне форума Ответить с цитированием
Старый 19.07.2011, 12:31   #4
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Цитата:
63,4 Mbytes/sec
Как в том анекдоте, "вы чем меряли?" GetTickCount даёт результат в попугаях. Попадалась реализация со скоростью работы около 150 Мб/с, 63 маловато, это не скорость дискового I/O случайно?

buf можно выкинуть и менять местами Rgs[3] с Rgs[0] тремя xor, не думаю что даст большой прирост
пыщь
JTG вне форума Ответить с цитированием
Старый 19.07.2011, 12:36   #5
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> результат в попугаях

а учитывая, что на каждые 128 бит 4 раза вызывается Random(), то о точных замерах скорости вобще можно забыть.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 19.07.2011, 17:00   #6
Hottabych
Форумчанин
 
Регистрация: 13.01.2008
Сообщений: 140
По умолчанию

Random вызывается "для нагрузки" (хотя фиг его знает зачем я это вставил)... Если не ошибаюсь, без рандома время на шифровку такого же кол-ва блоков уменьшается на 200ms.

Кстати, есть ли разница во времени доступа к элементу статического массива и динамического?

А 150 Мбайт/сек - это шифровка файлового потока, памяти или тупо нулей?

При дисковом i/o (чтении файлового потока по 128 бит) скорость вообще никакая, что, собственно, логично...
Задача: передавать потоковое видео(данные), предварительно его шифруя... В идеале, запас скорости шифровки должен быть 1 Gbit/сек. Судя по википедии:
Цитата:
С 20 раундами на блок время шифрования приблизительно равно 100 наносекунд для каждого блока, обеспечивая предполагаемую скорость передачи данных приблизительно 1.3 Гбит/сек.
Такое возможно...
Updated:
за 100 нс проц делает ~303 такта (-x тактов уходит на ось), как думаете, этого достаточно для обработки 1 блока?

Последний раз редактировалось Hottabych; 19.07.2011 в 17:25.
Hottabych вне форума Ответить с цитированием
Старый 19.07.2011, 23:23   #7
Hottabych
Форумчанин
 
Регистрация: 13.01.2008
Сообщений: 140
По умолчанию

Без рандомов - 80 мбайт/сек.
Итого - 0,67 Гбит/сек
На 1 блок - 190 нс общего времени (в попугаях)). На проце Intel Core 2 Duo E8400...
Теоретически, на обработку 1 блока с 20 раундами уходит 1141 инструкций ассемблера (вышеприведенный код). Отсюда, вывод: при обработке 4 инструкций за такт, проц 3 ГГц шифрует со скоростью 1,36 Гбит/сек, но это теоретически...

Есть еще идеи как можно ускорить шифрование?
Думаю, последнее, что можно применить для оптимизации теперь уже в практической реализации - это распараллеливание задачи.
Hottabych вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
RC6 на 32 битной платформе. Ghost of Night Общие вопросы Delphi 0 02.07.2011 01:14
Скорость рисования и остальная скорость ZotaC Gamedev - cоздание игр: Unity, OpenGL, DirectX 121 13.11.2010 22:51
Алгоритм RC6 taginice Общие вопросы C/C++ 1 14.09.2010 21:03
RC6 Anenya.K Софт 5 05.03.2010 21:42
Шифрование RC6 Suicidecat Фриланс 7 06.06.2009 08:46