php - PHP 中的 AES-256-CBC 加密和 Node.js 中的解密

标签 php node.js cryptography aes

我的问题是我使用 aes-256-cbc 中的 m_crypt 模块使用 base64 对 PHP 中的字符串进行编码,如下所示:

    function encrypt($data) {
        if(32 !== strlen($this->secret)) $this->secret = hash('SHA256', $this->secret, true);
        $padding = 16 - (strlen($data) % 16);
        $data .= str_repeat(chr($padding), $padding);

        $encrypt = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $this->secret, $data, MCRYPT_MODE_CBC, str_repeat("\0", 16));

        return base64_encode($encrypt);
    }

其中 $this->secret 是 32 位 aes key ,$data 是我要加密的字符串。

这工作正常,文本被加密并发送到服务器,没有任何问题(我检查了两次!),现在我想用 Node.JS 解码整个事情,如下所示:

    var decipher = Core.crypto.createDecipher('aes-256-cbc', rows[0]['sessionkey']);
    decipher.update(body.user, 'base64', 'utf8');
    var user = decipher.final('utf8');

其中 Core.crypto 是 Node.JS 中普通加密模块的 require 调用,rows[0]['sessionkey'] 是用于通过 mysql 请求接收的加密的 key ,body.user 是通过 post 请求发送的 PHP 加密字符串。

正如我所提到的,一切都工作正常,除了这个小decypt的东西...我搜索了谷歌和所有内容并尝试了示例代码,但似乎我的代码有些东西不正确。

最佳答案

好吧,我自己想出来了。我在 Node.js 中解密消息时忘记设置 iv,工作代码如下所示:

var key =  new Buffer(rows[0]['sessionkey'], 'binary');

function decipher(key, data) {
    var decipher = Core.crypto.createDecipheriv('aes-256-cbc', key.toString('binary'), str_repeat('\0', 16));
    decipher.update(data, 'base64', 'utf8');
    return decipher.final('utf8');
}

我希望这对将来的任何人都有帮助!

最诚挚的问候

关于php - PHP 中的 AES-256-CBC 加密和 Node.js 中的解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22667938/

相关文章:

node.js - 尝试将 firebase-tools 安装到 Mac Big Sur 时出现 EACCES 错误

javascript - 规则和夏令时

javascript - 如何在 Node.js REPL 上使用 `prompt`

php - nodejs和php生成的不同HMAC

java - 从 Java 发送 POST 和 FILE 数据

php - Laravel 5.2 使用 LIKE 的搜索功能

php - MySQL 和 PHP : Atomicity and re-entrancy of a PHP code block executing two subsequent queries - how dangerous?

php - 多个数据库连接的多个数据库用户

c# - 在 System.Security.Cryptography 中找不到 `DataProtectionScope` 和 `ProtectedData` 类

java - 使用 Bouncy CaSTLe 的 ElGamal 同态乘法