Недавно я получил копию прикладной криптографии Брюса Шнайера, и это было хорошо прочитано. Теперь я понимаю, как работают несколько алгоритмов, описанных в книге, и я хотел бы начать реализацию некоторых из них в C.
Одна вещь, с которой связаны многие алгоритмы, - это разделение х-битового ключа на несколько меньших y-бит ключей. Например, ключ Blowfish, X, является 64-битным, но вы должны разбить его на две 32-разрядные половины; Xl и Xr.
Здесь я застреваю. Я довольно приличный с C, но я не самый сильный, когда речь идет о побитовых операторах и т.п.
После некоторой помощи в 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 бита? Я предполагаю, что это undefined, но эти макросы действительно работают.
- Кроме того, предложите ли вы мне пойти по этому пути?
Как я уже сказал, я довольно хорошо знаком с C, но побитовые операторы и тому подобное все еще дают мне головную боль.
ИЗМЕНИТЬ
Я понял, что мой комбинированный макрос фактически не объединяет две 32-битные переменные, а просто ORing 0 на a и получает результат.
Итак, помимо моих предыдущих вопросов, у меня до сих пор нет метода комбинирования двух 32-битных переменных, чтобы получить 64-битный; предложение о том, как это сделать, будет оценено.