我有一段旧代码,使用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
不一样。
答案 0 :(得分:1)
你将Rijndael与AES等同起来,这是一种常见的误解。
AES只是它的一个子集--Rijndael-128,AES变化之间的区别只是密钥大小:
另一方面,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中)。
如果我是你,我会完全改变算法。当然,这意味着要重新加密所有数据,但最终你必须这样做,现在才是实现这一目标的最佳时机。