Побитовые операции с большими строками в PHP - PullRequest
12 голосов
/ 04 апреля 2011

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

Однако SHA512 требует побитовых операций над 64-битными целыми числами.Поскольку PHP может иметь только 32-битные целые числа (с компиляцией), это оставляет меня с проблемой.Как реализовать необходимые побитовые функции (по модулю, сдвиг, вращение, сложение, xor и / или т. Д.), Чтобы обеспечить совместимость и приемлемый уровень производительности ...

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 08 апреля 2011

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

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

0 голосов
/ 08 апреля 2011

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

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

0 голосов
/ 04 апреля 2011

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

...