Autor |
Beitrag |
Cäptin Pommes
      
Beiträge: 142
Erhaltene Danke: 2
|
Verfasst: Fr 15.04.11 11:41
hallo,
ich will eine Datei verschlüsseln bzw. die dort enthaltenen Daten. Ich habe vor dort Passwörter und sowas alles drin abzulegen und wenn man mit die datei öffnet (per notepad oder ähnlichen) soll man das natürlich nicht alles einsehen können
wie kann man sowas realiesieren?
danke im vorraus Moderiert von Kha: Topic aus C# - Die Sprache verschoben am Fr 15.04.2011 um 16:20
|
|
Cäptin Pommes 
      
Beiträge: 142
Erhaltene Danke: 2
|
Verfasst: Fr 15.04.11 12:40
ich hab schon was gefunden und ausprobiert, ... aber da gibs ein problem! hier erstmal der code:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
| private void createBtn_Click(object sender, EventArgs e) { MemoryStream ms = new MemoryStream(); StreamWriter sw = new StreamWriter(ms);
Directory.CreateDirectory("profiles/" + profile_name.Text);
sw.Write(CreateMD5Hash(master_psw.Text)); sw.Close();
StreamWriter sw2 = new StreamWriter("profiles/" + profile_name.Text + "/masterpsw.mpsw");
sw2.Write(Crypten(ms)); sw2.Close();
this.Close(); }
public CryptoStream Crypten(MemoryStream ms) { RijndaelManaged RMCrypto = new RijndaelManaged(); byte[] Key = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16 }; byte[] IV = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16 };
CryptoStream CryptStream = new CryptoStream(ms, RMCrypto.CreateEncryptor(Key, IV), CryptoStreamMode.Write); // hier passiert der fehler!!! er sagt mir dann Der Stream war nicht schreibbar. Parametername: stream
return CryptStream; } |
liegt das am MemoryStream? muss ich was anderes nehmen? oder was is falsch?
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Fr 15.04.11 13:25
Du darfst ms davor nicht schon über sw.Close schließen  .
_________________ >λ=
|
|
Cäptin Pommes 
      
Beiträge: 142
Erhaltene Danke: 2
|
Verfasst: Fr 15.04.11 13:43
ahh ja gut ^^ stimmt
gut das geht jetzt theoretisch ^^ aber er schreibt mir jetzt nich das in die datei was ich erwartet hatte ...
er schreibt jetzt lediglich "System.Security.Cryptography.CryptoStream" rein ...
das is jetzt wahrscheinlich wieder so banal wie gerade eben aber ich sehs nich o.O
edit: bzw. dachte ich das in CryptStream den ich zurück gebe drin steht was ich habe will
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Fr 15.04.11 16:20
Stimmt, StreamWriter.Write macht an der Stelle keinen Sinn. Aber wozu überhaupt der MemoryStream, warum nicht direkt in einen FileStream schreiben?
_________________ >λ=
|
|
Cäptin Pommes 
      
Beiträge: 142
Erhaltene Danke: 2
|
Verfasst: Fr 15.04.11 16:39
hmmm ich würd sagen weil ich es nich besser weiss ^^ aber ich bin jetzt schon ein klein wenig weiter ... das verschlüsseln klappt glaub ich die methode sieht jetzt so aus:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| public String Crypten(MemoryStream ms) { RijndaelManaged RMCrypto = new RijndaelManaged(); byte[] Key = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16 }; byte[] IV = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16 };
CryptoStream CryptStream = new CryptoStream(ms, RMCrypto.CreateEncryptor(Key, IV), CryptoStreamMode.Read);
StreamReader sr = new StreamReader(CryptStream); String content = sr.ReadToEnd(); return content; } |
ich hab mir content ausgeben lassen ... und sah aus als ob es geklappt hat ^^
jetzt brauch ich natürlich noch eine methode um wieder alles zu entschlüsseln
und die sieht im moment so aus:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| public String DeCrypten(MemoryStream ms) { RijndaelManaged RMCrypto = new RijndaelManaged(); byte[] Key = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16 }; byte[] IV = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16 };
CryptoStream CryptStream = new CryptoStream(ms, RMCrypto.CreateDecryptor(Key, IV), CryptoStreamMode.Read); StreamReader sr = new StreamReader(CryptStream); String content = sr.ReadToEnd(); return content; } |
das klappt aber jetzt leider nich  er sagt mir bei String content = sr.ReadToEnd(); "Der Index war außerhalb des Arraybereichs."
|
|
jaenicke
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 15.04.11 16:48
Ich vermute du setzt die Position im Stream nicht wieder auf den Anfang nachdem du die Daten hineingeschrieben hast.
|
|
Cäptin Pommes 
      
