当前位置: 首页 > 知识库问答 >
问题:

PHP AES 128位CBC加密给出大小警告

帅博远
2023-03-14

我使用的是128位的AES ALgo,带有CBC密码模式加密,下面是代码:

$cc = 'my secret text';
$key = '3aa22e01c04c7059778c54d122b0273689fba00f4a166a66d15f7ba6a8ba8743';
$iv =  '1234567890123456';
$length = strlen($cc);

$cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_128,'','cbc','');

mcrypt_generic_init($cipher, $key, $iv);
$encrypted = base64_encode(mcrypt_generic($cipher,$cc));
mcrypt_generic_deinit($cipher);

mcrypt_generic_init($cipher, $key, $iv);
$decrypted = mdecrypt_generic($cipher,base64_decode($encrypted));
mcrypt_generic_deinit($cipher);

echo "encrypted: " . $encrypted;
echo "\n";
echo "decrypted: " . substr($decrypted, 0, $length) . "\n";

但这给了我一个警告,输出为:

警告:mcrypt_generic_init():密钥大小太大;提供的长度:64,最大:32 /var/www/cipher.php第10行警告:mcrypt_generic_init():密钥大小太大;提供的长度:64,最大:32 /var/www/cipher.php第14行加密:vM/XVYSjs/QApdCUEQ8bdQ==解密:我的秘密文本

现在有人可以指导我为什么我面临大小问题,以及如何在不改变钥匙的情况下消除大小问题......

共有2个答案

程俊力
2023-03-14

我修改了你的代码,它运行良好,请检查我的变化,好吗

$data_to_encrypt = "2~1~000024~0910~20130723092446~T~00002000~USD~F~375019001012120~0~0~00000000000~";
$key128 = "abcdef0123456789abcdef0123456789";
$iv = "0000000000000000";

$cc = $data_to_encrypt;
$key = $key128;
$iv =  $iv;
$length = strlen($cc);

$cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_128,'','cbc','');

mcrypt_generic_init($cipher, $key, $iv);
$encrypted = base64_encode(mcrypt_generic($cipher,$cc));
mcrypt_generic_deinit($cipher);

mcrypt_generic_init($cipher, $key, $iv);
$decrypted = mdecrypt_generic($cipher,base64_decode($encrypted));
mcrypt_generic_deinit($cipher);

echo "encrypted: " . $encrypted;
echo "<br/>";
echo "length:".strlen($encrypted);
echo "<br/>";
echo "decrypted: " . substr($decrypted, 0, $length);
汪信鸥
2023-03-14

您正在进行128位加密,但您的密钥长度为64个十六进制字符,即265位。

要么您需要进行256位加密,要么您的密钥需要一半大小。

 类似资料:
  • 我只需要通过代码加密AES CBC 128位模式的字符串。我使用openssl库完成了这项工作,但无法获得正确的输出。 到目前为止,我已经完成了。 我的十六进制输出是:B0 15 751B50 80 D4 FF 81 68 146BB71B95 99 37 38 但正确的输出是:< code > 73 5C 04 F9 57 18 43 7C EE 68 27 59 2B 41 A8 DA (通过

  • 我需要解密一些使用以下规格加密的数据(在Android上): 具有128位密钥大小和128位块大小的AES 分组密码模式:CBC-CS1(具有密文窃取的CBC,变体1,如[CBCCS]中所述) 我在网上没有找到太多的信息,我试过的所有AES解密方法都不起作用。 主要问题似乎是CBC-CS1的实施,它是受支持的还是我应该自己实施? 谢谢,戴姆

  • 也许你能帮我。非常感谢!

  • 问题内容: 我想知道AES加密后的数据大小,这样我就可以避免主要出于了解大小而缓存我的后AES数据(在磁盘或内存上)。 我使用128位AES 和进行加密。 使用各种输入大小执行的一些测试表明,如下计算的后期加密大小是正确的: 但是我不确定以上公式是否适用于所有可能的输入大小。 在应用AES加密后,是否有一种方法可以计算数据的大小-事先无需缓存(磁盘或内存中的)加密数据即可知道其加密后的大小? 问题

  • 我在Minio中有一个加密对象,使用AES 128位CBC算法加密。 该对象非常大(约50 MB),因此我没有将其完全加载到内存中(这可能会导致内存不足异常),而是以1MB的块检索它。我需要在使用前解密它。 有没有可能用这种方式解密对象(一次1MB,整个对象一次性加密)?如果是,我该怎么做?我尝试解密16字节的块,产生以下错误: <code>javax.crypto。IllegalBlockSiz