Vážení zákazníci, na Velký pátek 18. 4. a Velikonoční pondělí 21. 4. budeme mít zavřeno. Opět se na Vás těšíme od úterý 22. 4. 2025. Užijte si svátky jara!
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;