暗号ライブラリを使用して、ノードでデータをフィールド レベルで暗号化しようとしています。
$ や - などの特殊文字を除いて、問題なく動作するようです。
例「プライススミス」
理由がわからない
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 バイトとして保存し、復号化する前にそれをつなぎ合わせます。多分これは私の問題領域でしょうか?
ありがとう!アンドリュー