Beiträge: 142
Erhaltene Danke: 2
|
Verfasst: Fr 15.04.11 16:58
öhm ... wo den jetzt genau? und wie?
ich mein bei der ersten methode hab ichs doch genau so
|
|
jaenicke
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 15.04.11 17:07
Stell es dir einmal so vor:
Du nimmst jetzt ein Regal und sagst jemandem, dass er da alle Bücher von der aktuellen Position an hineinstellen soll (das ist der Anfang, denn du hast das Regal ja gerade erst initialisiert).
Danach sagst du ihm er soll jetzt alle Bücher ab der aktuellen Position lesen. Er steht aber vom Hineinstellen noch am Ende des Regals. Du musst ihm also vorher sagen, dass er sich wieder an den Anfang des Regals stellen soll und von da ab anfangen soll.
Genauso ist es hier. Die aktuelle Position in deinem Stream (den, den du an deine Funktionen übergibst) ist nach dem Schreiben am Ende des Streams. Wenn du also danach mit dem Entschlüsseln anfängst, fängst du auch am Ende an (vermute ich hier einmal, dass es so ist). Da kommen aber keine Daten mehr.
|
|
Cäptin Pommes 
      
Beiträge: 142
Erhaltene Danke: 2
|
Verfasst: Fr 15.04.11 18:27
ah ok ich weiss was du meinst, aber ich hab jetzt mal den quelltext überarbeitet damit er auch übersichtlicher ist und jetzt find ich es prinzipiell auch einfacher
ich hab dadurch jetzt aber auch nen neuen stream der ja dann auf anfang stehen müsste aber das prob ist immer noch
hier noch mal der neue quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49:
| private void createBtn_Click(object sender, EventArgs e) { Directory.CreateDirectory("profiles/" + profile_name.Text);
FileStream fs = new FileStream("profiles/" + profile_name.Text + "/masterpsw.mpsw",FileMode.Create); StreamWriter sw = new StreamWriter(fs);
label3.Text = DeCrypten(Crypten(CreateMD5Hash(master_psw.Text))); sw.Close();
}
public String Crypten(String toCrypt) { MemoryStream ms = new MemoryStream(); StreamWriter sw = new StreamWriter(ms); sw.Write(toCrypt);
RijndaelManaged RMCrypto = new RijndaelManaged(); byte[] Key = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16 }; byte[] IV = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16 };
CryptoStream CryptStream = new CryptoStream(ms, RMCrypto.CreateEncryptor(Key, IV), CryptoStreamMode.Read);
StreamReader sr = new StreamReader(CryptStream); String content = sr.ReadToEnd(); return content; }
public String DeCrypten(String toDeCrypt) { MemoryStream ms = new MemoryStream(); StreamWriter sw = new StreamWriter(ms); sw.Write(toDeCrypt);
RijndaelManaged RMCrypto = new RijndaelManaged(); byte[] Key = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16 }; byte[] IV = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16 };
CryptoStream CryptStream = new CryptoStream(ms, RMCrypto.CreateDecryptor(Key, IV), CryptoStreamMode.Read); StreamReader sr = new StreamReader(CryptStream); String content = sr.ReadToEnd(); return content; } |
so und in der DeCrypten() methode kommt der fehler ( String content = sr.ReadToEnd(); )
meintest du also ich soll die position von CryptStream auf den anfang setzten? fals ja das geht nicht zumindest nich mit CryptStream.Position = 0;
Moderiert von Christian S.: Code- durch C#-Tags ersetzt
|
|
Cäptin Pommes 
      
Beiträge: 142
Erhaltene Danke: 2
|
Verfasst: Sa 16.04.11 12:36
ohne nerven zu wollen ... aber ich hab noch keine lösung finden können
weiss kann mir da keiner weiter helfen?
|
|
3marci
      
