phpseclib - 设置 IV 修改图像数据 URI

phpseclib - set IV modify images data URI

我正在使用 phpseclib encrypt/decrypt 一些图像的数据 uri。我注意到当我使用 IV 时,传递的数据 uri 的 data:image/png;base64data:image/jpg;base64data:image/jpeg;base64 部分将丢失,只有 base64 字符串的其余部分将保留并且解密操作后我将无法显示图像。是否可以在不丢失每个加密数据 uri 的那部分的情况下使用 IV?

//data URI creation from uploaded image using PHP-dataURI https://github.com/alchemy-fr/PHP-dataURI
$dataObject = DataURI\Data::buildFromFile('myimage.jpg');
//data URI encrypt
$cipher = new AES();
//set password for encryption
$cipher->setPassword($password);
//set the IV - this will corrupt data uri generated
$cipher->setIV(Random::string($cipher->getBlockLength() >> 3));
//encrypting the data
$output = $cipher->encrypt(DataURI\Dumper::dump($dataObject));

这是我用来解决这个问题的方法。我是 phplibsec 的新手,所以我以错误的方式使用 $cipher->setIV(Random::string($cipher->getBlockLength() >> 3)) 方法来设置和读取 IV。 phpseclib 文档不是很有用,并且缺乏关于如何正确实施加密和解密方法的示例,特别是没有提供如何管理 IV 的示例。在对 SO 进行一些研究并感谢社区的帮助之后,我找到了管理 IV 的方法。

数据uri的加密:

//data URI creation from uploaded image using PHP-dataURI https://github.com/alchemy-fr/PHP-dataURI
$dataObject = DataURI\Data::buildFromFile('myimage.jpg');
//data URI encrypt
$cipher = new AES();
//set password for encryption
$cipher->setPassword($password);
//random IV creation
$iv = Random::string($cipher->getBlockSize() >> 3);
//set the IV
$cipher->setIV($iv);
//encrypting the data
$encrypted = $cipher->encrypt(DataURI\Dumper::dump($dataObject));
//output
$output = $iv.$encrypted;

在加密脚本中,我将随机生成的 IV 分配给一个变量,该变量在加密后被添加到加密数据之前。这是因为需要 IV 才能正确解密数据,这意味着它需要存储在数据库中或 appended/prepended 到数据(不,这样做没有安全风险)。然后可以使用 substr() 函数以这种方式从加密数据中提取前置 IV:

//data URI decrypt
$cipher = new AES();
//set previously selected password for encryption
$cipher->setPassword($password);
//extract the IV from encrypted data
$ivLength = $cipher->getBlockLength() >> 3;
$iv = substr($encrypted, 0, $ivLength);
//set the IV
$cipher->setIV($iv);
//removing the IV from the data before decrypt
$data = substr($encrypted, $ivLength);
//decrypting the data
$output = $cipher->decrypt($data);

解密后原始base64数据uri将按预期返回。