2011-02-24 104 views
17

我一直在测试PHP的mcrypt函数中可用的各种modesECB在大多数教程中使用的模式,但不建议在刚链接页面和some users两个,所以我认为,要么CBCCFB应该做的伎俩。PHP:Mcrypt - 哪种模式?

的PHP文件是不是太胖,在它的适用于mcrypt不同模式的比较,而是指“由Schneier的应用密码学”,这我不是太热衷购买的那一刻书的。

那么我想使用哪种mcrypt模式?为什么?

+1

不是重复而是乐于助人后http://stackoverflow.com/questions/2809855/which-php-mcrypt-cipher-is-safest喜凯文) – kjy112 2011-02-24 17:45:34

+0

是的,我知道后,这是我自己的,但我还是很怀念列出可用于'mcrypt'的不同模式的优点/缺点。为什么选择_CBC_ over _CFC_? – Industrial 2011-02-24 17:46:31

回答

22

mcrypt实际上比listed实现了多种模式,你可以使用字符串名称来访问它们:

  • cbc - CBC模式
  • cfb - 8位CFB模式;
  • ncfb - 块大小CFB mode;
  • nofb - OFB mode(not ofb);
  • ctr - CTR mode。

这些模式在实现细节上有所不同,所以它们的适用性取决于您的数据和环境。

填充:除非你实现你自己的填充

  • CBC模式只能加密的完全块,所以mcrypt垫您与零个字节明文。

  • CFBOFBCTR模式加密任何长度的消息。

初始化向量

  • CBCCFB模式需要随机IV(不使用MCRYPT_RAND)。

  • OFB模式仅仅需要唯一的IV(例如全局计数器,如果行从未被修改或删除,可能是数据库主键)。

  • CTR要求每个计数器块是唯一的(不只是消息,该消息是第一计数器块的IV,但其余的,通过递增计数器块为消息的每个块形成由1) 。

更多相关内容在NIST recommendations

有在性能上的差异应该是不重要在PHP,如是否加密或解密可以并行和多少密码迭代每块(通常在8位CFB模式之一,但16)被使用。

malleability有差异,应该是不重要的,因为你应用MAC

而且有可能在其安全上的差异,但是,你应该咨询cryptographer

+0

感谢您的广泛回复@aaz! – Industrial 2011-02-26 13:29:36

+1

@aaz - 你说“(不要使用MCRYPT_RAND)”我问为什么? – buggedcom 2011-10-06 19:57:53

+1

@buggedcom - 这些模式的安全性取决于IV是不可预测的。 'MCRYPT_RAND'使用PHP随机数生成器,它可能满足或不满足这个要求。它可能连接到硬件RNG,或者它可能返回π的数字。但是你可以在你的系统上检查['man 4 random'](http://linux.die.net/man/4/random),看看'/ dev/random'是用来产生加密材料的,默认的'MCRYPT_DEV_RANDOM'使用它。 – aaz 2011-10-08 22:56:29