Beiträge: 61
Erhaltene Danke: 5
Windows 7 / Kubuntu 11.04
C# / vb.net / php / progress (VS 2010 Express / SharpDevelop / NetBeans / proAlpha)
|
Verfasst: Sa 16.04.11 12:47
Mir ist gerade aufgefallen dass die Verschlüsselung so wie du sie hast gar nicht funktioniert.
Ich hab auch mal eine Rijndael Verschlüsselung benutzt, hier mal mein Code der funktioniert auch zuverlässig.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38:
| public string AESencrypt(string originalstring, string passphrase) { byte[] initVectorBytes; byte[] saltValueBytes; byte[] origTextBytes;
try { initVectorBytes = Encoding.UTF8.GetBytes("%1B2FdD4e5Fjh9H8"); saltValueBytes = Encoding.UTF8.GetBytes("ArcanumAES256"); origTextBytes = Encoding.UTF8.GetBytes(originalstring);
PasswordDeriveBytes pwd = new PasswordDeriveBytes(passphrase, saltValueBytes, "MD5", 2); byte[] keyBytes = pwd.GetBytes(256 / 8); RijndaelManaged symKey = new RijndaelManaged();
symKey.Padding = PaddingMode.ISO10126; symKey.Mode = CipherMode.CBC;
ICryptoTransform encryptor = symKey.CreateEncryptor(keyBytes, initVectorBytes); MemoryStream memstr = new MemoryStream(); CryptoStream crypstr = new CryptoStream(memstr, encryptor, CryptoStreamMode.Write);
crypstr.Write(origTextBytes, 0, origTextBytes.Length); crypstr.FlushFinalBlock();
byte[] cipherTextBytes = memstr.ToArray();
memstr.Close(); crypstr.Close();
return Convert.ToBase64String(cipherTextBytes); } catch { return originalstring; } } |
|
|
Cäptin Pommes 
      
Beiträge: 142
Erhaltene Danke: 2
|
Verfasst: Sa 16.04.11 16:01
hmmm ich hab das von der msdn so übernommen ... naja ...
aber könntest du vieleicht deinen code auskommentieren? Ich versteh leider nicht was wo passiert, ... das wäre sehr nett 
|
|
jaenicke
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 16.04.11 16:10
Das Problem müssen deine Key/IV-Variablen sein. Das Beispiel aus der MSDN funktioniert bei mir jedenfalls problemlos. Und der Unterschied ist genau, dass du diese Variablen selbst setzt...
|
|
Dr. Hallo
      
Beiträge: 110
Erhaltene Danke: 13
XP
C/C++/C#
|
Verfasst: Sa 16.04.11 16:45
falls die datei nicht zu groß ist hier ein algorythmus...
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117:
| public static string encodeText(string sText, string sPassword) { if(sPassword == "") return "";
int i=0, j=0, q=0; int nLetter; string buffer; string sResult1 = "", sResult2 = "";
while (i < sText.Length) { nLetter = sText[i]; nLetter += q + sPassword[j]; buffer = nLetter.ToString("000"); sResult1 += buffer;
if (j < sPassword.Length - 1) j++; else j = 0; i++; q = (int)Math.Abs(Math.Sin(i / 10.0f) * 5); }
i=0;int k; while(i < sResult1.Length) { buffer = ""; for(k=0;k<2;k++) { if (i + k < sResult1.Length) buffer += sResult1[i + k]; else { break; } }
nLetter = Convert.ToInt32(buffer); if(nLetter >= 58 && nLetter <= 99 || nLetter >= 33 && nLetter <= 47) sResult2 += (char)nLetter; else if(nLetter >= 0 && nLetter <= 32 || nLetter >= 48 && nLetter <= 57 ) sResult2 += (char)(nLetter + 161); else sResult2 += buffer;
i+=2; } return sResult2; }
public static string decodeText(string sText, string sPassword) { if(sPassword == "") return sText;
int i=0, j=0; int nLetter; string buffer; string sResult1 = "", sResult2 = "";
while (i < sText.Length) { nLetter = sText[i]; if(nLetter >= 58 && nLetter <= 99 || nLetter >= 33 && nLetter <= 47) { buffer = nLetter.ToString("00"); sResult1 += buffer; } else if(nLetter > 127) { buffer = (nLetter - 161).ToString("00"); sResult1 += buffer; } else sResult1 += sText[i];
i++; }
int nLen = sResult1.Length; char tmp; if(nLen % 3 != 0) {
tmp = sResult1[nLen-1]; sResult1 = sResult1.Remove(nLen - 2); sResult1 += tmp; }
i = 0; int k, q = 0; while (i < sResult1.Length) { buffer = ""; for(k=0;k<3;k++) { if (i + k < sResult1.Length) buffer += sResult1[i + k]; else { break; } }
try { nLetter = Convert.ToInt32(buffer) - q - sPassword[j]; } catch { return ""; }
sResult2 += (char)nLetter;
if (j < sPassword.Length - 1) j++; else j = 0; i+=3; q = (int)Math.Abs(Math.Sin(i / 30.0f) * 5); } return sResult2; } |
|
|
Cäptin Pommes 
      
Beiträge: 142
Erhaltene Danke: 2
|
Verfasst: Sa 16.04.11 16:49
aaaaaalsooo ich habs jetzt hinbekommen
das verschlüsseln und entschlüsseln klappt nun problemlos
ich hatte erst ein anderes beispiel gefunden auf der msdn und damit hatte es halt nich gefunzt ... aber jetzt gehts wunderbar
danke euch allen, jetzt kann ich entlich weiter machen ^^
|
|
|