NodeMCU node.jsencryption

我试图build立node.js和NodeMCU之间的encryption通信。 经过一番努力之后,我可以使用node.js进行encryption,并在NodeMCU上进行解密。 反过来不起作用。 mscdex的答复工作。 因此,我修改了node.js代码以利于他人。 谢谢。

NodeMCU代码:

crypto = require('crypto'); cipher = crypto.encrypt("AES-CBC", "0123456789abcdef", "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 = '0123456789abcdef'; //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方面testing:

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

什么工作?

即使encryption的string有点不同,Node.jsencryption也会在NodeMCU上解密。

什么不起作用?

NodeMCU的encryptionstring没有被node.js解密。 我收到以下错误:

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

错误:错误:0606506D:数字信封例程:EVP_DecryptFinal_ex:在解密(/ home / pi / rampion / nodejs / test2)的Decipheriv.Cipher.final(crypto.js:153:26) js:22:19)在Object。 (module.js:422:10)处的Module._compile(module.js:413:34)处的(/home/pi/rampion/nodejs/test2.js:43:13)启动时,Function.Module.runMain(module.js:447:10)处的Function.Module._load(module.js:314:12)处的Module.load(module.js:357:32)(node.js:146 :18)

错误是由于mscdex在他的回复中强调的原因。

NodeMCU不使用PKCS填充,但节点的encryption模块在默认情况下使用/期望它,因此在通过decipher.setAutoPadding(false); calling解密调用.update()之前,需要禁用它decipher.setAutoPadding(false); calling decipher.setAutoPadding(false); calling

NodeMCU不使用PKCS填充,但节点的crypto模块默认使用/期望它,所以在解密时需要在调用.update()之前将其禁用:

 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; } 

更改之后,您将能够解密NodeMCU代码中已注释的hex和base64值。