openssl_decrypt 对于 aes-128-cbc 不工作
openssl_decrypt for aes-128-cbc not working
我正在解密来自 API 的一些内容。他们也提供了命令。因此,在下面进行一些修改后,命令就可以正常工作了:
openssl enc -d -aes-128-cbc -K 422943374a3568755d7c527f6e472132 -iv 00000000000000000000000000000000 -nopad -in <(echo 'D5fiXKI4ie4c69gcCwM4/p414yrYtH9np+piNoqZASbkUnHAvbB4norHz6d6uzJmIg1sULhHFmfQTkvpw0tIEVmNcjyP6j2LK8zXYzohtNlsqBHx5v4xHEIyCcvfbMJddd5hs97jqkUtHuQyer2GdfDKZseaGgpXJ75GK7uKFPkbJ3wgQ6A0Q7q2tbBYeXEDmRMO6OhWeHgrezQOcyjcdOQk50SjMuaSb9IRimwagXamiXRg0LyTzA18a0SuqtbKCNgXnmhf39YxJUudkRmcMQ==' | base64 --decode)
我需要在 PHP 中编写代码,所以我需要在 PHP 中翻译相同的内容,这是我在 PHP 中编写的内容:
$encodedStr = "PYroeIibeYwy/waD3opLw6yWT6Wfv3AhBKhQpoR+6qT9gx/bTDdR9QIfXcVURoQ2QlTl8L+JZX4Ije8M+FAQOxVmEXAmyUpzLgeg7aRCA6iiJbav/W3xW0BWb3D3QELjKTN4KRB2FdM7G5eIIfvjpeySLxQ3h7eL16nQf+1rms4VoVsBaeO8aU+Zy9saKZR4oL+k40m6tjtvtXryg7sWcmUgdonP/Jg4osESrY3MmGl7qXSpJC+v4g3iOY7s8NwywSN9q2Id7P0IaVtb5AFOEQ==";
$secretHash = ",MF-,2Y*s8DoYCFI";
$encryptionMethod = "AES-128-CBC";
$iv = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
$encrypted = base64_decode($encodedStr);
$hexKey = strToHex($secretHash);
$response = openssl_decrypt($encodedStr, $encryptionMethod, $hexKey, OPENSSL_ZERO_PADDING, $iv);
作为响应,我得到了一串奇怪的字符,而不是我可以从命令行中的 openssl 命令获得的实际字符串。
根据 openssl_decrypt
文档:
Takes a raw or base64 encoded string and decrypts it using a given method and key.
我也尝试在此函数的第一个参数中给出 base64 解码值。加密方法似乎也不错。和 API 文档中所述的零填充。我认为唯一值得怀疑的是零 iv。如果我以错误的方式将 iv 设为零,请告诉我。我也尝试过不使用 iv 但没有用。或者如果我在其他方面做错了也请告诉我。
openssl_decrypt 期望密钥是二进制而不是十六进制。您不需要将 $secretHash 转换为十六进制并按原样传递它。
$response = openssl_decrypt($encodedStr, $encryptionMethod, $secretHash, OPENSSL_ZERO_PADDING, $iv);
我正在解密来自 API 的一些内容。他们也提供了命令。因此,在下面进行一些修改后,命令就可以正常工作了:
openssl enc -d -aes-128-cbc -K 422943374a3568755d7c527f6e472132 -iv 00000000000000000000000000000000 -nopad -in <(echo 'D5fiXKI4ie4c69gcCwM4/p414yrYtH9np+piNoqZASbkUnHAvbB4norHz6d6uzJmIg1sULhHFmfQTkvpw0tIEVmNcjyP6j2LK8zXYzohtNlsqBHx5v4xHEIyCcvfbMJddd5hs97jqkUtHuQyer2GdfDKZseaGgpXJ75GK7uKFPkbJ3wgQ6A0Q7q2tbBYeXEDmRMO6OhWeHgrezQOcyjcdOQk50SjMuaSb9IRimwagXamiXRg0LyTzA18a0SuqtbKCNgXnmhf39YxJUudkRmcMQ==' | base64 --decode)
我需要在 PHP 中编写代码,所以我需要在 PHP 中翻译相同的内容,这是我在 PHP 中编写的内容:
$encodedStr = "PYroeIibeYwy/waD3opLw6yWT6Wfv3AhBKhQpoR+6qT9gx/bTDdR9QIfXcVURoQ2QlTl8L+JZX4Ije8M+FAQOxVmEXAmyUpzLgeg7aRCA6iiJbav/W3xW0BWb3D3QELjKTN4KRB2FdM7G5eIIfvjpeySLxQ3h7eL16nQf+1rms4VoVsBaeO8aU+Zy9saKZR4oL+k40m6tjtvtXryg7sWcmUgdonP/Jg4osESrY3MmGl7qXSpJC+v4g3iOY7s8NwywSN9q2Id7P0IaVtb5AFOEQ==";
$secretHash = ",MF-,2Y*s8DoYCFI";
$encryptionMethod = "AES-128-CBC";
$iv = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
$encrypted = base64_decode($encodedStr);
$hexKey = strToHex($secretHash);
$response = openssl_decrypt($encodedStr, $encryptionMethod, $hexKey, OPENSSL_ZERO_PADDING, $iv);
作为响应,我得到了一串奇怪的字符,而不是我可以从命令行中的 openssl 命令获得的实际字符串。
根据 openssl_decrypt
文档:
Takes a raw or base64 encoded string and decrypts it using a given method and key.
我也尝试在此函数的第一个参数中给出 base64 解码值。加密方法似乎也不错。和 API 文档中所述的零填充。我认为唯一值得怀疑的是零 iv。如果我以错误的方式将 iv 设为零,请告诉我。我也尝试过不使用 iv 但没有用。或者如果我在其他方面做错了也请告诉我。
openssl_decrypt 期望密钥是二进制而不是十六进制。您不需要将 $secretHash 转换为十六进制并按原样传递它。
$response = openssl_decrypt($encodedStr, $encryptionMethod, $secretHash, OPENSSL_ZERO_PADDING, $iv);