Openssl Decrypt in PHP without -iv -pass
Openssl Decrypt in PHP without -iv -pass
我想解密已经加密的文本,我设法通过 MacOS 终端中的命令来完成。
printf "encrypted text" | openssl enc -d -base64 -A -aes-256-cbc -k "abcde" -nosalt
在 MacOS 终端中它运行良好,我收到了解密的消息,但我在 php 中尝试过但失败了。
<?php
$method = 'aes-256-cbc';
$password = substr(hash('sha256', 'abcde', true), 0, 32);
$iv = chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0);
$decoded = openssl_decrypt(base64_decode($token), 'AES-256-CBC', $password, 0, $iv);
return $decoded;
?>
我不知道终端如何处理 -nosalt 键来获取 iv 并通过,我尝试使用空 iv 但失败了。 php 的等效代码是什么?
让我们从一个严重的警告开始(@Sammitch 也有评论):请不要在生产中使用此功能,因为它不安全。 请仅将其用于迁移更好的密钥推导。
关于您的问题:OpenSSL 使用过时的 密钥派生来生成密钥和必要的初始化向量 (IV)。您可以在此处找到很多有关 SO 的示例,以了解密钥派生的工作原理以及如何在 PHP.
中以编程方式使用它
我将向您展示如何使用 OpenSSL 完成单个任务。你运行这样加密:
printf "encrypted text" | openssl enc -d -base64 -A -aes-256-cbc -k "abcde" -nosalt
并接收解密后的文本。您使用的密码是“abcde”。添加附加参数“-P”时,您将看到派生密钥和 IV,在您的情况下,此值(所有值均采用十六进制表示法):
printf "encrypted text" | openssl enc -d -base64 -A -P -aes-256-cbc -k "abcde" -nosalt
key=36BBE50ED96841D10443BCB670D6554F0A34B761BE67EC9C4A8AD2C0C44CA42C
iv =2A34E82FFC2B85AA708049C7CD64A6A1
现在可以使用PHP中的这些值进行解密(使用hex2bin进行转换)
顺便说一句:参数“-P”只显示密钥和IV而不解密,使用“-p”显示密钥和IV并运行解密。
我想解密已经加密的文本,我设法通过 MacOS 终端中的命令来完成。
printf "encrypted text" | openssl enc -d -base64 -A -aes-256-cbc -k "abcde" -nosalt
在 MacOS 终端中它运行良好,我收到了解密的消息,但我在 php 中尝试过但失败了。
<?php
$method = 'aes-256-cbc';
$password = substr(hash('sha256', 'abcde', true), 0, 32);
$iv = chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0);
$decoded = openssl_decrypt(base64_decode($token), 'AES-256-CBC', $password, 0, $iv);
return $decoded;
?>
我不知道终端如何处理 -nosalt 键来获取 iv 并通过,我尝试使用空 iv 但失败了。 php 的等效代码是什么?
让我们从一个严重的警告开始(@Sammitch 也有评论):请不要在生产中使用此功能,因为它不安全。 请仅将其用于迁移更好的密钥推导。
关于您的问题:OpenSSL 使用过时的 密钥派生来生成密钥和必要的初始化向量 (IV)。您可以在此处找到很多有关 SO 的示例,以了解密钥派生的工作原理以及如何在 PHP.
中以编程方式使用它我将向您展示如何使用 OpenSSL 完成单个任务。你运行这样加密:
printf "encrypted text" | openssl enc -d -base64 -A -aes-256-cbc -k "abcde" -nosalt
并接收解密后的文本。您使用的密码是“abcde”。添加附加参数“-P”时,您将看到派生密钥和 IV,在您的情况下,此值(所有值均采用十六进制表示法):
printf "encrypted text" | openssl enc -d -base64 -A -P -aes-256-cbc -k "abcde" -nosalt
key=36BBE50ED96841D10443BCB670D6554F0A34B761BE67EC9C4A8AD2C0C44CA42C
iv =2A34E82FFC2B85AA708049C7CD64A6A1
现在可以使用PHP中的这些值进行解密(使用hex2bin进行转换)
顺便说一句:参数“-P”只显示密钥和IV而不解密,使用“-p”显示密钥和IV并运行解密。