0

暗号ライブラリを使用して、ノードでデータをフィールド レベルで暗号化しようとしています。

$ や - などの特殊文字を除いて、問題なく動作するようです。

例「プライススミス」

理由がわからない

function encrypt(data, key) {
    if (data === null)
        return null
    else if (typeof data === 'undefined')
        return undefined;
    else if (data === '')
        return '';

    var iv = crypto.randomBytes(16);

    var cipher = crypto.createCipheriv('aes-256-cbc', key, iv);
    cipher.update(data, 'utf8', 'binary');
    return Buffer.concat([iv, cipher.final()]).toString('base64');
}

function decrypt(cipher, key) {
    if (cipher === null)
        return null
    else if (typeof cipher == 'undefined')
        return undefined;
    else if (cipher === '')
        return '';

    var cipher = new Buffer(cipher, 'base64');
    var iv = cipher.slice(0, 16);
    var ciphertext = cipher.slice(16);

    var decipher = crypto.createDecipheriv('aes-256-cbc', key, iv);
    decipher.update(ciphertext, 'binary', 'utf8');
    return decipher.final('utf8');
}

エラー

TypeError: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt
at Decipheriv.Cipher.final (crypto.js:287:27)

フィールド値ごとに個別の IV が使用されます。それ以外の場合、同じフィールド値は同じ暗号を持つことになります。そのため、IV を最初の 16 バイトとして保存し、復号化する前にそれをつなぎ合わせます。多分これは私の問題領域でしょうか?

ありがとう!アンドリュー

4

2 に答える 2

2

これはおそらく、使用されている文字の種類ではなく、平文のサイズによるものです。update()からの応答とからの応答を連結する必要がありますfinal()+=演算子は使用しないでください。配列では常に機能するとは限りません

于 2014-01-15T23:56:35.420 に答える
1

ありがとう@owlstead!作業コードは次のとおりです。

function encrypt(data, key) {
    if (data === null)
        return null
    else if (typeof data === 'undefined')
        return undefined;
    else if (data === '')
        return '';

    var iv = crypto.randomBytes(16);

    var cipher = crypto.createCipheriv('aes-256-cbc', key, iv);
    var encrypted = [cipher.update(data)];
    encrypted.push(cipher.final());

    return Buffer.concat([iv, Buffer.concat(encrypted)]).toString('base64');
}

function decrypt(cipher, key) {
    if (cipher === null)
        return null
    else if (typeof cipher == 'undefined')
        return undefined;
    else if (cipher === '')
        return '';

    var cipher = new Buffer(cipher, 'base64');
    var iv = cipher.slice(0, 16);
    var ciphertext = cipher.slice(16);

    var decipher = crypto.createDecipheriv('aes-256-cbc', key, iv);
    var decrypted = [decipher.update(ciphertext)];
    decrypted.push(decipher.final());

    return Buffer.concat(decrypted).toString('utf8');
}
于 2014-01-16T16:37:21.690 に答える