首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用OpenSSL / Node.js加密PHP

用OpenSSL / Node.js加密PHP
EN

Stack Overflow用户
提问于 2012-08-19 15:54:26
回答 1查看 9.1K关注 0票数 5

我正在使用PHP使用OpenSSL进行对称加密。PHP使用OpenSSL库,Node.js解密基于实现的密码。问题是,Node.js中的解密文本仅为部分正确的

PHP加密函数

代码语言:javascript
复制
function encrypt($text, $pw, $base64 = true) {

    $method = 'aes-256-cbc';
    $iv_len = openssl_cipher_iv_length($method);
    $iv = openssl_random_pseudo_bytes($iv_len);
    
    $pw = substr(md5($pw),0,32);

    $cipher =  openssl_encrypt ($text ,$method ,$pw ,!$base64 ,$iv );

    if($base64) {
            $pw = base64_encode($pw);
            $iv = base64_encode($iv);
        }

    return array(
        'iv' => $iv,
        'pw' => $pw,
        'text' => $text,
        'cipher' => $cipher
    );
}

nodejs中的解密

代码语言:javascript
复制
var cipher = new Buffer(data.cipher, 'base64');
var iv = new Buffer(data.iv, 'base64');
// the password is the same returned by the php function, so 100% correct
var key = new Buffer(data.pw, 'base64');
            
var dec = crypto.createDecipheriv('aes-256-cbc',key,iv);
var dec_data = dec.update(cipher,'binary','utf8');
    
// the script is based on socket.io 
socket.emit('debug',{decrypted : dec_data});

结果

代码语言:javascript
复制
# Encrypting in php...
>> encrypt('1. Lorem ipsum dolor sit amet! 2. Lorem ipsum dolor sit amet!', 'password');

# ...makes nodejs giving me something like
>> 1, 6+r@o ipsum /olor sit amet! 2. Lorem ipsum do

我猜这个问题可能与填充物有关--但老实说:我不知道。

谢谢你的帮助!

EN

回答 1

Stack Overflow用户

发布于 2015-01-27 22:56:31

在节点代码中,您忽略了消息的最后一部分:

代码语言:javascript
复制
var dec = crypto.createDecipheriv('aes-256-cbc',key,iv);
var dec_data = dec.update(cipher,'base64','utf8') + dec.final('utf8');

另外,使用base64进行解码,而不是二进制(因为在这里提到的场景中可能会出现https://stackoverflow.com/a/8770975/3739618)

我在另一篇文章中使用了这个示例代码,请查看它:https://stackoverflow.com/a/28181444/3739618

你好,伊格纳西奥

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12027847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档