Dešifrování AES v http getu z modulu PAPAGO

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.

Jak šifrovaný get vypadá?

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.

Příklad dešifrování AES v PHP

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>

Příklad dešifrování AES v Node.js

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

Příklad dešifrování AES v Node-RED

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;

 

Vytvořeno08.10.2015
Na vašem soukromí nám záleží
Tento internetový obchod ukládá soubory cookies, které pomáhají k jeho správnému fungování. Využíváním našich služeb s jejich používáním souhlasíte.
Povolit všePodrobné nastavení