是否可以通过将块提供给 rep xsha1
指令来计算SHA1哈希值?
VIA的Padlock programming guide显示了计算文件SHA1哈希值的示例,但它在调用哈希指令之前将整个文件加载到内存中 .
我也没有看到任何关于在块中计算SHA哈希的信息 . 可以假设,因为你需要初始化输出缓冲区值,只需简单地再次调用 rep xsha1
而不重新初始化它们就可以工作,但是在测试之后,如果重要的话,这不会给它提供64字节的块 .
我不知道SHA1散列如何工作的内部结构,但我猜测有一个完成步骤,如果以块的形式加载数据,你需要以某种方式停止硬件 .
有谁知道在块中计算SHA1哈希的有效方法?
2 回答
取决于CPU . 在VIA Nano及更高版本中,您可以在执行REP XSHA1 / 256指令之前通过将EAX设置为FFFFFFFF来执行部分哈希 - 并且CPU将不执行最终填充(因此您可以简单地将块提供到哈希中,就像您一样通常使用散列函数) . 在较旧的模型(直到C7)上,不存在这种可能性,必须在散列指令之前将EAX设置为零,并且执行完整散列(即,包括最终填充) .
我成功地实现了上面提到的黑客攻击(在Windows上)并且它已经工作[在VIA Nano上测试,但EAX = 0,但无法访问旧的CPU] . 但是,是的,这里存在性能损失,因此您不希望在代码中提供微小的块 . 我建议将小块缓冲到一个更大的缓冲区,比如几千字节,然后再执行“中断的哈希” . 如果您使用的数据少于此数据,则最好回退到普通的x86代码 .
由于我无法对其他帖子发表评论/回复,以下是对以下评论的回复:
我担心我无法分享我的代码,但我建议google for“PadlockSDK_3.1_Release_20090121.zip”这是包含相关功能的官方Via源(例如在PadlockSDK_3.1_Release_20090121 \ PadlockSDK_3.1_build20081128 \ sdk \ src中 - 有asm_partial_sha1_op3()函数的程序集实现 .
好吧,我发现了这个:http://www.logix.cz/michal/devel/padlock/phe_sum.xp
聪明的黑客,但我不知道这样做的性能损失 .
做一些测试,似乎它永远不会完成如果文件大于输入缓冲区,即黑客似乎不适合我,所以它似乎相当脆弱,虽然理论听起来没问题 .
所以我从've found, there'开始并没有特别理想的方式来提供
xsha1
. (在没有能够很好地提供大量数据的情况下获得硬件加速哈希支持似乎有点无意义)