这是我的问题。出于兼容性原因,我目前正在尝试在PHP中实现一些加密标准。我现在正在研究的是SHA256和SHA512。它们都是相当直接的标准,我对此没有任何问题。
但是,SHA512需要对64位整数进行逐位运算。由于PHP只能有32位整数(使用编译),这让我有一个问题。如何实现必要的按位函数(模,转,旋转,添加,xor和/或等),以便我保持兼容性和合理的性能水平......
我知道其中一些实现这些功能的工作只需要2个32位整数。但是,这对shift
和rotate
有何影响?
我想到的是以二进制形式存储字符串(作为01010
的字符串)。这样,所有按位操作都将完全独立于架构。但这可能会导致性能大幅下降,因为它们在标准中(以及库的其他部分)经常使用它们。
因此,我的问题是:如何在PHP的32位编译中轻松地允许至少64位字符串操作,同时仍然为每个步骤保持合理的性能级别......?
哦,我的目标是这里的便携性,所以没有扩展。我会考虑的其他图书馆,但它们必须是便携式的......
答案 0 :(得分:3)
将值存储在字符串中确实是正确的方法。
但不是存储1和0,而是在每个字节中存储8位。从字符串中提取整数的部分仍然很容易。您需要手动执行所有操作,例如转移。
答案 1 :(得分:0)
显然,在给定您的环境的情况下,无法使用表示整数的本机数据结构,因此您必须在顶部使用数据结构。这当然意味着您将无法应用给定的示例... 0xFFFFFFFF>> 4但你可以使用mystruct(0xFFFFFFFF)>> 4(mystruct是你定义的数据结构)。
如果这听起来像一个计划让我知道,也许我可以帮助你解决剩下的问题。
答案 2 :(得分:-1)
您可以使用bcmath。它已经证明自己非常好,并且自4.0.4开始就与PHP一起使用