Šifrovanie a haše
Funkcie skriptu TapHome pre šifrované a podpísané protokoly zariadení: AESENCRYPT a AESDECRYPT, HASH a HMAC s MD5 a SHA, RANDBYTES a príklad brány Bosch KM200.
Šifrovacie a hašovacie funkcie zostavia to, čo očakáva zariadenie so šifrovaným alebo podpísaným lokálnym rozhraním: šifrovanie AES, haše MD5 a SHA, podpisy HMAC a bezpečné náhodné bajty. Iba zostavujú hodnoty, takže fungujú v každom skripte. Všetky potrebujú Core 2026.1 v TapHome Next, build 40991 alebo novší (zatiaľ nie v oficiálnom vydaní). Base64, hexadecimálny text a kontrolné súčty CRC sú na stránke Kódovanie bajtov a kontrolné súčty.
Prijímajú bajtové dáta: collection<uint8>, blob alebo reťazec. Reťazec sa použije ako bajty ISO-8859-1. Na rozdiel od TOBYTES bez kódovania, ktorá iné znaky zmení na ?, je tu znak mimo ISO-8859-1 chybou — pre UTF-8 odovzdajte TOBYTES(text, "utf-8"). Výsledok je collection<uint8>.
HASH, HMAC
HASH vypočíta haš bajtových dát, HMAC ich haš s kľúčom (podpis).
| |
| Názov | Popis |
|---|---|
data | Bajtové dáta na hašovanie. |
key | Kľúč funkcie HMAC, bajtové dáta. |
algorithm | "MD5", "SHA1", "SHA256" alebo "SHA512", na veľkosti písmen nezáleží; prijímajú sa aj "SHA-1", "SHA-256" a "SHA-512". |
Návratová hodnota — collection<uint8> so 16, 20, 32 alebo 64 bajtmi.
Poznámky — HMAC berie kľúč ako prvý, v rovnakom poradí ako hmac.new(key, msg, digest) v Pythone.
Príklad
TOHEX(HASH("abc", "MD5"));
# Result: "900150983cd24fb0d6963f7d28e17f72"
TOHEX(HMAC("Jefe", "what do ya want for nothing?", "SHA256"));
# Result: "5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843"Chyby — HASH Unknown algorithm. Valid values are ‘MD5’, ‘SHA1’, ‘SHA256’, ‘SHA512’; HASH - data contains characters outside ISO-8859-1, convert the text with TOBYTES(text, “utf-8”); HASH - data must be a uint8 collection, a blob or a string. Hlásenia funkcie HMAC začínajú jej vlastným názvom a menujú argument.
Dostupnosť — Core 2026.1 v TapHome Next, build 40991 alebo novší (zatiaľ nie v oficiálnom vydaní).
AESENCRYPT, AESDECRYPT
AESENCRYPT zašifruje bajtové dáta algoritmom AES, AESDECRYPT ich dešifruje.
| |
| Názov | Popis |
|---|---|
data | Bajtové dáta. Dáta pre AESDECRYPT musia mať dĺžku, ktorá je násobkom 16 bajtov. |
key | 16, 24 alebo 32 bajtov: AES-128, AES-192 alebo AES-256. |
mode | "ECB" alebo "CBC", za ktorým môže nasledovať doplnenie, napríklad "CBC/PKCS7" alebo "ECB/ZEROS"; na veľkosti písmen nezáleží. |
iv | 16 bajtov, povinný pri CBC. ECB ho neberie — argument vynechajte alebo odovzdajte Null. |
| Doplnenie (padding) | AESENCRYPT | AESDECRYPT |
|---|---|---|
/PKCS7 (predvolené; /PKCS5, názov z Javy, znamená to isté) | Pridá doplnenie. | Odstráni ho. |
/ZEROS | Doplní posledný blok bajtmi 0x00; dáta, ktoré už končia na hranici bloku, nedostanú nič, prázdne dáta ostanú prázdne. | Odstráni všetky koncové bajty 0x00, aj tie, ktoré patria k dátam — použite ho pre text, napríklad JSON. |
/NONE | Bez doplnenia; dĺžka dát musí byť násobkom 16 bajtov. | Neodstráni nič. |
Návratová hodnota — collection<uint8>.
Poznámky — Zlý kľúč dokáže odhaliť len /PKCS7, a ani to vždy; pri /ZEROS a /NONE vráti zlý kľúč zlé bajty bez chyby. Zlý iv v režime CBC pokazí len prvých 16 bajtov a nikdy sa nenahlási.
Príklad
VAR key := BYTECOLLECTION("2b7e151628aed2a6abf7158809cf4f3c");
VAR iv := BYTECOLLECTION("000102030405060708090a0b0c0d0e0f");
VAR secret := AESENCRYPT("Hello World", key, "CBC", iv);
TOSTRING(AESDECRYPT(secret, key, "CBC", iv));
# Result: "Hello World"Chyby — AESDECRYPT - decryption failed, check the key, the iv and the padding (doplnenie /PKCS7 nesedí: zlý kľúč alebo dáta, ktoré neboli zašifrované s PKCS7); AESENCRYPT - key must be 16, 24 or 32 bytes long (AES-128, AES-192, AES-256), it is N; AESENCRYPT - CBC mode needs a 16-byte iv, it is N; AESENCRYPT - ECB mode does not use an iv, leave the argument out; AESENCRYPT Unknown mode. Valid values are ‘ECB’, ‘CBC’, optionally followed by ‘/PKCS7’ (or ‘/PKCS5’), ‘/ZEROS’ or ‘/NONE’; AESENCRYPT - with padding NONE the data length must be a multiple of 16 bytes, it is N; AESDECRYPT - encrypted data length must be a multiple of 16 bytes, it is N. Každá funkcia uvádza v hlásení svoj názov.
Dostupnosť — Core 2026.1 v TapHome Next, build 40991 alebo novší (zatiaľ nie v oficiálnom vydaní).
RANDBYTES
RANDBYTES vráti kryptograficky bezpečné náhodné bajty — pre iv režimu CBC, nonce alebo kľúč relácie.
| |
Návratová hodnota — collection<uint8> s count bajtmi, 1 až 2048; to isté ako secrets.token_bytes(n) alebo os.urandom(n) v Pythone.
Poznámky
- RAND a RANDINT nie sú bezpečné a na kľúč,
ivani nonce sa nesmú použiť. - Premenná s kolekciou priradená do inej premennej je tá istá kolekcia, preto pred
APPENDurobteCOPY— inak narastie ajiv.
Príklad — nový iv pred zašifrovanými dátami, ako ho posiela mnoho protokolov
VAR key := FROMHEX("2b7e151628aed2a6abf7158809cf4f3c");
VAR iv := RANDBYTES(16);
VAR body := COPY(iv);
APPEND(body, AESENCRYPT("Hello World", key, "CBC", iv));
TOSTRING(AESDECRYPT(COPY(body, 16), key, "CBC", COPY(body, 0, 16)));
# Result: "Hello World"Chyby — RANDBYTES: count must be between 1 and 2048.
Dostupnosť — Core 2026.1 v TapHome Next, build 40991 alebo novší (zatiaľ nie v oficiálnom vydaní).
Príklad — brána Bosch / Buderus KM200
HTTP rozhranie brány Bosch / Buderus KM200, ktorú používa aj IVT Rego 2000, tak, ako ho opisujú komunitné projekty (výrobca ho nezverejňuje). Telo odpovede je Base64 z dát AES-256-ECB doplnených nulami a kľúč sa skladá z dvoch hašov MD5:
VAR salt := BYTECOLLECTION("00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff"); # 32-byte vendor salt
VAR k1 := TOBYTES(REPLACE("xxxx-xxxx-xxxx-xxxx", "-", "")); # gateway password
APPEND(k1, salt);
VAR k2 := COPY(salt);
APPEND(k2, TOBYTES("my private password"));
VAR key := HASH(k1, "MD5");
APPEND(key, HASH(k2, "MD5")); # 32 bytes = AES-256
VAR r := SENDHTTPREQUEST("/system/healthStatus", "GET", "", "User-Agent: TeleHeater/2.2.3");
# value = a module variable that keeps the result
IF r.IsSuccess
value := PARSEJSON(TOSTRING(AESDECRYPT(FROMBASE64(r.Content), key, "ECB/ZEROS"), "utf-8"), "value");
ELSE
ADDERROR(r.StatusCode + " (" + r.ReasonPhrase + ")");
ENDPozrite aj — Funkcie Packet parsera, Kódovanie bajtov a kontrolné súčty, Text a kolekcie.