[Socket] Fragen zu recv



  • Hullo

    ich schrieb gerade an einem art IRC Client/Server bei dem die Nachrichten "verschluesselt" (ja ne eigene Verschluesselung) uebertragen werden sollen.

    Die Nachrichten zwischen dem Server und dem Client bestehen aus einerm Header, der die Laenge der Nachricht, und den Typ der Nachricht definiert. Der Header ist bei allen Nachrichten gleich lang, der Datenteil allerdings nicht. Das Problem war jetzt das ja alle eingehenden "Packete" gebuffert werden, und dann ein einem FIFO Speicher mittels recv abrufbar sind. (Also so hab ichs verstanden, wenns nicht so ist mitte verbessern)
    Mein Problem ist jetzt das ich nicht die gesammte Nachricht verschluesseln kann, weil ich ja nicht weiss wie lange die Nachricht ist. Im Moment hab ich das nur so loesen koennen das der Header unverschluesselt uebertragen wird, und ich aus diesem dann auslese wie lang der Datenteil ist.

    Wie ürder ihr das machen? Wie macht man das richtig?



  • Du kannst ja einen Streamcipher ala RC4 benutzen.

    (Wobei Streamcipher kaum erforscht sind!)

    btw. ich verschieb das mal in das rudpf da es sich ja nicht um ein Linux spezifisches Problem, sondern um ein allgemeines Design/Kryptographie Problem handelt.



  • Dieser Thread wurde von Moderator/in kingruedi aus dem Forum Linux/Unix in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • du könntest einen verschlüsselten und einen unverschlüsselten header verschicken
    wobei der unverschlüsselte an sich nur aus der länge und ggf nem crc besteht.
    ich persönlich häng gern am schluss noch n terminierungszeichen dran



  • hmm, das mit dem doppelten header ist keine schlechte Idee.

    Was ich mich aber noch gefragt habe ist, wie kann man den am besten mit dem Fall umgehn das jemand ein Paket mit einer ungeueltigen Laengenangbe schickt.

    zB: im rev Buffer stehn die folgende Pakete

    |Header1-Data1|Header2-Data2|Header3-Data3|HeaderN-DataN|.....

    Nromalerweise lese ich den Header1 aus, und abhaengig von diesem, lese ich dann NByte welche zum Datenteil Data1 gehoeren. Wenn aber Header2 eine falsche Laengenangabe enthalten wuerde, wuerde ich sagen wir mal zuviele einlesen, also Data2 und auch einen Teil von Header3, dann wuerde ich beim neachsten mal lesen aus dem Buffer ja sehr warscheinlich einen ungueltigen Header auslesen. Somit waere das Programm "gestolpert" und koennte jetzt nicht mehr Header von Datan unterscheiden.

    Was koennte man dagegen tun? Und vorallem wenn ich ein Stop Zeichen nach sagen wir mal jedem Daten Teil setzen wuerde, wie kann ich diesen dann von "normalen" Zeichen unterscheiden? (Kodierung?)



  • stimmt is bei dir ein problem das nächste paket zu finden wenn du grad mitten drin bist

    wie wärs damit
    [0][Header][Daten][255]

    d.h. du parst den code, schaust nach einem byte mit ner 0... wenn du eins hast
    hast nimmst du an, dass danach der header kommt.
    aus dem header holst du die länge und springst ans ende um zu schaun ob da 1 byte mit ner 255 steht... wenn ja gehst du von ner kompletten nachricht aus
    wenn nich parst du weiter nach nullen



  • @Sovok
    Wenn ein Angreifer es schafft Pakete einzuschleusen, dann bringt die Technik auch nichts.

    Man muss ja nur folgendes schicken

    [0][header:länge des folgenden pakets]                                     Angreifer
                                          [0][header][daten][255]              Normaler Sender
    

    Wenn man vor TCP Spoofing angst hat, muss man wohl oder übel jedes Paket signieren. Ich würde mir mal SSL/TLS angucken, wie das dort gehandelt wird.

    @mm-motm
    btw. Wieso bastelst du nicht dein Protokoll und lässt (Open)SSL sich um die Verschlüsselung kümmern? Dann hast du nämlich den Vorteil, dass du auf ein von Profis getestetes, implementiertes und gewartetes Protokoll zurückgreifst.



  • kingruedi schrieb:

    @Sovok
    Wenn ein Angreifer es schafft Pakete einzuschleusen, dann bringt die Technik auch nichts.

    es ging auch grad ned um den schutz gegen angreifer, sondern um das aufspürn der pakete innerhalb der rohdaten



  • Sovok schrieb:

    kingruedi schrieb:

    @Sovok
    Wenn ein Angreifer es schafft Pakete einzuschleusen, dann bringt die Technik auch nichts.

    es ging auch grad ned um den schutz gegen angreifer, sondern um das aufspürn der pakete innerhalb der rohdaten

    Wobei du dann auch wieder das Problem mit Binärdaten hast 🙂



  • na gut, ich kann mir da schon ein paar Sachen vorstellen wie man mittels Kodierungen auch Binaerdaten uebertragen kann und start und stop Elemente haben kann. Doch das wuerde das das Problem mit "boesswillig" manipulierten Paketen auch nicht loesen.

    @kingruedi:
    Naja ich weiss nicht, abgesehen davon das ich mit etwas als Kryptograph versuchen wollte, wie funktionniert das ueberhaupt mit OpenSSL? Wird da nicht eine einfacher/transparenter Tunnel aufgebaut? Ich mein ich lass die Daten einfach vorm versenden durch eine Funktion laufen, die verschluesselt das Ganze, ich versende die Daten, und auf der anderen Seite lass ich sie nach dem empfangen einfach wieder entschluessel. Wenn ja, das muss ich mich ja wieder selbst um das trennen der Rohdaten kuemmern.



  • ich versteh euer problem mit eingeschleusten paketen nich ganz

    nochmal zum ablauf

    sender verschlüsselt datenteil und fügt einen unverschlüsselten header hinzu
    empfänger erkennt das paket über den header und entschlüsselt es

    d.h. das einzige was ein außenstehender machen kann is ein paket mitzuschneiden und es erneut zu senden
    neue pakete kann er ja nich erstellen weil der datenteil verschlüsselt ist

    das wiederholte senden lässt sich leicht verhindern, indem im verschlüsselten datenteil z.b. eine nummerierung hinzugefügt wird

    oder versteh ich da was falsch?



  • @kingruedi:
    Naja ich weiss nicht, abgesehen davon das ich mit etwas als Kryptograph versuchen wollte, wie funktionniert das ueberhaupt mit OpenSSL? Wird da nicht eine einfacher/transparenter Tunnel aufgebaut? Ich mein ich lass die Daten einfach vorm versenden durch eine Funktion laufen, die verschluesselt das Ganze, ich versende die Daten, und auf der anderen Seite lass ich sie nach dem empfangen einfach wieder entschluessel. Wenn ja, das muss ich mich ja wieder selbst um das trennen der Rohdaten kuemmern.

    Achso, wenn du natürlich selbst ein wenig rumforschen willst ist das okay. Aber vielleicht kannst du dir die TLS Specs mal angucken und dich inspirieren lassen, wie die damit umgehen.

    Bei OpenSSL übergibst du deine Pakete einfach wie gewohnt und die Verschlüsselung über SSL/TLS wird von OpenSSL geregelt.

    @Sovok
    Ich denke es geht ihm um den Fall, dass jemand ein Paket mit falschen Größenangaben verschickt und so Pakete "überlesen" werden.
    Dies würde ja Protokol Manipulationen erlauben.


Anmelden zum Antworten