ich habe ein kleines Problem und komme einfach nicht weiter. Habe es wirklich versucht aber bekomme
es einfach nicht hin. Ich dreh mich glaube ich Kreis. Vielleicht könnt ihr mir ja helfen.
Und zwar habe für meine Hausautomation ein Binding geschrieben. Ich verbinde mich per
Websocket mit der Hausautomation und kann dann alle Events abfangen und auch neue Events
schicken. Diese Verbindung läuft auch tadellos nur ab dem nächstem Jahr wird die Authentifizierung
geändert und jetzt muss ich noch ein wenig tiefer in die Verschlüsselung einsteigen. Und das habe ich noch
nie gemacht. Wahrscheinlich ist es gar nicht so schwer. Aber mir fehlen komplett die Vorkenntnisse.
Jetzt zum Problem.
In der Schnittstellenbeschreibung steht folgendes drin für den ersten Verbindungsaufbau:
- Acquire the Miniservers public key --> {publicKey} (Format: X.509 encoded key in ANS.1)
- Generate a AES256 key --> {key} (Hex)
- Generate a random AES iv (16 byte) --> {iv} (Hex)
- RSA Encrypt the AES key+iv with the {publicKey} --> {session-key} (Base64) ({key}:{iv} is the payload that needs to be encrypted using RSA)
- Exchange keys via “jdev/sys/keyexchange/{session-key}”
- Generate a random salt, hex string (length may vary, e.g. 2 bytes) --> {salt}
Zu Punkt 1:
Das bekomme ich hin. Ich bekomme als Antwort einen Public Key als String zurück mit den üblichen
"-----BEGIN PUBLIC KEY-----" und -----END PUBLIC KEY-----usw.
Zu Punkt 2:
Das habe ich so gemacht:
Code: Alles auswählen
import hashlib
from Crypto import Random
from Crypto.Cipher import AES
key = hashlib.sha256(Random.new().read(AES.block_size)).digest()
#key z.B. -> b'\xf7>\x9bx\x82\x829\x9b\\\xeaP#\xd1\xd9(\xc2\x0cC\xa5\xff\x19\xf5\x1a\xe5\xc5qQ\xecr\xbd\xd7\x96'
Zu Punkt 3:
Da weiß ich echt nicht was ich da machen soll.
Habe es so versucht:
Code: Alles auswählen
from Crypto import Random
from Crypto.Cipher import AES
iv = Random.new().read(AES.block_size)
Habe schon sehr viel gesucht weiß aber nicht wie ich die Beispiele auf mein Problem anwenden kann.
Habe das hier schon gefunden:
https://github.com/nvie/SimpleAES/blob/ ... _init__.py
Code: Alles auswählen
import base64
import hashlib
from Crypto import Random
from Crypto.Cipher import AES
class AESCipher(object):
def __init__(self, key):
self.bs = 32
self.key = hashlib.sha256(key.encode()).digest()
def encrypt(self, raw):
raw = self._pad(raw)
iv = Random.new().read(AES.block_size)
cipher = AES.new(self.key, AES.MODE_CBC, iv)
return base64.b64encode(iv + cipher.encrypt(raw))
def decrypt(self, enc):
enc = base64.b64decode(enc)
iv = enc[:AES.block_size]
cipher = AES.new(self.key, AES.MODE_CBC, iv)
return self._unpad(cipher.decrypt(enc[AES.block_size:])).decode('utf-8')
def _pad(self, s):
return s + (self.bs - len(s) % self.bs) * chr(self.bs - len(s) % self.bs)
@staticmethod
def _unpad(s):
return s[:-ord(s[len(s)-1:])]
Ich weiß es ist sehr viel aber ich habe das Problem, dass ich nicht weiß an welcher Stelle ich schon den Fehler mache.
Vielleicht könnten wir zusammen successive das Problem lösen.
Die Binding an die Hausautomation gibt es schon in NodeJs. Da habe ich auch schon mal in den Code reingeschaut.
Der genau Part der Binding findet ihr hier falls euch das was hilft:
https://github.com/alladdin/node-lox-ws ... ken-Enc.js
Ich wäre echt froh wenn ich da weiter kommen würde. Vielleicht hat einer ja ne Idee.
Viele Grüße
Jojo