2016-05-17 3 views
7

次のコードにアップグレードした後に無効なキーの長さは、ノードのJsで正しく動作5.7.0当社の支払いゲートウェイサービスへの要求の暗号化と復号化にNodeJS 6

function Encrypt(plainText, workingKey) { 
    var m = crypto.createHash('md5'); 
    m.update(workingKey); 
    var key = m.digest('binary'); 
    var iv = '\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f';  
    var cipher = crypto.createCipheriv('aes-128-cbc', key, iv);  
    var encoded = cipher.update(plainText, 'utf8', 'hex'); 
    encoded += cipher.final('hex'); 
    return encoded; 
}; 


function Decrypt(encText, workingKey) { 
    var m = crypto.createHash('md5'); 
    m.update(workingKey) 
    var key = m.digest('binary'); 
    var iv = '\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f'; 
    var decipher = crypto.createDecipheriv('aes-128-cbc', key, iv); 
    var decoded = decipher.update(encText, 'hex', 'utf8'); 
    decoded += decipher.final('utf8'); 
    return decoded; 
}; 

しかしNodeJS 6.0にアップグレードした後に(また、6.1を試してみました)次のエラーが発生します。

Debug: internal, implementation, error 
Error: Uncaught error: Invalid key length 
at Error (native) 
at new Cipheriv (crypto.js:184:16) 
at Object.Cipheriv (crypto.js:182:12) 

キーの長さは常に16文字(つまり128ビット)で、アップグレード前に動作していました。なぜこの問題が起きているのでしょうか?

+0

6.xは安定したビルドにはほど遠いですが、それを使用する必要がありますか?私たちは5.5.0を弊社で使用していますが、私は6.xも試みましたが、1時間後に私は戻ってきました。 – libik

+2

なぜ "バイナリ"文字列を使うのですか?ちょうどバッファを使用して、それで済ませてください。 'm.digest( 'binary')'からバイナリを削除する。 –

+0

@ Artjom-b。どうもありがとうございました。あなたが提案したことが働いた。あなたはなぜそれが働いたのか説明するのに十分親切でしょうか? – Anomaly211

答えて

6

私は誰かを助けるかもしれないという希望でここに答えを掲示しています。

問題は、キーに「バイナリ」ダイジェストを使用しているために発生しているようです。 解決策は、単純にダイジェスト関数を呼び出して、代わりにキーとしてバッファを格納することです。

固定コードが

function Encrypt(plainText, workingKey) { 
    var m = crypto.createHash('md5'); 
    m.update(workingKey); 
    var key = m.digest(); 
    var iv = '\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f';  
    var cipher = crypto.createCipheriv('aes-128-cbc', key, iv);  
    var encoded = cipher.update(plainText, 'utf8', 'hex'); 
    encoded += cipher.final('hex'); 
    return encoded; 
}; 

として答えを@ Artjom-Bへの感謝を読み込みます。

+1

ソリューションを投稿していただきありがとうございます。私はIVを除いてまったく同じ問題を抱えていました。私の場合、16バイトであるにもかかわらずIV長さが無効であると主張されていました。バイナリ文字列からバッファに切り替えることで問題は解決されました。 – Michael

+0

私はこの変更を加えましたが、現在ccavenueサーバーにリダイレクトされたときにエラー10001が表示されます。 – MegaMind