2011-04-04 46 views
12

這是我的問題。爲了兼容性的原因,我目前正在嘗試在PHP中實現一些加密標準。我現在正在使用的是SHA256和SHA512。他們都是相當直接的標準,我沒有這個問題。PHP中的大字符串按位操作

但是,SHA512需要按位操作64位整數。由於PHP可以只有32位整數(在編譯時),這就給我帶來了一個問題。我如何實現所需的按位功能(模,移,旋轉,添加,異或等),以便我保持兼容性和合理的性能水平...

我知道他們中的一些人用2 32位整數實現這些函數。但是,如何爲shiftrotate工作?

我想過的是以二進制形式存儲字符串(作爲字符串01010)。這樣所有的按位操作將完全獨立於架構。但是這可能會導致性能下降,因爲它們在標準(以及圖書館的其他部分)中的使用非常頻繁。

所以我的問題是:我怎樣才能輕鬆地允許在32位PHP編譯中至少執行64位字符串操作,同時仍然保持每步合理的性能水平...?

呵呵,我的目標是便攜性在這裏,所以沒有擴展。其他庫我會考慮,但他們必須是便攜式...

+2

您可以將64位數字視爲兩個32位數字,並在兩個數字之間調整「carry」部分。 – 2011-04-04 11:35:23

+0

@Sal:當然。但那是一種PITA。我想如果這是我能做的最好的事情,那就這樣吧。但是,如果有更清晰的方式,我全都是耳朵...... – ircmaxell 2011-04-04 11:47:11

+0

通過創建一個「BitString」對象來簡化功能,這個對象只是Ints數組的一個包裝器,有些功能可以按照Salman的說法進行。 – 2011-04-04 19:57:19

回答

2

將值存儲在字符串中確實是正確的選擇。

但不是存儲1和0,只是在每個字節中存儲8位。從字符串中提取整數部分仍然很容易。您需要手動執行所有操作,例如移位。

+0

那麼,我認爲在一個字符串中存儲0和1的唯一原因是,那麼實現每個按位運算符是微不足道的(左移只是附加0,右移只是刪除尾隨數字等)。 .. – ircmaxell 2011-04-08 12:49:17

+0

但它不會很快雖然..如果你做它的二進制,並提取部分每字節(或每32位甚至),你仍然可以使用標準的按位運算符,但你需要確保你自己的東西就像一個左移進行到下一個字節。 – Evert 2011-04-08 13:01:18

+0

公平的@Evert。我將不得不考慮這一段時間。謝謝一堆...... – ircmaxell 2011-04-08 13:13:55

0

您可以使用bcmath。它已經被證明是非常好的,並且自4.0.4以來一直使用PHP

+0

再次,擴展名不在表格中。更何況,BCMath沒有按位功能,所以即使我們想提及它們也沒有用......再次,我正在尋找按位操作,不只是任意數學... – ircmaxell 2011-04-04 14:40:58

0

很明顯,沒有辦法使用本地數據結構來代表您的環境中的整數,因此您必須在頂部使用數據結構。這意味着你將無法應用你的例子... 0xFFFFFFFF >> 4但你可以使用mystruct(0xFFFFFFFF)>> 4(mystruct是你定義的數據結構)。

如果這聽起來像一個計劃讓我知道,也許我可以幫助你的解決方案的其餘部分。

+0

考慮到PHP不允許重寫操作符(也不是真正的結構),我不確定這是否會起作用。如果你知道在PHP這樣做的方式,我全部耳朵...... – ircmaxell 2011-04-08 12:48:17

+0

當談到數據結構時,我正在考慮一個類實例,但是,不像ocaml等你是正確的 - 重寫操作符是不可能的。:-( – 2011-04-11 15:18:13