Websocket Connection Encryption Python 3

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Jayson80
User
Beiträge: 3
Registriert: Dienstag 19. September 2017, 12:39

Samstag 16. Dezember 2017, 12:01

Hallo Leute,

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:
  1. Acquire​​ the​​ Miniservers public​ key​ ​--> ​{publicKey} (Format:​ ​X.509​ ​encoded​ ​ key​ ​ in​ ​ ANS.1)
  2. Generate​ ​a ​AES256​ ​key​ ​-->​ ​{key}​ ​(Hex)
  3. Generate​ ​a ​random​ ​AES​ ​iv​ ​(16​ ​ byte)​ ​-->​ ​{iv}​​ (Hex)
  4. RSA​ ​Encrypt​ ​the​ ​AES​ ​key+iv​ ​with​ ​the​ ​​{publicKey}​​ ​-->​ ​{session-key}​ ​(Base64) ({key}:{iv}​ is​ ​the​ ​payload​​ that needs​ to​ be​​ encrypted​ using​ ​RSA)
  5. Exchange​ ​keys​ ​via​ ​“jdev/sys/keyexchange/{session-key}​”
  6. Generate​ ​a random​​ salt,​ ​hex​ ​string​ ​(length​ may​ vary,​ e.g. 2 bytes)​ --> ​{salt}
Also ich habe schon folgendes gemacht:

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'
Ist das so richtig? Stimmt das Format?

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)
Ab Punkt 4 stehe ich komplett auf dem Schlauch.
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:])]
Weiß aber nicht ob es schon die Lösung ist oder ob das komplett der falsche Ansatz ist.

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
__deets__
User
Beiträge: 3110
Registriert: Mittwoch 14. Oktober 2015, 14:29

Samstag 16. Dezember 2017, 14:04

In Schritt 4 sollst du mit RSA verschlüsseln. Nicht mit AES. Und in Punkt 3 eine 16 Byte sequenz aus Zufallszahlen generieren. Für die und den in 1 generierten key musst du einen hexdigest bilden, nicht den digest. Entweder gibt es die Methode hexdigest direkt (sollte es), oder du benutzt binascii.hexlify, für beide Werte (key und iv)
Antworten