【问题标题】:Openssl Decrypt in PHP without -iv -pass在没有 -iv -pass 的情况下在 PHP 中进行 Openssl 解密
【发布时间】:2021-04-21 21:59:45
【问题描述】:

我想解密我拥有的已经加密的文本,我通过 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 等效代码是什么?

【问题讨论】:

  • 呃不知道,因为当您未能为 openssl enc 指定 IV 时,它是从密钥派生的,这是一个坏主意,我找不到相关文档。也没有指定密钥派生函数默认为不安全的东西,我也找不到文档,最后-nosalt选项is已记录,但This option SHOULD NOT be used except for test purposes or compatibility with ancient versions of OpenSSL.。所以呃......不要这样做。

标签: php macos encryption openssl


【解决方案1】:

让我们从一个严重的警告开始(@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并运行解密。

【讨论】:

  • 我实际上之前尝试过这个并且对我不起作用,我不知道为什么我现在尝试重新创建它并且它确实有效,我想我之前做错了什么。这只是为了测试目的,但我很高兴你的回答对我有用。使用 -P 命令获取派生密钥和 IV 以在 PHP 中使用。
  • 很高兴能为您提供帮助,您能否将我的回答标记为“已接受”?
猜你喜欢
  • 2018-03-25
  • 1970-01-01
  • 1970-01-01
  • 2022-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 2022-12-16
相关资源
最近更新 更多