[Listview] Generierte Filemode Datei verschlüsseln

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von samuel.

    [Listview] Generierte Filemode Datei verschlüsseln

    Hei,

    ich hätte da 1/2 Fragen bezüglich der Listview und verschlüsseln.

    Ich speichere den Inhalt meiner Listview mit der (De-)Serialize funktion

    VB.NET-Quellcode

    1. Imports System.Runtime.Serialization.Formatters.Binary


    Jetzt möchte ich, dass die erstellte Datei names "Filemode", verschlüsselt wird. Ich hab mir schon einige Codes angeguckt, aber bin noch nicht wirklich vorran gekommen. Jetzt würd ich gern wissen,
    1. ob ich die Datei veschlüsseln soll, wenn sie schon erstellt ist oder wenn sie gerade erstellt wird.
    2. Wie ich das am besten hinkrieg :D
    Ein Paar Tipps wären echt nett :)

    lg
    msdn.microsoft.com/de-de/library/as0w18af%28VS.80%29.aspx
    man kann z.B. einen Stream bei dieser Verschlüsselung übergeben, dem BinaryFormatter musst du ebenfalls einen Stream übergeben, ob du es erst im Speicher machst und dann speicherst, oder direkt in einem FileStream machst sollte denke ich ansich egal sein ;)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    Listview verschlüsselt speichern

    Hallo,

    ich möchte diesen Thread nochmals bewusst hervorholen, da ich einfach nicht weiter komme.
    Ich möchte eine Listview verschlüsslt speichern.

    Das Speichern mach ich so:

    VB.NET-Quellcode

    1. Dim fs As New IO.FileStream(path, IO.FileMode.Create)
    2. Dim bf As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
    3. Dim lstv(ListView1.Items.Count - 1) As ListViewItem
    4. ListView1.Items.CopyTo(lstv, 0)
    5. bf.Serialize(fs, lstv)
    6. fs.Close()


    Jetzt hab ich mir überlegt, wie ich das ganze verschlüsseln könnte.
    Die Datei verschlüsseln, nachdem sie erstellt wurde kommt nicht in frage, da ein Angreifer die kurzeitig unverschlüsselte Datei abgreifen könnte.
    Eine Möglichkeit wäre, die im Array befindlichen Strings alle einzel zu verschlüsseln. Doch das scheint wir einwenig unprofessionel.

    Jetzt meien Frage: Ist es möglich den (File)Stream, der zum Speichern verwendet wird zu verschlüsseln. Und wenn ja wie.
    Ich weis leider nicht wie ich an die Sache ran gehen soll.

    MfG
    Samuel
    hast du dir den Link von mir überhaupt angeguckt?

    Aber die Frage bei dem ganzen ist doch, wenn du Angst vor jemandem hast, der die Datei in dem Moment abgreift, in dem sie kurzzeitig unverschlüsselt auf der Platte liegt, wie sieht es dann mit den Daten im Speicher aus? Allein schon wenn die in der ListView sind, liegen die alle schön unverschlüsselt im Speicher...

    Weiter gehts: Wenn du das ganze mit einem Passwort verschlüsselst, dann kannst du das ja nicht einfach so im Programm speichern, dann kann der ja dein Programm mit nem Hex Editor oder nem Reflector öffnen und das Passwort schön angucken, muss dann nur noch AES oder was auch immer drüber laufen lassen...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    jvbsl schrieb:

    Aber die Frage bei dem ganzen ist doch, wenn du Angst vor jemandem hast, der die Datei in dem Moment abgreift, in dem sie kurzzeitig unverschlüsselt auf der Platte liegt, wie sieht es dann mit den Daten im Speicher aus? Allein schon wenn die in der ListView sind, liegen die alle schön unverschlüsselt im Speicher...
    Soweit ich informiert bin, sind seit dem Net-Framework 3.0 alle Daten im Arbeitsspeicher verschlüsselt und können nicht mehr soweinfach ausgelesen werden.
    Kann aber auch falsch liegen. Werde mich informieren. Danke.

    jvbsl schrieb:

    Weiter gehts: Wenn du das ganze mit einem Passwort verschlüsselst, dann kannst du das ja nicht einfach so im Programm speichern, dann kann der ja dein Programm mit nem Hex Editor oder nem Reflector öffnen und das Passwort schön angucken, muss dann nur noch AES oder was auch immer drüber laufen lassen...
    Eingentlich war geplant, dass der User sein eigenes Passwort definieren kann, welches er bei Programmstart eingeben muss.


    Mein Problem ist einfach, dass ich nicht weiß, wie ich den Code von der Seite einfügen muss, beziehungsweise wo.
    Eigentlich hatte ich gedacht, dass ich den Inhalt der Listview über Serialize zuerstmal in einem String zwischenspeichere und dann das ganze verschlüssle.
    Jedoch will er ja einen Stream.
    Danke zuerstmal.

    Speichern & Verschlüsseln mach ich jetzt so:

    VB.NET-Quellcode

    1. Dim rd As New RijndaelManaged
    2. Dim md5 As New MD5CryptoServiceProvider
    3. Dim key() As Byte = md5.ComputeHash(Encoding.UTF8.GetBytes(TextBox1.Text))
    4. md5.Clear()
    5. rd.Key = key
    6. rd.GenerateIV()
    7. Dim iv() As Byte = rd.IV
    8. Dim fs As New IO.FileStream("C:\Users\Samuel\Desktop\data.xml", IO.FileMode.Create)
    9. Dim CryptStream As New CryptoStream(fs, rd.CreateEncryptor, CryptoStreamMode.Write)
    10. Dim bf As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
    11. Dim lstv(ListView1.Items.Count - 1) As ListViewItem
    12. ListView1.Items.CopyTo(lstv, 0)
    13. bf.Serialize(CryptStream, lstv)
    14. fs.Close()


    Er bringt schonmal keine Fehler, und die data.xml ist auch nicht mehr zu lesen. Soweit so gut.
    Jedoch macht mir das Einlesen Probleme.

    Mein erster Versuch sah so aus:

    VB.NET-Quellcode

    1. Dim rd As New RijndaelManaged
    2. Dim md5 As New MD5CryptoServiceProvider
    3. Dim key() As Byte = md5.ComputeHash(Encoding.UTF8.GetBytes(TextBox1.Text))
    4. md5.Clear()
    5. rd.Key = key
    6. rd.GenerateIV()
    7. Dim iv() As Byte = rd.IV
    8. Dim fs As New IO.FileStream("C:\Users\Samuel\Desktop\data.xml", IO.FileMode.Open)
    9. Dim CryptStream As New CryptoStream(fs, rd.CreateEncryptor, CryptoStreamMode.Read)
    10. Dim bf As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
    11. ListView2.Items.Clear()
    12. ListView2.Items.AddRange(bf.Deserialize(CryptStream))
    13. fs.Close()

    Der Fehler beim >Deserialize<:
    Der binäre Stream "223" enthält keinen gültigen BinaryHeader. Möglicherweise ist der Stream ungültig oder die Objektversion wurde zwischen der Serialisierung und der Deserialisierung geändert.

    Mein zweiter Versuch so:

    VB.NET-Quellcode

    1. Dim rd As New RijndaelManaged
    2. Dim rijndaelIvLength As Integer = 16
    3. Dim md5 As New MD5CryptoServiceProvider
    4. Dim key() As Byte = md5.ComputeHash(Encoding.UTF8.GetBytes(TextBox1.Text))
    5. Dim fs As New IO.FileStream("C:\Users\Samuel\Desktop\data.xml", IO.FileMode.Open)
    6. md5.Clear()
    7. Dim iv(15) As Byte
    8. fs.Read(iv, 0, rijndaelIvLength)
    9. rd.IV = iv
    10. rd.Key = key
    11. Dim cs As New CryptoStream(fs, rd.CreateDecryptor, CryptoStreamMode.Read)
    12. Dim bf As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
    13. ListView2.Items.Clear()
    14. ListView2.Items.AddRange(bf.Deserialize(cs))
    15. fs.Close()

    Der Fehler beim >Deserialize<:
    Der binäre Stream "51" enthält keinen gültigen BinaryHeader. Möglicherweise ist der Stream ungültig oder die Objektversion wurde zwischen der Serialisierung und der Deserialisierung geändert.

    Was mach ich falsch?
    Der Thread und mein Projekt ist schön etwas älter und lag auf Eis.

    Jedoch kam mir das Projekt wieder in die Finger und damit dieser Thread.
    Mein Ausgangsproblem: Eine Listview verschlüsselt zu Speicher und zu Laden.
    Die ListView speicher ich normalerweise mir Serialize.

    Nun versuch ich den Stream über einen CrypteStream zu schicken, bevor er in einer Datei gespeichert wird.
    Den Code hab ich von hier: activevb.de/tipps/vbnettipps/tipp0010.html

    Mein Code sieht sieht so aus:

    VB.NET-Quellcode

    1. Private Sub crypt(ByVal encrypt As Boolean, ByVal psw As String)
    2. 'Verschlüsselungsalgorithmus
    3. Dim DES As New DESCryptoServiceProvider()
    4. With DES
    5. ' Das Passwort muss als Bytearray gesetzt werden.
    6. .Key = System.Text.Encoding.ASCII.GetBytes(psw) 'Passwort
    7. .IV = System.Text.Encoding.ASCII.GetBytes("12345678")
    8. End With
    9. ' Der Stream, der in die Datei schreibt.
    10. Dim fstream As New FileStream(file, FileMode.Create)
    11. ' Der CryptoStream, der die Verschlüsselungübernimmt.
    12. Dim cstream As New CryptoStream(fstream, DES.CreateEncryptor(), CryptoStreamMode.Write)
    13. 'Entscheidung ob ver- oder entschlüsselt werden soll
    14. If encrypt = True Then
    15. Dim bf As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
    16. Dim lstv(ListView1.Items.Count - 1) As ListViewItem
    17. ListView1.Items.CopyTo(lstv, 0)
    18. bf.Serialize(cstream, lstv)
    19. cstream.Close()
    20. Else
    21. fstream = New FileStream(file, FileMode.Open)
    22. cstream = New CryptoStream(fstream, DES.CreateDecryptor, CryptoStreamMode.Read)
    23. Dim bf As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
    24. ListView1.Items.Clear()
    25. ListView1.Items.AddRange(bf.Deserialize(cstream))
    26. cstream.Close()
    27. proList()
    28. End If
    29. End Sub


    Das speichern klappt ohne Fehler.
    Das resultat in der Datei(Notepad.exe):
    Spoiler anzeigen
    ꢙꩺꍘ逝㡇蔒଱㍝䗇쮾㓤⒰ꥺ曐쒓Ꞩ黆탕钪稀ᶎ箺㖶㩣뢾瞝ꐠ흯ḗ趗睫ꉉ쫠阸嶨혗ᄕ뱖�Mꜣ칳독튊囂媱꟬環衼틏ꎻ絰䝝뒖錏䓶퉻몕撿ℒ添�ൿ쮱滀䈥漴Ḁ랾ﺄ뀋。髃䑉䡓焊ᔯ崏劷䧺鄾虊笋╀쏅䑓茉龣䆢㟉읒 ⷗᪽睍ᬉ乔՚弸⋥㝉뚁ᮐ鯪௻뒉㕓ꢤܟ⿱诛嶒떗ཊᎭ╔㏭皠と藈쉆晣糑�﫣�槩딝ᤲ䨷믒㽲몕፳ݑ콩鬆�♖ꇍᓙ﷥ꯧ噎�瞹㠏�䩌䓳ᇘ⣇柆嚓ᅧ菦뮹᝜㩅�좇糑딞⾠ᑾ隴駧нឌꙷꈗ䌤捃㜵ᕴ봦ꏛ ׍Ꮱ暊㰳櫁䭥隟͏ʡ읔矃O﯉擆꿜㎷͘�됪ꟺ9躗黄ﯬ鄓︀됚䖞蘥7줜㯅鮠붳繻述끻킫씟蚘邟鏃淸됌�黿咳┡ꖚݖ늢뾌㯎斚ᛃ�뇴渂᫫꩕棝阖殂싽侹ແ䤗⿎诔Ⳬ翦칿桾灃ࠖ榢藺퓄ᰰ赮꣎뀓谺㙑�⊥퍐햄썦恺밦⸼⁦녷峿㐣뾀듣ử㮹㿡ᐧ恶ꅛ鱂䒣⬾ᄤ粹췱뵘⦕ᅎꙦ產㝞藠⑭阿듊㌥萞ᶯ츚撚良낆ښ磘뗦摣ꎘﰁ螚흙ጣ뙼�赋㏺絛螋繉钫䒂쮩ؕ�韆′镹뱸繕ꗵ朘⠶쐢杯㛩앜氘繨䀅蜦긹㩻䌵䷂倹鞵齈�馼ߥ뚰�靵ꏖ㋷ﻚ﯑Ȅ꘷ᴎ치忘㌰䀹挸菛襙⠋ﲰ꼒珆⤀咥鯴蹞픊쏒ꡛム辿뚢Ụ撓抚콌鶲ႄ㧈�㹤磎奖返谨㿻良쨟壂ؐ碍趱�芿ῂ勘䓎欑຋鉰읥礻伮᝷坻䶬힅纺딢⤦넗ᔉ֍鐠弚�솞㧧ἅ땁嫐叶總졘ᢍ騭䌖ꉓힼ桎ꞇ஘̻气蠮ਂ됆橪ઓ�ᣘ⩂�润日涝ʁ쮼穖럎ᇍ䲪찜踆㣱`⥎稒꽎›볷ⅴ煎䕫蓖캂ޕ㼠㎒诰鸌陨崭ƟО摓ゎ컬芽⪟罹ዊ홪㙑珰됫鹋铬輢鼫塞双㟙胴팽䉦鶯垏㲻벽썥䔏▞瀅滥煹ǻ櫱쒕玍䜂㸇䄌돇潰K俕ჸᡦ沰囶쉺䑸ᠧ惤쎿㚏㲀赨囊ϛᤕ陹椔繝쥙嬖늼퉢ᾖ뽊툂׾࿇絝⿻軈�ö᡽≏겢⤟賆ꨐ羜홥臈ꝍ臮뙦콁压ꪗꯂ륙ᩅ轂ƣ❦⃦࣪몂向ᥤ⁐儾䎀᪱ꊪ䤦䊊ፑ巆惷䭘샲�卍髖縧㏘ᘰ红�虃䇢Ꮷ瀉䜎囖䂾Ɨ祑ﵣ䴂脕䤥追뙎扐纰儯玌쏏ﹳ�虵쯞ㅆᛯꖹࣸ뉟뢋湴핀쾼蟺雱ꢄ鉜똠滊툥�ꛧ襚섄첏ڠ刽숟쏄怼㿴ꩥ⹐낞௣ܔ씻痎旽뿇퓱ᡤ뽯좢㽁鶗㗠☓磻讓퉇䱿缏⑔顰ᄡ⎩京і૝᧥࿱욈遳⑦Ⱗ溳쬨桦穱Ʌở뵬閯침硳廋울䬄峗螌쯆足撸儚︠ꓮ⟋鍬ⶏ龃鿋풊豟ⶄԭⴂ舯谓맫臹ઑ廐平迟㤙䓰⢧揇㭸쌝⚲뼹࿹ོ顎눗쪀∊虓ﷷ놂단肑솚略≪෥老➴㎂偍呹铥쥺旃⳿憳侐ﲨൊ쑳輸ᠴ災斁킭벐폙뤮웻阚ښ퓍콮ຍ䌋㌦ꢊ带汎簓탞蕂ⵛ懲ꠎ冶᧦ࡕ도砣籓븓嚨ຨ馮튞늭฼㨟浡䁫픫㟳園茮䧀○歾麞༇⃃נ蕨⊖ۊ㼱渗콣䲄贩묦涓ὑ燩µ㕀྾࣭Ṛ雋秪倪ੜ뼧訝�Ḳ睴ਫ甙鰔ൺ涇⁳�ꊡꐚⓘ⛈埞㕕�菨ﯽᑴ㣂⧎�慨ֶ�싟琝圝ᘞ跿謃啮ᢾɻ궪韨篒﷈坡ퟨ䮐ﮃ䕓簴뵱琶핲蕑蚔Ꟗꏗ྅髶


    Beim einlesen der Datei kommt jedoch hier

    VB.NET-Quellcode

    1. fstream = New FileStream(file, FileMode.Open)

    folgender Fehler:
    Spoiler anzeigen
    Der Prozess kann nicht auf die Datei "D:\Software\Selbstgeschrieben\Visual Basic\Programme\keySave\keySave\bin\Debug\data\hallo.ksd" zugreifen, da sie von einem anderen Prozess verwendet wird.


    Ich weis jedoch nicht welcher Prozess bereits darauf zugreift. (Hab ich evt. vergessen einen Stream zu schließen? Weiß nicht wo?)
    Ist der Code so überhaupt richtig?

    Vielen dank schonmal.
    OK hab den Code nochmals etwas umgestellt:

    VB.NET-Quellcode

    1. 'Speicerh und Laden
    2. Private Sub crypt(ByVal encrypt As Boolean)
    3. 'Verschlüsselungsalgorithmus
    4. Dim DES As New DESCryptoServiceProvider()
    5. DES.Key = System.Text.Encoding.ASCII.GetBytes("password") 'Passwort
    6. DES.IV = System.Text.Encoding.ASCII.GetBytes("12345678") 'Initialisierungsvektor
    7. Dim fileS As FileStream
    8. Dim cryptoS As CryptoStream
    9. If encrypt = True Then
    10. 'Verschlüsseln
    11. fileS = New FileStream(file, FileMode.Create)
    12. cryptoS = New CryptoStream(fileS, DES.CreateEncryptor(), CryptoStreamMode.Write)
    13. Dim bf As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
    14. Dim lstv(ListView1.Items.Count - 1) As ListViewItem
    15. ListView1.Items.CopyTo(lstv, 0)
    16. bf.Serialize(cryptoS, lstv)
    17. cryptoS.Close()
    18. fileS.Close()
    19. Else
    20. 'Entschlüsseln
    21. fileS = New FileStream(file, FileMode.Open)
    22. cryptoS = New CryptoStream(fileS, DES.CreateEncryptor(), CryptoStreamMode.Read)
    23. Dim bf As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
    24. ListView1.Items.Clear()
    25. ListView1.Items.AddRange(bf.Deserialize(cryptoS))
    26. cryptoS.Close()
    27. fileS.Close()
    28. proList()
    29. End If


    Jetzt bringt er wieder einen Fehler beim Entschlüsseln.
    Und zwar an folgender Stelle:

    VB.NET-Quellcode

    1. ListView1.Items.AddRange(bf.Deserialize(cryptoS))

    Fehler:
    Spoiler anzeigen
    Der Eingabestream hat kein gültiges binäres Format. Die Startinhalte (in Bytes) sind: 88-32-78-30-38-74-17-C6-49-FD-3D-58-47-6A-09-36-5F ...


    Warum? Mein Gedanke: Der Verschlüsselungsalgorithmus kann nicht mit dieser Art von Stream umgehen.

    EDIT: Problem gelöst!!!
    Der Fehler war in folgender Zeile beim entschlüsseln:

    VB.NET-Quellcode

    1. cryptoS = New CryptoStream(fileS, DES.CreateEncryptor(), CryptoStreamMode.Read)

    Statt
    DES.CreateEncryptor muss es natürlich DES.CreateDecryptor heißen.
    Weiß auch nicht warum ich es falsch übernommen habe.
    Aber Danke an alle fürs Mitdenken!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „samuel“ ()