TapHome

Titkosítás és hash-ek

TapHome szkriptfüggvények titkosított és aláírt eszközprotokollokhoz: AESENCRYPT és AESDECRYPT, HASH és HMAC MD5-tel és SHA-val, RANDBYTES, valamint egy Bosch KM200 példa.

A titkosító és hash-függvények azt állítják elő, amit egy titkosított vagy aláírt helyi felületű eszköz vár: AES titkosítást, MD5 és SHA hash-eket, HMAC aláírásokat és biztonságos véletlen bájtokat. Csak értékeket állítanak elő, ezért minden szkriptben működnek. Mindegyikhez Core 2026.1 a TapHome Next csatornán, build 40991 vagy újabb (még nem része a hivatalos kiadásnak) szükséges. A Base64, a hexadecimális szöveg és a CRC ellenőrzőösszegek a Bájtkódolások és ellenőrzőösszegek oldalon vannak.

Bájtadatokat fogadnak: collection<uint8> gyűjteményt, blobot vagy szöveget. A szöveg ISO-8859-1 bájtokként kerül felhasználásra. A kódolás nélküli TOBYTES függvénnyel ellentétben, amely a többi karaktert ? jellé alakítja, itt az ISO-8859-1-en kívüli karakter hiba — UTF-8-hoz add át a TOBYTES(text, "utf-8") értéket. Az eredmény collection<uint8>.

HASH, HMAC

A HASH a bájtadatok hash-ét számolja, a HMAC a kulcsos hash-üket (aláírást).

1
2
HASH(data, algorithm)
HMAC(key, data, algorithm)
NévLeírás
dataA hash-elendő bájtadatok.
keyA HMAC kulcsa, bájtadatok.
algorithm"MD5", "SHA1", "SHA256" vagy "SHA512", a kis- és nagybetű nem számít; a "SHA-1", "SHA-256" és "SHA-512" is elfogadott.

Visszatérési érték — 16, 20, 32 vagy 64 bájtos collection<uint8>.

Megjegyzések — A HMAC elsőként a kulcsot veszi át, ugyanabban a sorrendben, mint a Python hmac.new(key, msg, digest) függvénye.

Példa

TOHEX(HASH("abc", "MD5"));
# Result: "900150983cd24fb0d6963f7d28e17f72"
TOHEX(HMAC("Jefe", "what do ya want for nothing?", "SHA256"));
# Result: "5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843"

Hibák — 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. A HMAC üzenetei a saját nevével kezdődnek, és megnevezik az argumentumot.

Elérhetőség — Core 2026.1 a TapHome Next csatornán, build 40991 vagy újabb (még nem része a hivatalos kiadásnak).

AESENCRYPT, AESDECRYPT

Az AESENCRYPT AES-sel titkosítja a bájtadatokat, az AESDECRYPT visszafejti őket.

1
2
AESENCRYPT(data, key, mode [, iv])
AESDECRYPT(data, key, mode [, iv])
NévLeírás
dataBájtadatok. Az AESDECRYPT adatainak hossza 16 bájt többszöröse kell, hogy legyen.
key16, 24 vagy 32 bájt: AES-128, AES-192 vagy AES-256.
mode"ECB" vagy "CBC", amelyet a kitöltés követhet, például "CBC/PKCS7" vagy "ECB/ZEROS"; a kis- és nagybetű nem számít.
iv16 bájt, a CBC megköveteli. Az ECB nem használ ilyet — hagyd ki az argumentumot, vagy adj át Null értéket.
Kitöltés (padding)AESENCRYPTAESDECRYPT
/PKCS7 (alapértelmezett; a /PKCS5, a Java-beli név, ugyanazt jelenti)Hozzáadja a kitöltést.Eltávolítja.
/ZEROSAz utolsó blokkot 0x00 bájtokkal tölti fel; a blokkhatáron már végződő adat nem kap semmit, az üres adat üres marad.Eltávolítja az összes záró 0x00 bájtot, azokat is, amelyek az adathoz tartoznak — szöveghez, például JSON-hoz használd.
/NONENincs kitöltés; az adat hosszának 16 bájt többszörösének kell lennie.Nem távolít el semmit.

Visszatérési érték — collection<uint8>.

Megjegyzések — Hibás kulcsot csak a /PKCS7 vehet észre, és az sem mindig; /ZEROS és /NONE esetén a hibás kulcs hibaüzenet nélkül ad hibás bájtokat. A CBC módban a hibás iv csak az első 16 bájtot rontja el, és soha nem jelez hibát.

Példa

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"

Hibák — AESDECRYPT - decryption failed, check the key, the iv and the padding (a /PKCS7 kitöltés nem egyezik: hibás kulcs, vagy nem PKCS7-tel titkosított adat); 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. Mindegyik függvény a saját nevét írja az üzenetbe.

Elérhetőség — Core 2026.1 a TapHome Next csatornán, build 40991 vagy újabb (még nem része a hivatalos kiadásnak).

RANDBYTES

A RANDBYTES kriptográfiailag biztonságos véletlen bájtokat ad vissza — CBC módú iv-hez, nonce-hoz vagy munkamenetkulcshoz.

1
RANDBYTES(count)

Visszatérési érték — count bájtos collection<uint8>, 1 és 2048 között; ugyanaz, mint a Python secrets.token_bytes(n) vagy os.urandom(n) függvénye.

Megjegyzések

  • A RAND és a RANDINT nem biztonságosak, kulcshoz, iv-hez vagy nonce-hoz nem szabad használni.
  • Egy másik változóhoz rendelt gyűjteményváltozó ugyanaz a gyűjtemény, ezért APPEND előtt készíts COPY másolatot — különben az iv is megnő.

Példa — új iv a titkosított adat előtt, ahogy sok protokoll küldi

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"

Hibák — RANDBYTES: count must be between 1 and 2048.

Elérhetőség — Core 2026.1 a TapHome Next csatornán, build 40991 vagy újabb (még nem része a hivatalos kiadásnak).

Példa — Bosch / Buderus KM200 átjáró

Egy Bosch / Buderus KM200 átjáró HTTP felülete, amelyet az IVT Rego 2000 is használ, úgy, ahogy közösségi projektek leírják (a gyártó nem teszi közzé). A válasz törzse nullákkal kitöltött AES-256-ECB adat Base64 alakban, a kulcs pedig két MD5 hash-ből áll:

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 + ")");
END

Lásd még — Packet parser függvények, Bájtkódolások és ellenőrzőösszegek, Szöveg és gyűjtemények.