Побитовые Операции Над Большими Строками В PHP


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

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

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

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

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

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

Author: ircmaxell, 2011-04-04

3 answers

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

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

 2
Author: Evert, 2011-04-08 12:41:34

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

 0
Author: Silver Light, 2011-04-04 13:50:02

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

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

 0
Author: Lloyd Moore, 2011-04-08 12:19:33