首页 > 解决方案 > 在 php 中使用 openssl_encrypt 加密数据,然后寻找在 nodejs 中解密数据 - 所需的密钥大小似乎不同?

问题描述

我的php代码如下:

openssl_encrypt($string, 'AES-256-CBC', $key, 0, $iv);

和我的nodejs代码:

crypto.createDecipheriv('aes-256-cbc', 'key', 'iv')

打印到控制台时,我的 php 代码中的密钥长度为 64 个字符。但是,当我在 nodejs 中使用相同的密钥来破译我的代码时,只有在我的密钥使用 32 个字符时才会感到高兴。我尝试只使用我在 php 加密代码中使用的密钥的前 32 个字符,但它不起作用。谁能解释我在这里出错的地方?谢谢。

标签: phpnode.jsencryptioncryptography

解决方案


AES256 的 32 字节密钥长度应该是正确的。创建一个虚拟密钥并在两端打印出来以进行调查。您的问题很可能是密钥的格式/编码。例如,如果您正在处理十六进制的密钥,则可以解释 64 个字符。那将需要两个字符来表示一个字节。

关于参数的文档openssl_encrypt似乎不是很详细key,但其中一位投票率很高的用户贡献评论表明密钥确实需要采用十六进制格式:“ IV 和密钥参数传递给 openssl 命令行必须是字符串的十六进制表示。http://php.net/manual/en/function.openssl-encrypt.php

nodeJS 方面的格式似乎更灵活,只需确保您的数据类型和编码相互匹配即可。https://nodejs.org/api/crypto.html#crypto_crypto_createdecipheriv_algorithm_key_iv_options

编辑:

您可以尝试的一件事是将该 64 个字符(很可能仍然是十六进制格式)转换为节点端的缓冲区,然后再将其提供给createDecipheriv函数。https://nodejs.org/api/buffer.html#buffer_class_method_buffer_from_array


推荐阅读