Jak dešifrovat AES data odeslaná modulem PAPAGO

Jak dešifrovat AES data odeslaná modulem PAPAGO
Jak dešifrovat AES data odeslaná modulem PAPAGO (1)
Jak dešifrovat AES data odeslaná modulem PAPAGO (2)
Jak dešifrovat AES data odeslaná modulem PAPAGO (3)

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í
Papouch store s.r.o Reviews with ekomi.co.uk