Vážení zákazníci, v den státního svátku 17. 11. 2025 budeme mít zavřeno. Opět se na Vás těšíme následující pracovní den. E-shop Papouch.com je Vám k dispozici nepřetžitě. Příjemné podzimní dny.
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;