Подтвердить что ты не робот

Побитовые операции над большими строками в PHP

Вот моя проблема. В настоящее время я пытаюсь реализовать несколько стандартов криптографии в PHP по соображениям совместимости. Тот, над которым я сейчас работаю, - SHA256 и SHA512. Они оба достаточно прямолинейные стандарты, и у меня нет проблем с этим.

Однако SHA512 требует побитовых операций над 64-битными целыми числами. Поскольку PHP может иметь только 32-битные целые числа (с компиляцией), это оставляет мне проблему. Как реализовать побитовые функции, необходимые (modulo, shift, rotate, add, xor, and, or, и т.д.), Так что я поддерживаю совместимость и разумный уровень производительности...

Я знаю, что для некоторых из них реализация функций тривиально выполняется с помощью 32-битных ints. Однако как это работает для shift и rotate?

То, что я думал делать, это хранить строки в двоичной форме (в виде строки 01010). Таким образом, все побитовые операции будут полностью независимыми от архитектуры. Но это, вероятно, вызовет значительное падение производительности, поскольку они используются невероятно часто в стандартах (и в других частях библиотеки).

Итак, мой вопрос заключается в следующем: как я могу легко разрешить по меньшей мере 64-разрядные операции с строками в 32-битной компиляции PHP, сохраняя при этом приемлемый уровень производительности для каждого шага...?

О, и моя цель - переносимость здесь, поэтому никаких расширений. Другие библиотеки, которые я рассмотрю, но они должны быть переносимыми...

4b9b3361

Ответ 1

Сохранение значений в строках - это действительно правильный способ.

Но вместо сохранения 1 и 0 просто сохраните 8 бит в каждом байте. По-прежнему будет легко извлечь части целых чисел из вашей строки. Вам необходимо вручную выполнять все операции, такие как смена.

Ответ 2

Вы можете использовать bcmath. Он зарекомендовал себя очень хорошо и работает с PHP с 4.0.4

Ответ 3

Очевидно, что нет возможности использовать собственную структуру данных, которая представляет собой ints, заданную вашей средой, и поэтому вам нужно использовать структуру данных сверху. Это будет означать, конечно, что вы не сможете применить свой пример, данный... 0xFFFFFFFF → 4, но вы могли бы использовать mystruct (0xFFFFFFFF) → 4 (чтобы определить структуру данных, определенную вами).

Если это звучит как план, дайте мне знать и, возможно, я смогу помочь вам с остальной частью решения.