String mit einfacher Methode entschlüsseln

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

    • 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 Source Code: 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
      Display All


      Die Verschlüsselung zu der Funktion
      schaut ebenso aus

      BASCOM Source Code

      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
      Display All
      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 wrote:

      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 wrote:

      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 :)

      The post was edited 2 times, last by 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 Source Code

      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
      Display All

      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 Source Code

      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
      Display All
    • 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 Source Code

      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
      Display All
      VB.NET CODE:
      Zum Verschlüsseln

      BASCOM Source Code

      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
      Display All
      Aufruf:

      BASCOM Source Code

      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 )

      The post was edited 4 times, last by katipefendi ().

    • katipefendi wrote:

      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 wrote:

      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 Source Code: 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
      Display All
      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+/

      The post was edited 1 time, last by 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 Source Code

      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 Source Code

      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 )

      The post was edited 1 time, last by katipefendi ().

    • Mitch64 wrote:

      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 Source Code

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

      auch nicht so

      BASCOM Source Code

      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 Source Code

      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
      Display All