2016-04-08 12 views
1

私はnode.jsとNodeMCUの間に暗号化された通信を設定しようとしていました。いくつかの苦労の末、私はnode.jsを使って暗号化し、NodeMCUで解読することができました。逆は機能していません。 mscdexの回答がうまくいった。したがって、他の人の利益のためにnode.jsコードを修正しました。ありがとう。NodeMCU node.js crypto

NodeMCUコード:

crypto = require('crypto'); 
cipher = crypto.encrypt("AES-CBC", "abcdef", "some clear text data",'0000000000000000') 
print(crypto.toHex(cipher)) 
//95f27285ba29aeae1e48cfc6e821b0a15a0dd6c5a1e636e10c5497c460ed057b 
print(crypto.toBase64(cipher)) 
//lfJyhboprq4eSM/G6CGwoVoN1sWh5jbhDFSXxGDtBXs= 

Node.jsの作業コード:

var crypto=require('crypto'); //crypto module is required 
algorithm = 'aes-128-cbc'; //define algorithm 
password = 'abcdef'; //define key 
iv='0000000000000000'; // define vector for cbc.. Must be 16 char length 
function encrypt(text,opts) { 
    if(typeof opts === 'undefined') opts={} 
    // if opts is not defined, set empty list 
    var cipher = crypto.createCipheriv(algorithm,password,iv) 
    // create cipher 
    //if setAutoPadding is undefined or set as true set setAutoPadding as true 
    if(opts['setAutoPadding'] || typeof opts['setAutoPadding'] !== 'undefined') { 
    cipher.setAutoPadding(opts['setAutoPadding']); 
    //if encoding is defined, then set it as encoding else set default hex 
    if(opts['encoding'] && typeof opts['encoding'] !== 'undefined') { 
     var crypted = cipher.update(text,'utf8',opts['encoding']) 
     crypted += cipher.final(opts['encoding']); 
     return crypted 
    } else { 
     var crypted = cipher.update(text,'utf8','hex') 
     crypted += cipher.final('hex'); 
     return crypted; 
    } 
    } 

    function decrypt(text,opts) { 
    if(typeof opts === 'undefined') opts={} 
    // if opts is not defined, set empty list 
    var decipher = crypto.createDecipheriv(algorithm,password,iv) 
    // create cipher 
    //if setAutoPadding is undefined or set as true set setAutoPadding as true 
    if(opts['setAutoPadding'] || typeof opts['setAutoPadding'] !== 'undefined') { 
     decipher.setAutoPadding(opts['setAutoPadding']); 
    } 
    var dec; // define a local variable 
    //if encoding is defined, then set it as encoding else set default hex 
    if(opts['encoding'] && typeof opts['encoding'] !== 'undefined') { 
     dec = decipher.update(text,opts['encoding'],'utf8') 
    } else { 
     dec = decipher.update(text,'hex','utf8') 
    } 
    dec += decipher.final('utf8'); 
    return dec; 
    } 
    var hw = encrypt("some clear text data",{'encoding':'base64'}) 
    //encrypt with base64 encoding, padding true 
    console.log(hw) // prints base64 encoded encrypted string 
    console.log('Node.js-base64: ',decrypt(hw,{'encoding':'base64'})) 
    // outputs some clear text data 
    hw = encrypt("some clear text data") 
    // encrypt default encoding hex, defaule padding true 
    console.log(hw) // prints hex encoded encrypted string 
    console.log('Node.js-hex: ',decrypt(hw)) // outputs some clear text data 
    jw='lfJyhboprq4eSM/G6CGwoVoN1sWh5jbhDFSXxGDtBXs=' 
    // NodeMCU base64 encoded, padding false encrypted string 
    console.log('NodeMCU-base64: ',decrypt(jw, { 'setAutoPadding':false,'encoding':'base64'})); 
    // outputs some clear text data 
    jw='95f27285ba29aeae1e48cfc6e821b0a15a0dd6c5a1e636e10c5497c460ed057b' 
    // nodeMCU, hex encoded, padding false encrypted string 
    console.log('NodeMCU-hex: ',decrypt(jw,{'setAutoPadding':false})); 
    // outputs some clear text data 
    console.log("over") 

今再びNodeMCU側のテスト:何をして働いていた

cipher=encoder.fromBase64("lfJyhboprq4eSM/G6CGwoYmVZaNMY5xL2kR7V2E1Aho=") 
    key="abcdef" 
    print(crypto.decrypt("AES-CBC", key, cipher,'0000000000000000')) 
    some clear text data 
    cipher=encoder.fromBase64("lfJyhboprq4eSM/G6CGwoVoN1sWh5jbhDFSXxGDtBXs=") 
    key="abcdef" 
    print(crypto.decrypt("AES-CBC", key, cipher,'0000000000000000')) 
    some clear text data 

Node.js暗号化は、暗号化された文字列が少し異なっていても、NodeMCUで復号化されています。

何が問題なのですか?

NodeMCUの暗号化された文字列は、node.jsによって復号化されません。私は、次のエラーを取得しています:

crypto.js:153 
var ret = this._handle.final(); 

Error: error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length at Error (native) at Decipheriv.Cipher.final (crypto.js:153:26) at decrypt (/home/pi/rampion/nodejs/test2.js:22:19) at Object. (/home/pi/rampion/nodejs/test2.js:43:13) at Module._compile (module.js:413:34) at Object.Module._extensions..js (module.js:422:10) at Module.load (module.js:357:32) at Function.Module._load (module.js:314:12) at Function.Module.runMain (module.js:447:10) at startup (node.js:146:18)

エラーが彼の返事にMSCDEXによって強調理由によるものでした。

function decrypt(text){ 
    var decipher = crypto.createDecipheriv(algorithm,password,iv) 
    decipher.setAutoPadding(false); 
    var dec = decipher.update(text,'hex','utf8') 
    dec += decipher.final('utf8'); 
    return dec; 
} 

function decryptB(text){ 
    var decipher = crypto.createDecipheriv(algorithm,password,iv) 
    decipher.setAutoPadding(false); 
    var dec = decipher.update(text,'base64','utf8') 
    dec += decipher.final('utf8'); 
    return dec; 
} 

をその変更後は必要になります、:復号化するときに.update()を呼び出す前に、それを無効にする必要がありますので、

NodeMCU does not utilize PKCS padding but node's crypto module does use/expect it by default, so you need to disable it before calling .update() when decrypting by decipher.setAutoPadding(false); calling

答えて

4

NodeMCUは、PKCSパディングを利用していないが、ノードのcryptoモジュールを使用すると、/デフォルトでは、それを期待していませんNodeMCUコードのコメント付き16進数とbase64値を解読できるようにしてください。

+0

それは働いた。ありがとう –