Я недавно взял копию прикладной криптографии Брюса Шнайера, и это было хорошее чтение. Теперь я понимаю, как работает несколько алгоритмов, описанных в книге, и я хотел бы начать реализацию нескольких из них на языке C.
Одной из общих черт многих алгоритмов является разделение x-битного ключа на несколько меньших y-битных ключей. Например, ключ Blowfish, X, является 64-битным, но вам необходимо разбить его на две 32-битные половины; Xl и Xr.
Это то место, где я застреваю. Я вполне приличен с Си, но я не самый сильный, когда дело доходит до побитовых операторов и тому подобного.
После некоторой помощи по IRC мне удалось придумать два макроса:
#define splitup(a, b, c) {b = a >> 32; c = a & 0xffffffff; }
#define combine(a, b, c) {a = (c << 32) | a;}
Где a - 64 бита, а b и c - 32 бита. Однако компилятор предупреждает меня о том, что я сдвигаю 32-битную переменную на 32 бита.
У меня такие вопросы:
- Что плохого в переносе 32-битной переменной на 32 бита? Я предполагаю, что это не определено, но эти макросы действительно работают.
- Кроме того, не могли бы вы предложить мне пойти другим путем?
Как я уже сказал, я довольно хорошо знаком с C, но побитовые операторы и тому подобное все еще вызывают у меня головную боль.
EDIT
Я понял, что мой макрос объединения на самом деле не объединяет две 32-битные переменные, а просто ORing 0 за a и в результате получает a.
Итак, помимо моих предыдущих вопросов, у меня все еще нет метода объединения двух 32-битных переменных для получения 64-битной; предложение о том, как это сделать, будет оценено.