Měřicí moduly PAPAGO umí odesílat aktuálně naměřená data pomocí HTTP GETu. Umí posílat jednak klasický HTTP GET, jako většina našich Ethernetových a WiFi zařízení a jednak HTTP GET šifrovaný pomocí 128-bit šifry AES. V tomto článku Vám přinášíme jednoduchý návod jak zašifrovaný řetězec rozložit zpět na data.
AES šifrování je standardem v současných šifrovacích postupech. AES používá například i šifrování WPA2 používané na přístupových bodech pro WiFi. Více informací o šifrování AES se můžete dozvědět například zde na Wikipedii. Zpráva z modulu PAPAGO je kódována pomocí šifry AES 128 bit, metoda CFB bez paddingu.
Papago 2PT ETH odešle po stisku testovacího tlačítka tento HTTP GET:
decrypt.php?encrypted_data=%DC%BD%5D%C1%DE%C4%0A%66%8B%69%0C%6D%8D%70%B9%11%EA%8C%19%2A%93%F1%71%87%B7%47%94%77%C7%A2%71%D9%1A%3D%BA%21%CF%0D%D5%42%1F%01%23%7B%AF%31%C9%6D%D6%EC%87%C4%39%E4%76%84%29%A9%C1%31%74%05%31%3F%96%43%13%3C%73%08%D6%8F%56%F5%6C%A2%77%53%C6%A7%10%8F%47%A5%A7%2D%04%9B%58%A0%94
Stejným způsobem jsou šifrované i gety s naměřenými hodnotami.
Pro dešifrování HTTP getu z modulu PAPAGO je v následujícím příkladu použito OpenSSL (dokumentace openssl_decrypt):
<!DOCTYPE html> <html> <head> <title>Example of AES decryption from PAPAGO by papouch.com</title> <meta name="author" content="papouch.com"> </head> <body> <?php if (!isset($_GET["encrypted_data"])) { // If the expected parameter does not exist, exit echo '$_GET[encrypted_data] not found!'; die; }; $encrypted_data = $_GET["encrypted_data"]; $key = "aaaaaaaaaaaaaaaa"; // Encryption key from Papago $iv = substr($encrypted_data, 0, 16); // First 16 bytes is initialization vector $data = substr($encrypted_data, 16); // Rest is encrypted data $decrypted = openssl_decrypt($data, 'aes-128-cfb', $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv); echo "decrypted: ".$decrypted; echo "
iv: ".bin2hex($iv);
// decrypted: mac=0080A393A273&type=Papago 2PT ETH&guid=PAPAGO-TEST-GUID&description=TEST // iv: dcbd5dc1dec40a668b690c6d8d70b911 ?> </body> </html>
Zde je příklad dešifrování AES v prostředí Node.js, pomocí vestavěného modulu Crypto (dokumentace zde), což je také wrapper OpenSSL:
const crypto = require("crypto"); const key = Buffer.from("aaaaaaaaaaaaaaaa", 'utf-8'); // encryption key from Papago const encrypted_data = "%DC%BD%5D%C1%DE%C4%0A%66%8B%69%0C%6D%8D%70%B9%11%EA%8C%19%2A%93%F1%71%87%B7%47%94%77%C7%A2%71%D9%1A%3D%BA%21%CF%0D%D5%42%1F%01%23%7B%AF%31%C9%6D%D6%EC%87%C4%39%E4%76%84%29%A9%C1%31%74%05%31%3F%96%43%13%3C%73%08%D6%8F%56%F5%6C%A2%77%53%C6%A7%10%8F%47%A5%A7%2D%04%9B%58%A0%94"; var encrypted = encrypted_data.replace(/\%+/g, ''); // remove percentages var iv = Buffer.from(encrypted.slice(0, 32), 'hex'); // first 16 bytes (32 characters) is vector var data = Buffer.from(encrypted.slice(32), 'hex'); var decipher = crypto.createDecipheriv('aes-128-cfb', key, iv); var decrypted = decipher.update(data, "hex", "utf-8"); decrypted += decipher.final("utf8"); console.log("decrypted:", decrypted); console.log('iv:', iv.toString('hex')); // decrypted: mac=0080A393A273&type=Papago 2PT ETH&guid=PAPAGO-TEST-GUID&description=TEST // iv: dcbd5dc1dec40a668b690c6d8d70b911
V prostředí NodeREDu je třeba použít pro dešifrování CryptoJS (dokumentace zde). Do flow přidejte node function a do něj vložte tento kód:
const CryptoJS = global.get("cryptojs"); const key = CryptoJS.enc.Latin1.parse("abcdefghijklmnox"); // Encryption key as ASCII string (16 chars) //const key = CryptoJS.enc.Hex.parse("6162636465666768696a6b6c6d6e6f78"); // Encryption key as HEX string (32 chars) let encrypted_data = msg.payload.encrypted_data; let encryptedHex = encrypted_data.replaceAll("%",""); let encrypted = Buffer.from(encryptedHex, 'hex'); let iv = CryptoJS.enc.Hex.parse(encrypted.slice(0, 16).toString('hex')); let data = encrypted.slice(16).toString('base64'); let decrypted = CryptoJS.AES.decrypt(data, key, { mode: CryptoJS.mode.CFB, padding: CryptoJS.pad.NoPadding, iv: iv }); msg.payload = decrypted.toString(CryptoJS.enc.Latin1); msg.payloadHex = decrypted.toString(CryptoJS.enc.Hex); msg.vector = encrypted.slice(0, 16).toString('hex'); return msg;