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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.07.2011, 03:46   #1
Ghost of Night
Форумчанин
 
Аватар для Ghost of Night
 
Регистрация: 08.08.2010
Сообщений: 371
Вопрос Операция циклического сдвига

Здравствуйте. в описании алгоритма шифрования Camellia, есть функция типа:
Код:
var
 R,L: LongWord;
begin
 R := R xor ((L and key)<<< 1)
<<< - операция циклического сдвига влево.

Как выполнить эту операцию? Когда стоит << то выполняется shl. А здесь как я понимаю нужно циклически выполнить shl?
Хакинг - не преступление, а способ выживания.
Ghost of Night вне форума Ответить с цитированием
Старый 07.07.2011, 08:13   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Не знаю есть ли в ЯВУ такая фича, потому я бы под асм переписал:
Код:
__asm{
 mov eax,[l]
 and eax,[key]
 rol eax,1
 xor eax,[r]
 mov [r],eax
}
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.07.2011, 08:34   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну, либо воспользоваться ASM вставкой,
либо банально в выражении сделать логическое ИЛИ в выталкиваемым старшим разрядом.
это можно записать так:
циклический двоичный сдвиг переменной P:
Код:
 P := (P shl 1 ) or (P shr (sizeof(P)*8-1));
для вашего примера я бы записал так:
Код:
.....
var TempL : LongWord;
begin
  TempL := (L and key);
  R := R xor ( (TempL shl 1) or (TempL shr (sizeof(TempL)*8-1)));
p.s. разумеется, можно обойтись и без введения дополнительной переменной - просто так выражение наглядней...
ну и, конечно, для LongWord вместо TempL shr (sizeof(TempL)*8-1) можно написать сразу TempL shr 31



ДОБАВЛЕНО

АААА! Stilet меня опередил!
согласен. на ассемблере это выглядит красиво и наверняка будет эффективно!

только в Delphi обрамление чуток другое:
Код:
asm
 mov eax,[l]
 and eax,[key]
 rol eax,1
 xor eax,[r]
 mov [r],eax
end;

Последний раз редактировалось Serge_Bliznykov; 07.07.2011 в 08:42.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.07.2011, 08:51   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Вупс... Это не си?
Мне простительно, я с будуна
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.07.2011, 10:51   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Вупс... Это не си?
не-а!
Но, тем не менее, Ваш код в Delphi работает отлично!


[OFFTOP]
Цитата:
Мне простительно, я с будуна
сочувствую... лечитесь и выздоравливайте!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.07.2011, 00:44   #6
Ghost of Night
Форумчанин
 
Аватар для Ghost of Night
 
Регистрация: 08.08.2010
Сообщений: 371
По умолчанию

Serge_Bliznykov Спасибо за ответ, меня ещё интересует вот, что. Тот код который на делфи и тот который на асме, выдают разныё результат при одинаковых условиях.
Код:
var
TempL,R,L,Key : LongWord;
begin
 Key := 34567893;
 L := 23465648;
 TempL := (L and key);
 R := R xor ( (TempL shl 1) or (TempL shr (sizeof(TempL)*8-1)));
//R = 10031888
...
var
TempL,R,L,Key : LongWord;
begin
 Key := 34567893;
 L := 23465648;
 asm
  mov eax,[l]
  and eax,[key]
  rol eax,1
  xor eax,[r]
  mov [r],eax
 end;
//R = 5037388
Хакинг - не преступление, а способ выживания.
Ghost of Night вне форума Ответить с цитированием
Старый 12.07.2011, 09:14   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Ghost of Night, шутить изволите?!
Цитата:
Код:
R := R xor ( (TempL shl 1) or (TempL shr (sizeof(TempL)*8-1)));
а кто значение переменной R будет задавать?!!


при R:=0;
получаем 789792
и в первом и во втором случае...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.07.2011, 00:12   #8
Ghost of Night
Форумчанин
 
Аватар для Ghost of Night
 
Регистрация: 08.08.2010
Сообщений: 371
По умолчанию

Искренне извиняюсь, не обратил внимание. Спасибо.
Хакинг - не преступление, а способ выживания.
Ghost of Night вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
реализация циклического алгоритма С++ tracer Помощь студентам 5 12.05.2011 20:15
Тело сдвига Abur Фриланс 2 08.01.2011 19:11
операции сдвига ssvd Общие вопросы C/C++ 2 04.11.2009 08:13
Шифрование методом сдвига Paul Hindenburg Общие вопросы Delphi 5 24.01.2008 08:30
Операция сдвига? SkyDreamer Общие вопросы C/C++ 3 10.10.2007 08:20