String mit einfacher Methode entschlüsseln

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • String mit einfacher Methode entschlüsseln

      Hallo,

      gibt es in BASCOM auch eine Methode oder eine Funktion, die nicht so groß ist, mit der man auch sehr einfach Strings entschlüsseln kann, sowie in VB.NET?

      So in der Art wie in VB.NET
      Wobei diese hier schon zu viel wäre

      BASCOM-Quellcode: VB.NET entschlüsseln

      1. Public Function Decrypt(cipherText As String) As String
      2. Dim EncryptionKey As String = "$kldfKFSAK37236780!!*+++hHUDO723BNU!$hask+*jhds7!2929j$+jP*!hWrT$kldfKFSAK37236780!!*+++hHUDO723BNU!$hask+*jhds7!2929j$+jP*!hWrT"
      3. Dim cipherBytes As Byte() = Convert.FromBase64String(cipherText)
      4. Using encryptor As Aes = Aes.Create()
      5. Dim pdb As New Rfc2898DeriveBytes(EncryptionKey, New Byte() {&H49, &H76, &H61, &H6E, &H20, &H4D, &H65, &H64, &H76, &H65, &H64, &H65, &H76})
      6. encryptor.Key = pdb.GetBytes(32)
      7. encryptor.IV = pdb.GetBytes(16)
      8. Using ms As New MemoryStream()
      9. Using cs As New CryptoStream(ms, encryptor.CreateDecryptor(), CryptoStreamMode.Write)
      10. cs.Write(cipherBytes, 0, cipherBytes.Length)
      11. cs.Close()
      12. End Using
      13. cipherText = Encoding.Unicode.GetString(ms.ToArray())
      14. End Using
      15. End Using
      16. Return cipherText
      17. End Function
      Alles anzeigen


      Die Verschlüsselung zu der Funktion
      schaut ebenso aus

      BASCOM-Quellcode

      1. Public Function Encrypt(clearText As String) As String
      2. Dim EncryptionKey As String = "$kldfKFSAK37236780!!*+++hHUDO723BNU!$hask+*jhds7!2929j$+jP*!hWrT$kldfKFSAK37236780!!*+++hHUDO723BNU!$hask+*jhds7!2929j$+jP*!hWrT"
      3. Dim clearBytes As Byte() = Encoding.Unicode.GetBytes(clearText)
      4. Using encryptor As Aes = Aes.Create()
      5. Dim pdb As New Rfc2898DeriveBytes(EncryptionKey, New Byte() {&H49, &H76, &H61, &H6E, &H20, &H4D, &H65, &H64, &H76, &H65, &H64, &H65, &H76})
      6. encryptor.Key = pdb.GetBytes(32)
      7. encryptor.IV = pdb.GetBytes(16)
      8. Using ms As New MemoryStream()
      9. Using cs As New CryptoStream(ms, encryptor.CreateEncryptor(), CryptoStreamMode.Write)
      10. cs.Write(clearBytes, 0, clearBytes.Length)
      11. cs.Close()
      12. End Using
      13. clearText = Convert.ToBase64String(ms.ToArray())
      14. End Using
      15. End Using
      16. Return clearText
      17. End Function
      Alles anzeigen
      Mein Vorhaben ist, das ich die Gesendete String vom PC zum Hardware über das Ethernet verschlüsselt senden möchte, also nicht in Klartext.
      Muss auch nicht unbedingt FBI sicher sein 8o 8o

      Die Verschlüüselung wird auf der PC Seitig passieren und die Entschlüsselung halt auf dem AVR.

      VG
      Katip
    • Pluto25 schrieb:

      Schau mal XTEADECODE (in der Bascom Hilfe)
      Hi Pluto,

      danke für die Empfehlung, allerdings steht da noch sowas:

      Using the encoding on a string can cause problems when the data contains a 0. This is the end of the string marker.

      Und das ist nämlich der Fall bei mir, das ich strings habe die auch Ziffern enthalten wie eine NULL.


      stefanhamburg schrieb:

      Wenn es nicht FBI-sicher sein soll, dann kannst Du Dir doch auch etwas Minimales selbst schreiben.
      Stefan, dann muss ich das wohl so machen :)

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von katipefendi ()

    • BASCOM ist nicht VB.NET :)

      das was ich in VB.NET mache, kann ich leider nicht hier realisieren.
      Oder zumindest nicht 1:1

      Hatte in VB.NET die Quersumme gebildet und diese dann in HEX umgewandelt.

      BASCOM-Quellcode

      1. Dim hxz As String = "0123456789ABCDEF"
      2. Do
      3. hxs = ""
      4. For i = 0 To 14
      5. hxs &= hxz(Rnd.Next(0, 16))
      6. Next
      7. If GetQS_Hex(hxs) = QSumme Then Exit Do
      8. Loop
      9. Private Function GetQS_Hex(hex As String) As Int32
      10. Dim qs As Int32
      11. For Each c In hex
      12. Select Case c.ToString
      13. Case "0" To "9"
      14. qs += Convert.ToInt32(c) - 48
      15. Case "A" To "F"
      16. qs += Convert.ToInt32(c) - 55
      17. End Select
      18. Next
      19. Return qs
      20. End Function
      Alles anzeigen

      Wie könnte ich das in BASCOM machen?

      Oder kenn ihr eine einfache variante zum verschlüsseln, die man selber coden kann?

      Danke im Voraus

      Katip
    • Also eine relativ einfache Methode ist es den String gegen einen anderen String per XOR zu verändern.
      Wenn man das etwas komplexer gestalten möchte, ist der XOR-Wert eben nicht immer nur ein Wert der auf jedes zu verschlüsselnde Zeichen einwirkt sondern eben auch ein String der nicht mal die gleiche Länge haben muss, das muss eben bentsprechend berücksichtigt werden, dass dann wieder mit dem ersten Zeichen begonnen wird.
      Wenn jetzt noch der "Gegenstring" nicht als eigentlicher String sondern z.B. als einzelne Word-Variablen für jedes Zeichen des Gegenstrings im Flash abgelegt ist und der Gegenstring erst zur Laufzeit zusammengestellt wird(z.B. Beim Programmstart) ist der auch nicht einfach aus dem Flash auslesbar.

      Ich hatte das mal für eine Alarmanlage gebraucht um den Pin zu verschlüsseln. Ich hänge mal die Funktion an. Die entsprechende Datenzeile kann ja auch größer sein und enthält eben einen individuellen String.
      Wenn man den noch besser verstecken möchte, kann der auch nochmals kodiert werden und muss halt in der Funktion zurückgewandelt werden bevor der Schlüssel verwendet werden kann.

      BASCOM-Quellcode

      1. Const Text_LCD_Code = 2
      2. Dim Pin As String * 8
      3. Pin = String_XOR("PinCode")
      4. Print Pin
      5. Pin = String_XOR(Pin)
      6. Print Pin
      7. End
      8. LCD_Text:
      9. Data "* Alarmanlage V4.0 *"
      10. Data "* (c) 2019 HFEDV *"
      11. Data "{047}{078}{192}{111}{179}{099}{062}{033}" ' Key fuer XOR
      12. '(
      13. ##############################################################################
      14. #
      15. # String_XOR
      16. #
      17. # Dekodiert eine aus max. acht Zeichen bestehende Zeichenkette mittels XOR
      18. #
      19. # Parameter:
      20. # pText Die zu (de)kodierende Zeichenkette
      21. #
      22. # Rueckgabe: Die (de)kodierte Zeichenkette
      23. #
      24. ##############################################################################
      25. ')
      26. Function String_XOR(ByVal pText As String) As String
      27. Local fSA As String * 1
      28. Local fSB As String * 1
      29. Local fS1 As String * 8
      30. Local fS2 As String * 8
      31. Local fY As Byte
      32. Local fL As Byte
      33. Local fX As Byte
      34. Local fC1 As Byte
      35. Local fC2 As Byte
      36. fS2 = ""
      37. fL = Len(pText)
      38. fS1 = LookupStr(Text_LCD_Code , LCD_Text)
      39. For fX = 1 To fL
      40. fSA = Mid(fS1 , fX , 1)
      41. fSB = Mid(pText , fX , 1)
      42. fC1 = Asc(fSA)
      43. fC2 = Asc(fSB)
      44. fY = fC1 XOR fC2
      45. fS2 = fS2 + Chr(fY)
      46. Next
      47. String_XOR = fS2
      48. End Function
      Alles anzeigen
    • Sfc = "Hallo"

      Sfc = Ecrypto(sfc)
      Result1 = Tcpwritestr(idx , Sfc , 255 )Hallo Zusammen,

      nun ich habe mich zu den Cesar Verschlüsselung entschieden, allerdings tun das in BASCOM Code nicht das was es in der VB.NET tut.

      Hier noch mal die beiden Codes

      BASCOM CODE:
      Zum Verschlüsseln

      BASCOM-Quellcode

      1. Sub Ecrypto()
      2. Local Textlaenge As Byte
      3. Local Einzelneziffern As String * 1
      4. Local Asciiaddieren As Byte
      5. Local Fx As Byte
      6. Local Textzusammensetzen As String * 80
      7. Textzusammensetzen = ""
      8. Textlaenge = Len(sfc)
      9. For Fx = 1 To Textlaenge
      10. Einzelneziffern = Left(sfc , Fx)
      11. Asciiaddieren = Asc(einzelneziffern) + 3
      12. Textzusammensetzen = Textzusammensetzen + Chr(asciiaddieren)
      13. Next
      14. Sfc = Textzusammensetzen
      15. End Sub
      Alles anzeigen
      VB.NET CODE:
      Zum Verschlüsseln

      BASCOM-Quellcode

      1. Function Ecrypto(byval Gelenyazi As String) As String
      2. Local Textlaenge As Byte
      3. Local Einzelneziffern As String * 1
      4. Local Asciiaddieren As Byte
      5. Local Fx As Byte
      6. Local Yazigeldi As String * 80
      7. Local Textzusammensetzen As String * 80
      8. Textzusammensetzen = ""
      9. Yazigeldi = Gelenyazi
      10. Textlaenge = Len(yazigeldi)
      11. For Fx = 1 To Textlaenge
      12. Einzelneziffern = Left(yazigeldi , Fx)
      13. Asciiaddieren = Asc(einzelneziffern) + 3
      14. Textzusammensetzen = Textzusammensetzen + Chr(asciiaddieren)
      15. Next
      16. Ecrypto = Textzusammensetzen
      17. End Function
      Alles anzeigen
      Aufruf:

      BASCOM-Quellcode

      1. Sfc = "Hallo"
      2. Sfc = Ecrypto(sfc)
      3. Result1 = Tcpwritestr(idx , Sfc , 255 )
      Leider wird aber nichts gesendet

      So aber wird gesendet, halt ohne Verschlüsselt

      Sfc = "Hallo"
      Result1 = Tcpwritestr(idx , Sfc , 255 )

      Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von katipefendi ()

    • katipefendi schrieb:

      das ich strings habe die auch Ziffern enthalten wie eine NULL.
      Die Ziffer Null ist ein Byte $30 (48). Gemeint war das Byte 0 das das Ende eines Strings anzeigt.

      katipefendi schrieb:

      Leider wird aber nichts gesendet
      Ohne es simuliert zu haben würde ich sagen: es hat die Stacks gesprengt (86Byte Local)
      Warum so kompliziert?
      Dim scf_by as byte(80) at scf overlay
      Dim scf_len as byte
      scf_len=len(scf)
      For i = 1 to scf_len
      scf_by = scf_by + 3
      Next

      macht das selbe ohne das dem Avr "schwindlig" wird
    • Versuchs mal damit:

      BASCOM-Quellcode: Cäsar-Verschlüsselung

      1. ' Demo Cäsar-Verschlüsselung
      2. ' Beispiel von Mitch64
      3. $Regfile = "m32def.dat"
      4. $HWStack = 32
      5. $SWStack = 32
      6. $Framesize = 64
      7. $Crystal = 8000000
      8. $Baud = 19200
      9. Config Base = 0
      10. Config SubMode = New
      11. $SIM
      12. Dim txtData as String * 50 ' Variable, die unverschlüsselten/verschlüsselten Text aufnimmt
      13. Const CaesarKey = 3 ' Cäsar-Schlüssel (Offset)
      14. ' --------------------------------------------------------
      15. ' Routinen-Deklarationen
      16. ' --------------------------------------------------------
      17. ' Verschlüsselt Text nach Cäsar-Algorythmus
      18. Sub EncCaesar(ByRef KlarText as String)
      19. Local idx as Byte
      20. Local tmpByte as Byte
      21. Local tmpChar as String * 1
      22. For idx = 1 to Len(KlarText)
      23. tmpChar = Mid(KlarText , idx , 1)
      24. tmpByte = Asc(tmpChar) + CaesarKey ' Verlüsselung '+3'
      25. tmpChar = Chr(tmpByte)
      26. Mid(KlarText , idx , 1) = tmpChar
      27. Next idx
      28. End Sub
      29. ' Entschlüsselt Cäsar-verschlüsselten Text
      30. Sub DecCaesar(ByRef Crypt as String)
      31. Local idx as Byte
      32. Local tmpByte as Byte
      33. Local tmpChar as String * 1
      34. For idx = 1 to len(Crypt)
      35. tmpChar = Mid(Crypt , idx , 1)
      36. tmpByte = Asc(tmpChar) - CaesarKey ' Entschlüsseln '-3'
      37. tmpChar = Chr(tmpByte)
      38. Mid(Crypt , idx , 1) = tmpChar
      39. Next
      40. End Sub
      41. ' --------------------------------------------------------
      42. ' Hauptschleife
      43. ' --------------------------------------------------------
      44. txtData = "Cäsar-Verschlüsselung" ' Dieser Text soll verschlüsselt werden
      45. Do
      46. Print "Text: " ; txtData ' Ausgabe unverschlüsselt
      47. Call EncCaesar(txtData) ' Encrypten
      48. Print "Kodiert: " ; txtData ' Ausgabe Kodierter Text
      49. Call DecCaesar(txtData) ' Decrypten
      50. Loop
      Alles anzeigen
      Den Code kannst du im Simulator mal durch-testen.
    • Eine eingebaute Kodier-Funktion in Bascom wäre z.B.

      Base64Enc und
      Base64Dec

      Vielleicht reicht dir diese Kodierung ja auch aus?

      Da wird dann z.B. aus
      Text: <Dies ist ein Test für Cäsar-Verschlüsselung!>

      Das da:
      Kodiert: PERpZXMgaXN0IGVpbiBUZXN0IGb8ciBD5HNhci1WZXJzY2hs;HNzZWx1bmchPg==

      Oder anderes Beispiel

      Text: ABCDEFGHIJKLMNOPQRSTUVWXYZ
      Kodiert: QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVo=

      Der Zeichensatz ist allerdings auf 64 Zeichen eingeschränkt: =ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Mitch64 ()

    • Hi,

      die ist schon in Ordnung, nur wie rufe ich die Sub in der TCPwriter auf?
      so geht das nicht
      Der Text kommt auf der anderen Seite unverschlüsselt an.

      BASCOM-Quellcode

      1. Sfc = "Hier steht ein sehr langer Text mit ca. 80 Zeichen maximal"
      2. Call Enccaesar(sfc)
      3. Flags.idx = 1
      4. Result1 = Tcpwritestr(idx , Sfc , 255 )

      und so auch nicht
      Hier meckert der Kompiler

      BASCOM-Quellcode

      1. Sfc = "Hier steht ein sehr langer Text mit ca. 80 Zeichen maximal"
      2. Flags.idx = 1
      3. Result1 = Tcpwritestr(idx , Call Enccaesar(sfc), 255 )

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von katipefendi ()

    • Mitch64 schrieb:

      Du rufst die Sub gar nicht in der Sub TCPWriter auf, sondern davor.

      An die TCWWriter Function übergibst du dann der verschlüsselten String.
      Ja, aber in der zweiten, da habe ich es doch in der TCPwriter
      und so meckert der Kompiler.

      BASCOM-Quellcode

      1. Result1 = Tcpwritestr(idx , Enccaesar(sfc) , 255 )

      auch nicht so

      BASCOM-Quellcode

      1. Result1 = Tcpwritestr(idx , Call Enccaesar(sfc) , 255 )
    • Übergib das
      Sfc = "Hier steht ein sehr langer Text mit ca. 80 Zeichen maximal"

      mal dem Programm, was in Post #11 angegeben ist.

      Es scheint ja so als ob der das nicht kodiert.

      Die Stringlängen müssen natürlich korrekt eingestellt werden!

      Bei mir kommt das raus:

      Text: Hier steht ein sehr langer Text mit ca. 80 Zeichen maximal
      Kodiert: Klhu#vwhkw#hlq#vhku#odqjhu#Wh{w#plw#fd1#;3#]hlfkhq#pd{lpdo
    • OK, so funktioniert es jetzt
      Nachdem erweitern

      BASCOM-Quellcode

      1. Sub Enccaesar(byref Klartext As String)
      2. Local idx as Byte
      3. Local tmpByte as Byte
      4. Local tmpChar as String * 1
      5. For idx = 1 to Len(KlarText)
      6. tmpChar = Mid(KlarText , idx , 1)
      7. tmpByte = Asc(tmpChar) + CaesarKey ' Verlüsselung '+3'
      8. tmpChar = Chr(tmpByte)
      9. Mid(klartext , Idx , 1) = Tmpchar
      10. Sfc = Trim(klartext)
      11. Next Idx
      12. End Sub
      Alles anzeigen