VB.Net Verschlüsselung

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Manawyrm.

    VB.Net Verschlüsselung

    Hallo Vb-Paradise :)
    ich habe eine kleine Verschlüsslung gebastelt und ich wollte mal fragen ob die sicher ist und ob vielleicht jemand von euch diese mal testen könnte :)
    Code
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Function Encript_CassIO(ByVal key As String, Data As String) As String
    2. If key.Length - 1 >= 5 Then
    3. Dim keyinstring As String = ToAscstring_(MD5StringHash(key))
    4. Dim ct As Integer = 0
    5. Dim newdata As String = String.Empty
    6. For i = 0 To Data.Length - 1
    7. If ct = keyinstring.Length - 1 Then
    8. ct = 0
    9. Else
    10. ct += 1
    11. End If
    12. newdata &= encassIO(Data(i), Asc(keyinstring(ct)))
    13. Next
    14. Return ToAscstring(newdata, False)
    15. Else
    16. Return String.Empty
    17. End If
    18. End Function
    19. Public Function Decript_CassIO(ByVal key As String, Data As String) As String
    20. If key.Length - 1 >= 5 Then
    21. Dim keyinstring As String = ToAscstring_(MD5StringHash(key))
    22. Dim ct As Integer = 0
    23. Dim newdata As String = String.Empty
    24. For i = 0 To Data.Length - 1
    25. If ct = keyinstring.Length - 1 Then
    26. ct = 0
    27. Else
    28. ct += 1
    29. End If
    30. newdata &= decassIO(Data(i), Asc(keyinstring(ct)))
    31. Next
    32. Dim Newdata_instr As String = ToAscstring(newdata, True)
    33. Return ToAscstring(newdata, True)
    34. Else
    35. Return String.Empty
    36. End If
    37. End Function
    38. Public Function MD5StringHash(ByVal strString As String) As String
    39. Dim MD5 As New Security.Cryptography.MD5CryptoServiceProvider
    40. Dim Data As Byte() = Text.Encoding.ASCII.GetBytes(strString)
    41. Dim Result As Byte() = MD5.ComputeHash(Data)
    42. Dim Res As String = String.Empty
    43. Dim Tmp As String = String.Empty
    44. For i As Integer = 0 To Result.Length - 1
    45. Tmp = Hex(Result(i))
    46. If Len(Tmp) = 1 Then Tmp = "0" & Tmp
    47. Res += Tmp
    48. Next
    49. Return Res
    50. End Function
    51. Public Function ToAscstring_(ByVal Text As String) As String
    52. Dim keyinstring As String = String.Empty
    53. For i = 0 To Text.Length - 1
    54. keyinstring &= Asc(Text(i))
    55. Next
    56. Return keyinstring
    57. End Function
    58. Public Function ToAscstring(ByVal Text As String, de As Boolean) As String
    59. Dim keyinstring As String = String.Empty
    60. For i = 0 To Text.Length - 1
    61. keyinstring &= IIf(de = False, encassIO(Text(i), i), decassIO(Text(i), i)).ToString
    62. Next
    63. Return keyinstring
    64. End Function
    65. Public Function encassIO(ByVal data As Char, Prop As Integer) As Char
    66. If Asc(data) + Prop >= 255 Then
    67. Return Chr((Asc(data) - 255) + Prop)
    68. Else
    69. Return Chr(Asc(data) + Prop)
    70. End If
    71. End Function
    72. Public Function decassIO(ByVal data As Char, Prop As Integer) As Char
    73. If Asc(data) - Prop <= 0 Then
    74. Return Chr((Asc(data) + 255) - Prop)
    75. Else
    76. Return Chr(Asc(data) - Prop)
    77. End If
    78. End Function

    Das ganze sieht dann so aus mit dem Passwort 123456:

    Quellcode

    1. –§£«[Ÿž³_ª³±bª&shy;°«i¯¾¿l¯¯Å¶ºsŽ~

    PlainText wäre das dann :

    Quellcode

    1. Hallo das ist eine Test datei :)

    würde mich über Kritik freuen :)
    MFG 0x426c61636b4e6574776f726b426974
    InOffical VB-Paradise IRC-Server
    webchat.freenode.net/
    Channel : ##vbparadise
    Hey,

    die Verschlüsselung ist leider ziemlich anfällig. So ergibt die Verschlüsselung von test und Test fast das selbe Ergebnis. Sollte ein nicht allzu schwer sein, diese zu knacken. Leider verwendest Du auch den MicrosoftVisualBasic-Namespace. Entferne lieber diesen NS aus Deinem Projekt und arbeite mit den Funktionen des FrameWorks.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Wo verwende ich den das MicrosoftVisualBasic-Namespace meinst du bei der MD% Function ?
    und was soll NS heißen (non sin) ?
    MFG 0x426c61636b4e6574776f726b426974
    InOffical VB-Paradise IRC-Server
    webchat.freenode.net/
    Channel : ##vbparadise
    NS=NameSpace 8o

    Geh in Deinem Projekt mal auf.

    My Project -> Verweise -> im unteren Teil den Haken bei Microsoft.VisualBasic entfernen.

    Du wirst daraufhin mit ein paar Fehlermeldungen konfrontiert.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    So habe jetzt alls soweit rausgenommen :)
    Code :
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Function Encript_CassIO(ByVal key As String, Data As String) As String ' DATA ist ein Base64 String
    2. If key.Length - 1 >= 5 Then
    3. Dim keyinstring As String = ToAscstring_(MD5StringHash(key))
    4. Dim ct As Integer = 0
    5. Dim newdata As String = String.Empty
    6. For i = 0 To Data.Length - 1
    7. If ct = keyinstring.Length - 1 Then
    8. ct = 0
    9. Else
    10. ct += 1
    11. End If
    12. newdata &= encassIO(Data(i), Convert.ToInt32(keyinstring(ct)))
    13. Next
    14. Return ToAscstring(newdata, False)
    15. Else
    16. Return String.Empty
    17. End If
    18. End Function
    19. Public Function Decript_CassIO(ByVal key As String, Data As String) As String
    20. If key.Length - 1 >= 5 Then
    21. Dim keyinstring As String = ToAscstring_(MD5StringHash(key))
    22. Dim ct As Integer = 0
    23. Dim newdata As String = String.Empty
    24. For i = 0 To Data.Length - 1
    25. If ct = keyinstring.Length - 1 Then
    26. ct = 0
    27. Else
    28. ct += 1
    29. End If
    30. newdata &= decassIO(Data(i), Convert.ToInt32(keyinstring(ct)))
    31. Next
    32. Dim Newdata_instr As String = ToAscstring(newdata, True)
    33. Return ToAscstring(newdata, True)
    34. Else
    35. Return String.Empty
    36. End If
    37. End Function
    38. Public Function MD5StringHash(ByVal strString As String) As String
    39. Dim MD5 As New Security.Cryptography.MD5CryptoServiceProvider
    40. Dim Data As Byte() = Text.Encoding.ASCII.GetBytes(strString)
    41. Dim Result As Byte() = MD5.ComputeHash(Data)
    42. Dim Res As String = String.Empty
    43. Dim Tmp As String = String.Empty
    44. For i As Integer = 0 To Result.Length - 1
    45. Tmp = Convert.ToString(Result(i), 16)
    46. If Tmp.Length = 1 Then Tmp = "0" & Tmp
    47. Res += Tmp
    48. Next
    49. Return Res
    50. End Function
    51. Public Function ToAscstring_(ByVal Text As String) As String
    52. Dim keyinstring As String = String.Empty
    53. For i = 0 To Text.Length - 1
    54. keyinstring &= Convert.ToInt32(Text(i)).ToString()
    55. Next
    56. Return keyinstring
    57. End Function
    58. Public Function ToAscstring(ByVal Text As String, de As Boolean) As String
    59. Dim keyinstring As String = String.Empty
    60. For i = 0 To Text.Length - 1
    61. If de = False Then
    62. keyinstring &= encassIO(Text(i), i)
    63. Else
    64. keyinstring &= decassIO(Text(i), i)
    65. End If
    66. Next
    67. Return keyinstring
    68. End Function
    69. Public Function encassIO(ByVal data As Char, Prop As Integer) As Char
    70. If Convert.ToInt32(data) + Prop >= 255 Then
    71. Return System.Convert.ToChar((Convert.ToInt32(data) - 255) + Prop)
    72. Else
    73. Return System.Convert.ToChar(Convert.ToInt32(data) + Prop)
    74. End If
    75. End Function
    76. Public Function decassIO(ByVal data As Char, Prop As Integer) As Char
    77. If Convert.ToInt32(data) - Prop <= 0 Then
    78. Return System.Convert.ToChar((Convert.ToInt32(data) + 255) - Prop)
    79. Else
    80. Return System.Convert.ToChar(Convert.ToInt32(data) - Prop)
    81. End If
    82. End Function


    hat jemand verbesserungs vorschläge ?
    MFG 0x426c61636b4e6574776f726b426974
    InOffical VB-Paradise IRC-Server
    webchat.freenode.net/
    Channel : ##vbparadise

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „BlackNetworkBit“ ()

    Verbesserungsvorschläge, direkt auf Deinen Code bezogen, habe ich keine. Verschlüsselung ist ein so komplexes Thema, dass es nicht einfach mit ein paar Stringverdrehungen getan ist. Du kannst Dir mal das ansehen (falls nicht getan).

    de.wikipedia.org/wiki/Advanced_Encryption_Standard
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    So habe mich jetzt noch ein bisschen von Vernom Algo inspierieren lassen :)
    und ich habe festgestellt das ich per base64 erst mal in ascii bereich bringen muss, um Dateien ohne Fehler zu verschlüsseln :)
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Function Encript_CassIO(ByVal key As String, Data As String) As String
    2. If key.Length - 1 >= 5 Then
    3. Dim keyinstring As String = ToAscstring_(MD5StringHash(key))
    4. Dim ct As Integer = 0
    5. Dim newdata As String = String.Empty
    6. Dim leng As Integer = (Data.Length - 1)
    7. Dim rel As Boolean = False
    8. For i = 0 To Data.Length - 1
    9. If ct = keyinstring.Length - 1 Then
    10. ct = 0
    11. Else
    12. ct += 1
    13. End If
    14. newdata &= encassIO(Data(i), Convert.ToInt32(keyinstring(ct)))
    15. Next
    16. newdata = ToAscstring(newdata, False)
    17. Return XORIT(newdata, key)
    18. Else
    19. Return String.Empty
    20. End If
    21. End Function
    22. Public Function Decript_CassIO(ByVal key As String, Data As String) As String
    23. If key.Length - 1 >= 5 Then
    24. Data = XORIT(Data, key)
    25. Dim keyinstring As String = ToAscstring_(MD5StringHash(key))
    26. Dim ct As Integer = 0
    27. Dim newdata As String = String.Empty
    28. For i = 0 To Data.Length - 1
    29. If ct = keyinstring.Length - 1 Then
    30. ct = 0
    31. Else
    32. ct += 1
    33. End If
    34. newdata &= decassIO(Data(i), Convert.ToInt32(keyinstring(ct)))
    35. Next
    36. Return ToAscstring(newdata, True)
    37. Else
    38. Return String.Empty
    39. End If
    40. End Function
    41. Public Function XORIT(ByVal Text As String, PW As String) As String
    42. Dim ret As String = String.Empty
    43. For i = 0 To Text.Length - 1
    44. Dim p As Char
    45. If PW.Length - 1 > i + 1 Then p = PW(i)
    46. ret &= Convert.ToChar(Convert.ToInt32(Text(i)) Xor Convert.ToInt32(p))
    47. Next
    48. Return ret
    49. End Function
    50. Public Function MD5StringHash(ByVal strString As String) As String
    51. Dim MD5 As New Security.Cryptography.MD5CryptoServiceProvider
    52. Dim Data As Byte() = Text.Encoding.ASCII.GetBytes(strString)
    53. Dim Result As Byte() = MD5.ComputeHash(Data)
    54. Dim Res As String = String.Empty
    55. Dim Tmp As String = String.Empty
    56. For i As Integer = 0 To Result.Length - 1
    57. Tmp = Convert.ToString(Result(i), 16)
    58. If Tmp.Length = 1 Then Tmp = "0" & Tmp
    59. Res += Tmp
    60. Next
    61. Return Res
    62. End Function
    63. Public Function ToAscstring_(ByVal Text As String) As String
    64. Dim keyinstring As String = String.Empty
    65. For i = 0 To Text.Length - 1
    66. keyinstring &= Convert.ToInt32(Text(i)).ToString()
    67. Next
    68. Return keyinstring
    69. End Function
    70. Public Function ToAscstring(ByVal Text As String, de As Boolean) As String
    71. Dim keyinstring As String = String.Empty
    72. Dim ct As Integer = 0
    73. For i = 0 To Text.Length - 1
    74. If ct <= 255 Then
    75. ct += 1
    76. Else
    77. ct = 0
    78. End If
    79. If de = False Then
    80. keyinstring &= encassIO(Text(i), ct)
    81. Else
    82. keyinstring &= decassIO(Text(i), ct)
    83. End If
    84. Next
    85. Return keyinstring
    86. End Function
    87. Public Function encassIO(ByVal data As Char, Prop As Integer) As Char
    88. If Convert.ToInt32(data) + Prop >= 255 Then
    89. Return System.Convert.ToChar((Convert.ToInt32(data) - 255) + Prop)
    90. Else
    91. Return System.Convert.ToChar(Convert.ToInt32(data) + Prop)
    92. End If
    93. End Function
    94. Public Function decassIO(ByVal data As Char, Prop As Integer) As Char
    95. If Convert.ToInt32(data) - Prop <= 0 Then
    96. Return System.Convert.ToChar((Convert.ToInt32(data) + 255) - Prop)
    97. Else
    98. Return System.Convert.ToChar(Convert.ToInt32(data) - Prop)
    99. End If
    100. End Function
    101. Public Function Tobase64(ByVal text As Byte()) As String
    102. Return Convert.ToBase64String(text)
    103. End Function
    104. Public Function SAVETostring64(ByVal text As String) As Byte()
    105. Return Convert.FromBase64String(text)
    106. End Function
    MFG 0x426c61636b4e6574776f726b426974
    InOffical VB-Paradise IRC-Server
    webchat.freenode.net/
    Channel : ##vbparadise

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „BlackNetworkBit“ ()

    Ich muss hier mal wieder kurz den Spielverderber spielen.
    Zu Test und Lernzwecken ist eine solche Verschlüsselung eine schöne Sache und ideal um z.B. über boolesche Operatoren wie XOR zu lernen.

    Solche Verschlüsselungen sollten allerdings NIEMALS zum Produktiven Einsatz z.B. zur Absicherung von Computern oder zur geschützten Kommunikation verwendet werden.
    Hier fallen selbst einem Laien schnell sehr große Lücken auf, wie z.B. die unsichere und auch noch falsche Schlüsselgenerierung mittels eines Hashing-Algorithmus. (MD5)
    Hier wäre es angebrachter z.B. die Rfc2898DeriveBytes-Klasse einzusetzen.

    Viele Grüße,
    Manawyrm

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Manawyrm“ ()

    wäre sha256 sicherer ?
    oder ist das gesamte konzept ehr unsicher ?

    ich mache das Project so oder so nur aus lernzwecken, würde mich bloß trotzdem interessieren :)
    MFG 0x426c61636b4e6574776f726b426974
    InOffical VB-Paradise IRC-Server
    webchat.freenode.net/
    Channel : ##vbparadise
    Grundsätzlich solltest du keine Schlüssel mit Hashing Algorithmen errechnen.
    Eine passende Alternative hatte ich oben schon erwähnt.

    Es würde also schon mal helfen, vernünftige Schlüssel zu verwenden. Aber auch dann ist deine Verschlüsselung angreifbar gegen z.B. Known-Plaintext Angriffe.
    Beispiel: Du verschlüsselst 200 Leerzeichen. -> Ich hab deinen Schlüssel/dein Kennwort weil ich nur den Offset von 0x20 (Leerzeichen) rausrechnen muss.
    In der Praxis wird man sowas z.B. machen können, weil man weiß dass z.B. ZIP Dateien immer mit "PKZIP...*undsoweiter*" anfangen. Und schon hat man große Teile des Schlüssels.

    Das ist unteranderem auch die größte Stärke in Rijndael. Die extreme Einfachheit.
    de.wikipedia.org/wiki/Advanced_Encryption_Standard