2017-09-18 2 views
0

私は、一般的な暗号を作成し、機能を解読している動作している私は、任意の文字列を提供しますが、私はsha256ハッシュ文字列に渡そうとするときに暗号がエラーをスローした場合、それが正常に動作しますコードがある -Nodejs暗号解読が矛盾

let crypto = require('crypto'); 

const secret = new Buffer('1234567890abcdef71234567890abcdef1234567890abcdef1234567890abcdef', 'hex'); 
const iv = new Buffer('1234567890abcdef1234567890abcdef', 'hex'); 

const config = { 
    secret: secret, 
    iv: iv 
}; 

function encrypt(data, sec, siv) { 
    let dataBuffer = ((data instanceof Buffer)?data:Buffer.from(data)); 
    let cipher = crypto.createCipheriv('aes-256-cbc', sec, siv); 
    let crypt = cipher.update(dataBuffer); 
    crypt += cipher.final('hex'); 

    return Buffer.from(crypt, 'hex'); 
} 

function decrypt(data, sec, siv) { 
    let dataBuffer = ((data instanceof Buffer)?data:Buffer.from(data)); 
    let decipher = crypto.createDecipheriv('aes-256-cbc', sec, siv); 
    let decrypt = decipher.update(dataBuffer); 
    decrypt += decipher.final(); 

    return Buffer.from(decrypt); 
} 

function main() { 
    let test = 'asdfqwerty'; 
    let secretBytes = crypto.randomBytes(32); 
    let secretHash = Buffer.from(crypto.createHmac('sha256', config.secret).update(secretBytes).digest('hex')); 

    console.log('\nTesting test string\n==================='); 
    console.log(test); 
    a = encrypt(test, config.secret, config.iv); 
    console.log(decrypt(a, config.secret, config.iv).toString()); 

    console.log('\nTesting test string\n==================='); 
    console.log(secretHash); 

    a = encrypt(secretHash, config.secret, config.iv); 
    console.log(decrypt(a, config.secret, config.iv).toString()); 
} 

try { 
    main(); 
} catch (e) { 
    console.log(e); 
} 

次のようにしかし、出力がある -

Testing test string 
=================== 
asdfqwerty 
asdfqwerty 

Testing test string 
=================== 
<Buffer 62 36 62 62 37 39 36 65 63 36 36 36 64 32 63 61 64 34 63 61 32 32 39 66 32 35 64 38 64 30 61 39 34 66 31 39 34 38 62 33 63 66 33 38 64 37 65 62 33 39 ... > 
Error: error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length 
    at Decipheriv.final (crypto.js:181:26) 
    at decrypt (/project/test2.js:24:23) 
    at main (/project/test2.js:43:15) 
    at Object.<anonymous> (/project/test2.js:47:3) 
    at Module._compile (module.js:573:30) 
    at Object.Module._extensions..js (module.js:584:10) 
    at Module.load (module.js:507:32) 
    at tryModuleLoad (module.js:470:12) 
    at Function.Module._load (module.js:462:3) 
    at Function.Module.runMain (module.js:609:10) 

それはで動作しますなぜ私が把握することはできません最初のテストケースはまだ2番目のテストケースで失敗します。ここで

は、いくつかの追加の研究の後、コード

+1

'typeof data === 'Buffer''は決して真実ではありません。 'typeof'は' 'string''、' 'number''、' 'boolean''、' 'function''、' 'object''、' 'symbol''、' 'undefined''のみ生成します。おそらく 'Buffer.isBuffer(data)'を意味するでしょう。 – Ryan

+0

あなたはとても正しいです。おかげさまで、私はスーパーベーシックであることが分かっているものに私の心を失いつつあると思っていました。私は 'typeof'をテストするために' instancesof'を使うべきです。しかし、これは基本的な問題を解決するものではありません。なぜなら暗号方式はバッファや文字列で動作するはずだからです – JayReardon

答えて

0

からrepl.it linkですが、私は問題がAES-256の期待と、暗号化するデータのブロックサイズに起因することを発見しました。暗号化されるデータは、予想されるブロックサイズ(すなわち、16バイト)よりも大きくすることはできない。ブロックが大きい場合、暗号はerror:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block lengthエラーをスローします。

大きなデータをaes-256-cbcで暗号化する場合、データを16バイト以下のブロックにチャンクし、各ブロックを暗号化し、それぞれの結果をセパレータの形式でパックする必要があります。

同様に解読するには、パックされた結果をセパレータで分割し、各ブロックを解読し、結果を再アセンブリする必要があります。