5

PHP と Nodejs を使用して、OpenSSL による対称暗号化に取り組んでいます。PHP は OpenSSL ライブラリを使用し、Node.js 復号化は実装された暗号に基づいています。問題は、Node.js の復号化されたテキストが部分的にしか正しくないことです。

暗号化のための PHP 関数

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 での復号化

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});

結果

# 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

問題はパディングに関係しているのではないかと推測していますが、正直なところ、わかりません。

ヘルプを読んでくれてありがとう!

4

1 に答える 1

5

ノード コードでは、メッセージの最後の部分が欠落しています。

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

よろしく、 イグナシオ

于 2015-01-27T22:56:31.923 に答える