Laden...

Crypto Stream: memory stream verschlüsseln und anschließend wieder entschlüsseln

Erstellt von dein.Tod vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.031 Views
D
dein.Tod Themenstarter:in
69 Beiträge seit 2008
vor 13 Jahren
Crypto Stream: memory stream verschlüsseln und anschließend wieder entschlüsseln

Ich muss leider eingestehen das ich es nicht schaffe den crypto stream zu verwenden - ich habe jetzt mehrere stunden herumprobiert, habe es aber trotzdem nicht geschafft ^^ Auch nicht mit den Sampels aus Google/MSDN etc.

Mein vorläufiges ziel war es einen memory stream zu verschlüsseln und andschließen wieder zu entschlüsseln, muss noch nichtmal gebuffered sein.

Hätte jemand vieleicht die güte einen von selbstzweifeln geplagten programmierer zu helfen?
(Wundert euch nciht über die komischen codekonstrukte ich habe schon viel versucht)

Immoment crashed er bei der deserialisierung.



using System;
using System.Collections.Generic;
using System.Text;

using System.IO;
using System.Security.Cryptography;

namespace CryptoTest
{
class Program
{
static void Main(string[] args)
{
byte[] password = new byte[] { 33, 44, 55 };
MemoryStream dataStream = new MemoryStream(new byte[]
{
55, 213, 12, 66, 88, 99
});

var cryptClass = new CryptClass();

Console.WriteLine("Original:");
DisplayStream(dataStream);

Stream cryptedStream = cryptClass.Encrypt(dataStream, password);
Console.WriteLine("Crypted:");
DisplayStream(cryptedStream);

Stream decryptedStream = cryptClass.Decrypt(cryptedStream, password);
Console.WriteLine("Decrypted:");
DisplayStream(decryptedStream);

Console.ReadLine();
}

static void DisplayStream(Stream stream)
{
StringBuilder sb = new StringBuilder();

byte[] buffer = new byte[stream.Length];
stream.Read(buffer, 0, buffer.Length);

for (int i = 0; i < buffer.Length; i++)
{
sb.Append(buffer[i] + " ");
}

Console.WriteLine(sb.ToString());
}
}

public class CryptClass
{
public CryptClass()
{

}

protected static readonly byte[] Salt =
{
0x49, 0x76, 0x61, 0x6e,
0x20, 0x4d, 0x65, 0x64,
0x76, 0x65, 0x64, 0x65,
0x33, 0xb3, 0xfa, 0x9c
};


public Stream Encrypt(Stream toEncrypt, byte[] password)
{
Rijndael rijndael = BuildRijndael(password);

byte[] toEncryptByteArr = new byte[toEncrypt.Length];
toEncrypt.Read(toEncryptByteArr, 0, toEncryptByteArr.Length);

using (MemoryStream memoryStream = new MemoryStream())
{
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, rijndael.CreateEncryptor(), CryptoStreamMode.Write))
{
cryptoStream.Write(toEncryptByteArr, 0, (int)toEncrypt.Length);
// Write to memoryStream;

return new MemoryStream(memoryStream.ToArray());
}
}
}

public Stream Decrypt(Stream toDecrypt, byte[] password)
{
Rijndael rijndael = BuildRijndael(password);

byte[] toDecryptByteArr = new byte[toDecrypt.Length];
toDecrypt.Read(toDecryptByteArr, 0, toDecryptByteArr.Length);

using (MemoryStream memStream = new MemoryStream())
{
using (CryptoStream cryptoStream = new CryptoStream(memStream, rijndael.CreateDecryptor(), CryptoStreamMode.Write))
{
cryptoStream.Write(toDecryptByteArr, 0, (int)toDecrypt.Length);
return new MemoryStream(memStream.ToArray());
}
}
}

private Rijndael BuildRijndael(byte[] key)
{
PasswordDeriveBytes pdb = new PasswordDeriveBytes(key, CryptClass.Salt);
Rijndael rijndael = Rijndael.Create();
rijndael.Key = pdb.GetBytes(16);
rijndael.IV = pdb.GetBytes(16);
return rijndael;
}
}
}

Bei Risiken oder Nebenwirkungen fressen sie die Packungsbeilage oder schlagen sie ihren Arzt mit ihrem Apoteker.

P
20 Beiträge seit 2007
vor 13 Jahren

Moin, moin,

den Code kann ich auf die Schnelle leider nicht testen, aber ich habe persönlich mit folgender Bibliothek gute Erfahrungen gemacht:

http://www.bouncycastle.org/csharp/

Bisher hat die keinerlei Wünsche offen gelassen 😃

cu
PolarKreis

Wer zu gross ist für die kleinen Dinge des Lebens,
ist meistens auch zu klein für die grossen