Verständnissfrage: C+ Code in Bascom umsetzen?

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • Verständnissfrage: C+ Code in Bascom umsetzen?

      Hallo Leute!

      In der Hoffnung das sich hier User befinden die C+ verstanden haben die mir was erklären können.

      Also es geht um Bit-Manipulation im Sinne einer "Verschlüsselung", allerdings ziemlich probitär.

      Ein Aussensensor sendet verschlüsselte Datenpakete zu seiner Wetterstation.
      Das Protokoll ist geknackt, die fundstelle im Web:
      members.upc.nl/m.beukelaar/Crestaprotocol.pdf

      Rohdaten vom Sensor sind z.B. in Hex: C3 BA CA 7D BF CF 51 und müssen wie folgt "entschlüsselt" werden:

      C+:
      return b ^ (b << 1)

      Soweit ist noch logisch und für mich nachvollziehbar:
      Das Byte 1 mit Wert hC3 wird um eine stelle Left geshiftet:
      hC3 = b11000011 Shift Left 1 = b10000110 = h86
      Dann den Originalwert C3 ExOR dem geshifteten Wert h86 fürt zum korrekt entschlüsselten Wert h45.

      Nur mit dem Rückweg habe ich ein Verständnissproblem.
      Also das Verschlüsseln eines Bytes, z.B. diese h45 wieder zurück in den Rohwert hC3.

      In oben verlinkter PDF auf Seite 7 steht dazu:

      Source Code

      1. /* Encrypt data byte to send to station */
      2. BYTE EncryptByte (BYTE b)
      3. {
      4. BYTE a;
      5. for(a=0; b; b<<=1) a^=b;
      6. return
      7. a;
      8. }
      9. BYTE WindDirSeg(BYTE b)
      10. {
      11. /* Encrypted using: a=-a&0xf; b=a^(a>>1);
      12. I don’t see any easy reversed formula.
      13. i.e. I can’t solve “a” from the equ b=a^(a>>1)
      14. in one easy single formula. So I solve it
      15. bit by bit in this method. Does anyone have
      16. a better solution?
      17. NOT like this
      18. :
      19. b &= 0xf;
      20. return (-(b ^ (b >> 1) ^ (b >> 2) ^ (b >> 3))) & 0xf;
      21. It works... But is, of course, also a bit by bit solution.
      22. */
      23. b ^= (b & 8) >> 1; /* Solve bit 2 */
      24. b ^= (b & 4) >> 1; /* Solve bit 1 */
      25. b ^= (b & 2) >> 1; /* Solve bit 0 */
      26. return -b & 0xf;
      27. }
      Display All
      Hier insbesondere die Zeilen 5 und 24-26

      Grüße
      Jürgen
    • Hallo!

      stefanhamburg wrote:

      Hast Du dazu eine Frage oder wolltest Du und nur über Deinen Kenntnisstand informieren?
      :)
      Ist das nicht klar geworden?
      Na dann nochmal anders beschrieben:
      Ich versuche zu verstehen wie der Rechenweg bzw. die Manipulation auf Bitebene aussieht.
      Einziger Lösungsansatz ist dieses C+ Schnipselwerk aus der verlinkten PDF.

      Und in der heutigen Zeit findet man im Internet zu solchen Themen leider nur noch in mäßig bis gar nicht kommentierten C, C+, C++ ohne das irgend jemand da genau beschreibt was auf Bitebene bewerkstelligt werde soll.

      Beispiel Zeile 5: for(a=0; b; b<<=1) a^=b; sagt mir so erstmal gar nix...eine For-Next-Scheife wird es kaum sein.
      Beispiel Zeile 24: b ^= (b & 8) >> 1; wäre sinngemäß sowas wie " b exOR= (b And 8) Shift, Right, 1.

      Eine Syntax wo sich mir die Ohren kräuseln.

      b And 8 ist klar, Shift Right 1 ist auch noch nachvollziehbar.


      Aber b ExOR =?

      b ExOR womit?


      Grüße

      Jürgen
    • b ^= (b & 8 ) >> 1; /* Solve bit 2 */

      Das ^-Zeichen steht für xor. Solche Operatoren in Verbindung mit den =-Zeichen ist eine Kurzschreibweise.

      b ^= 4 wäre ausgeschieben b = b xor 4
      b += 1 wäre b = B +1
      b -= 1 wäre b = b -1
      b *= 100 wäre b = b * 100 usw.

      Heißt also:
      b = b xor (b and 8 ) >> 1

      Da wird also von b mit 8 maskiert und mit b verodert, das Ergebnis 1 Bit nach rechts geschoben und das landet dann wieder in b.

      Ich hab da mal für Cresta Anno 2016 diverse Routinen dafür geschrieben.
      Die 2 Lib-Routinen, die ein Byte verschlüsseln / entschlüsseln sehen so aus:

      Source Code

      1. [_tfaEncryptByte]
      2. ; ---------------------------------------------------------------------
      3. ; verschlüsselt Byte in r24, Ergebnis in r24
      4. _tfaEncryptByte:
      5. PUSH r25
      6. CLR r25
      7. tfaEncryptByteLoop:
      8. EOR r25, r24
      9. LSL r24
      10. TST r24
      11. BRNE tfaEncryptByteLoop
      12. MOV r24, r25
      13. POP r25
      14. Ret
      15. [End]
      16. [_tfaDecryptByte]
      17. ; ---------------------------------------------------------------------
      18. ; dekodiert Byte in r24, Ergebnis in r24
      19. _tfaDecryptByte:
      20. PUSH r25
      21. MOV r25, r24 ; Kopie nach r25
      22. LSL r25 ; 1 Bit nach links
      23. EOR r24, r25 ; xor mit Original, Ergebnis in r24
      24. POP r25
      25. Ret
      26. [End]
      Display All
      Das zu verschlüsselnde Byte musst du in r24 übergeben. Und im selben Register bekommst du dann auch das Ergebnis.

      Ich hatte damals das auch in Basic angefangen. Aber das ist mit den Befehlen sehr uneffektiv. Daher habe ich die Lib gleich in Assembler geschrieben.

      Hilft dir das weiter?
    • Hallo!

      djmsc wrote:


      DG7GJ wrote:

      Aber b ExOR =?

      b ExOR womit?
      Wo in der von dir gezeigten PDF hast du das gefunden?
      Ich habe die Codezeilen jetzt mehrmals rauf und runter gelesen aber nichts dergleichen gefunden.
      In den Zeilen 24-26 wo zu Beginn b ^= steht, also "Variable ExOr (WAS???) =

      Mitch64 wrote:

      b ^= (b & 8 ) >> 1; /* Solve bit 2 */

      Das ^-Zeichen steht für xor. Solche Operatoren in Verbindung mit den =-Zeichen ist eine Kurzschreibweise.

      b ^= 4 wäre ausgeschieben b = b xor 4
      b += 1 wäre b = B +1
      b -= 1 wäre b = b -1
      b *= 100 wäre b = b * 100 usw.
      Genau auf solch einen Hinweis hoffte ich, zumal solche Kurzschreibweisen ständig angewendet aber in den verschiedensten Online-Referenzen nicht wirklich vermittelt werden.
      Hilft mir auf jeden Fall um weiter zu kommen, danke!

      Grüße

      Jürgen