Форум сайта python.su
0
Доброго времени суток всем.
У меня возникла проблема, надеюсь кто-нибудь поможет её решить.
В академических целях (самообучение) я решил реализовать алгоритм шифрования RC5. Не могу реализовать операции “>>> <<<” циклического побитового сдвига. Эта операция выполняется во время перемешивания словарных ключей и во время собственно шифрования/дешифрования.
Перед тем как спросить тут я пытался найти реализацию этого алгоритма на чистом Питоне, а также реализацию циклических сдвигов в других языках. Натыкался на информацию, что реализация циклического побитового сдвига на Питоне будет отличаться от других реализаций из-за отсутствия целочисленного переполнения. В подтверждении этому я переписал несколько примеров с С и С++, но все они либо работали с ошибками, либо вообще не работали. Например:
Си.
unsigned long __cdecl _lrotl (
unsigned long val,
int shift
)
{
shift &= 0x1f;
val = (val>>(0x20 - shift)) | (val << shift);
return val;
}
int a;
a = 0x12345678;
int shift = 8; // сдвиг в битах
a = (a>>(32 - shift)) | a << 8;// цикло сдвиг влево на 8 бит
System.out.println(Integer.toHexString(a));
a = 0x12345678;
a = a>>(shift) | (a << (32 - shift));// цикло сдвиг вправо на 8 бит
System.out.println(Integer.toHexString(a));
int rol(int a, int n)
{
int t1, t2;
n = n % (sizeof(a)*8); // нормализуем n
t1 = a << n; // двигаем а вправо на n бит, теряя старшие биты
t2 = a >> (sizeof(a)*8 - n); // перегоняем старшие биты в младшие
return t1 | t2; // объединяем старшие и младшие биты
}
int ror(int a, int n)
{
int t1, t2;
n = n % (sizeof(a)*8); // нормализуем n
t1 = a >> n; // двигаем а влево на n бит, теряя младшие биты
t2 = a << (sizeof(a)*8 - n); // перегоняем младшие биты в старшие
return t1 | t2; // объединяем старшие и младшие биты
}
Байтовый ключ [208, 159, 209, 128, 208, 190, 208, 177, 208, 189, 209, 139, 208, 185, 32, 208, 186, 208, 187, 209, 142, 209, 135, 32, 52, 56, 52, 56, 52, 55, 49, 50, 57, 52, 50, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Массив слов [3500134784, 3502166193, 3502100875, 3501793488, 3134241745, 2396096288, 876098616, 876032306, 959722037, 0, 0, 0]
Таблица расширенных ключей [2654435769, 5308871538, 7963307307, 10617743076, 13272178845, 15926614614, 18581050383, 21235486152, 23889921921, 26544357690, 29198793459, 31853229228, 34507664997, 37162100766, 39816536535, 42470972304, 45125408073, 47779843842, 50434279611, 53088715380, 55743151149, 58397586918, 61052022687, 63706458456, 66360894225, 69015329994]
Офлайн
857
tmvpsingleЯ встречал и 64-битный int. А по стандарту он не ограничен, главное, чтобы он не был короче short int и не был длиннее long int.
Последний пример вообще не понятен мне. Зачем тут используется встроенная функция определения размера объекта, который он занимает в памяти? Обычно для целого числа это 4 байта.
tmvpsingleСначала запиши вызов функции, которой у тебя ещё нет.
Не могу реализовать операции “>>> <<<” циклического побитового сдвига.
x = rotate_right(12345, 5)
def rotate_left(num, n)
def rotate_right(num, n)
>>> (-12345).bit_length() 14 >>> (12345).bit_length() 14 >>> (-1234512345123451234512345).bit_length() 81 >>> (1234512345123451234512345).bit_length() 81 >>>
Отредактировано py.user.next (Дек. 12, 2014 01:38:52)
Офлайн
0
не знаю видел ли, но сброшу
http://www.cyberforum.ru/python/thread693325.html
Вообще, куда быстрее найти реализацию на С и прямо просто переписать на Питоне, с использованием простых строенных функций типа len() и << >>.
Я когда делал протокол обмена данными, именно по такому способу делал реализацию CRC16 суммы с 0x8005 полиномом.
Офлайн