相当于PhpSecLib中的mcrypt_encrypt

时间:2017-11-27 10:11:48

标签: php mcrypt phpseclib php-7.1

我有一段旧代码,使用mcrypt扩展名编写,我必须将其更改为phpseclib。但是我的代码没有生成与mcrypt函数相同的输出:

旧代码:

$encryptedText =mcrypt_encrypt(
        MCRYPT_RIJNDAEL_256,
        $myKey,
        $data ,
        MCRYPT_MODE_CBC,
        $myIV
    );

我的新代码:

$aes = new \phpseclib\Crypt\AES(\phpseclib\Crypt\AES::MODE_CBC);
$aes->setKey($myKey);
$aes->setIV($myIV);
$aes->disablePadding();
$seclib = $aes->encrypt( $data );

$encryptedText$seclib不一样。

1 个答案:

答案 0 :(得分:1)

你将Rijndael与AES等同起来,这是一种常见的误解。

AES只是它的一个子集--Rijndael-128,AES变化之间的区别只是密钥大小:

  • AES-128是Rijndael-128,带有128位密钥。
  • AES-256再次是Rijndael-128,但是使用256位密钥。

另一方面,Rijndael变体中的后缀数字指的是密钥大小和块大小,所以当然你不能通过AES来获得Rijndael-256,因为你需要256位块大小。

phpseclib文档上有一个页面,它在输入基本变量(密码,模式,密钥大小,位大小)后生成示例代码。它为Rijndael, CBC, 256, 256输出以下内容:

<?php
include('Crypt/Rijndael.php');
include('Crypt/Random.php');

$cipher = new Crypt_Rijndael(); // could use CRYPT_RIJNDAEL_MODE_CBC
$cipher->setBlockLength(256);
// keys are null-padded to the closest valid size
// longer than the longest key and it's truncated
//$cipher->setKeyLength(256);
$cipher->setKey('abcdefghijklmnopqrstuvwxyz123456');
// the IV defaults to all-NULLs if not explicitly defined
$cipher->setIV(crypt_random_string($cipher->getBlockLength() >> 3));

$size = 10 * 1024;
$plaintext = str_repeat('a', $size);

echo $cipher->decrypt($cipher->encrypt($plaintext));

我不确定该库是否真的支持这个没有mcrypt可用性的密码,但它应该。

我认为你这样做是因为mcrypt正在从PHP中删除,我强烈建议你改变策略。

即使以上工作原理,使用算法的用户态PHP实现(在phpseclib文档中注明)也会非常慢,但更重要的是 - 如果此库停止工作,您将没有其他选择Rijndael的非AES变体并不是普遍存在的,现在还有更多现代算法可供使用(提示:libsodium被添加到PHP 7.2中)。

如果我是你,我会完全改变算法。当然,这意味着要重新加密所有数据,但最终你必须这样做,现在才是实现这一目标的最佳时机。