szyfrowanie string'ów

0

Witam,
Macie/znacie może jakiś sprawdzony, bezpieczny algorytm szyfrujący i deszyfrujący??:)
Chce zrobić formatke z 2 buttonami i 1 textboxem - 1 button miałby kodować text z textboca - a 2 dekodować... Docelowo chciałbym to wykorzystać do szyfrowania danych w pliku (loginy do bazy)...
Możecie mi jakoś pomóc - może jakiś przykład czy coś ??:)

z góry dzięki za pomoc,
pozdrawiam North:)

0

Loginy, jeśli można, to zalecam hashować. MD5CryptoServiceProvider z System.Security.Cryptography będzie tu pomocny (ewentualnie SHA1 czy coś innego).

W tej samej przestrzeni znajdziesz też wszystko co potrzebne do kodowania.

0

tylko jak zakoduje MD5 to nie odkoduje :/ a ja potrzebuje możliwość kodowaina i dekodowania.... :/

0

W takim razie np. AES, o ile pamietam jest w tej samej przestrzeni.

//edit
w kregach c# i msdn znany jako Rijndael :)

pozdrawiam
johny

0

No i znalazłem ten algorytm:

private void button1_Click(object sender, EventArgs e)
        {
            string original = "To jest testowy string!!!!";
            string roundtrip;
            ASCIIEncoding textConverter = new ASCIIEncoding();
            RijndaelManaged myRijndael = new RijndaelManaged();
            byte[] fromEncrypt;
            byte[] encrypted;
            byte[] toEncrypt;
            byte[] key;
            byte[] IV;

            myRijndael.GenerateKey();
            myRijndael.GenerateIV();

            key = myRijndael.Key;
            IV = myRijndael.IV;

            ICryptoTransform encryptor = myRijndael.CreateEncryptor(key, IV);

            MemoryStream msEncrypt = new MemoryStream();
            CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write);

            toEncrypt = textConverter.GetBytes(original);

            csEncrypt.Write(toEncrypt, 0, toEncrypt.Length);
            csEncrypt.FlushFinalBlock();

            encrypted = msEncrypt.ToArray();
            ICryptoTransform decryptor = myRijndael.CreateDecryptor(key, IV);

            MemoryStream msDecrypt = new MemoryStream(encrypted);
            CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read);

            fromEncrypt = new byte[encrypted.Length];

            csDecrypt.Read(fromEncrypt, 0, fromEncrypt.Length);

            roundtrip = textConverter.GetString(fromEncrypt);

            textBox1.Text = original;
            textBox2.Text = XXXXXXXXXXXXXXXXXX
        }

Kodowany ciąg znaków to: "To jest testowy string!!!!" a co jest zakodowaną wartością??


http://pl.wikipedia.org/wiki/Rijndael - znalazłem w opisie że ten algorytm może szyfrować 128, 192 i 256 bitów - w ilu bitach szyfruje ten kod??

0

Tak jak w kazdym takim algorytmie odpowiedzia jest ciag bajtow (wejscie rowniez :))

Mozesz wiec zapisac jak leci, mozesz przekonwertowac na hex'a, co bedzie wygodniej.

znalazłem w opisie że ten algorytm może szyfrować 128, 192 i 256 bitów - w ilu bitach szyfruje ten kod??

Wspiera kazda wersje - wlasciwosc KeySize. Wszystko napisane w msdn :)

pozdrawiam
johny

0

ja się dopiero ucze C# a Ty mi tu z hex'ami wyskakujesz;)

wiesz może która zmienna przechowuje zakodowany tekst??;)

0

Rowniez w msdn jest jasniejszy przyklad:

    public static void EncryptTextToFile(String Data, String FileName, byte[] Key, byte[] IV)
    {
        try
        {
            // Create or open the specified file.
            FileStream fStream = File.Open(FileName, FileMode.OpenOrCreate);

            // Create a new Rijndael object.
            Rijndael RijndaelAlg = Rijndael.Create();

            // Create a CryptoStream using the FileStream 
            // and the passed key and initialization vector (IV).
            CryptoStream cStream = new CryptoStream(fStream,
                RijndaelAlg.CreateEncryptor(Key, IV),
                CryptoStreamMode.Write);

            // Create a StreamWriter using the CryptoStream.
            StreamWriter sWriter = new StreamWriter(cStream);

            try
            {
                // Write the data to the stream 
                // to encrypt it.
                sWriter.WriteLine(Data);
            }
            catch (Exception e)
            {
                Console.WriteLine("An error occurred: {0}", e.Message);
            }
            finally
            {
                // Close the streams and
                // close the file.
                sWriter.Close();
                cStream.Close();
                fStream.Close();
            }
        }
        catch (CryptographicException e)
        {
            Console.WriteLine("A Cryptographic error occurred: {0}", e.Message);
        }
        catch (UnauthorizedAccessException e)
        {
            Console.WriteLine("A file error occurred: {0}", e.Message);
        }

    }

z ktorego wynika, ze wystarczy zapisac do stworzonego strumienia CryptoStream dane, zeby je zaszyfrowac. W takim razie odczytaj pozniej z niego i dostaniesz prawdopodobnie zaszyfrowany tekst. Zeby sie przekonac, ze odczytales wlasciwe pozniej je zdeszyfruj :)

pozdrawiam
johny

0

qurcze, chyba sobie z tym nie poradze...:/

0

wiecie może w czym jest przechowywana zakodowana wartość tego stringu (kod z góry) - i jak to wyświetlić w messageBoxie??

dzięki za ten 2 kod - tylko tego Twojego <ort>w ogóle </ort>nie kumam :(

0

Nie ma to jak z motyka na slonce :P

Stworz Console Application i pusc to:

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

class RijndaelSample
{
    static void Main()
    {
        try
        {
            Rijndael RijndaelAlg = Rijndael.Create();
            string sData = "Here is some data to encrypt.";
            byte [] encrypted = EncryptText(sData, RijndaelAlg.Key, RijndaelAlg.IV);
            String Key = "";
            String IV = "";
            String encryptedString = "";
            foreach(byte Byte in RijndaelAlg.Key)
            	Key += Byte.ToString("x2");
            foreach(byte Byte in RijndaelAlg.IV)
            	IV += Byte.ToString("x2");
            foreach(byte Byte in encrypted)
            	encryptedString += Byte.ToString("x2");
            
            Console.WriteLine("Key: " + System.Text.Encoding.ASCII.GetString(RijndaelAlg.Key) + " hex: " + Key);
            Console.WriteLine("IV: " + System.Text.Encoding.ASCII.GetString(RijndaelAlg.IV) + " hex: " + IV);
            Console.WriteLine("Encrypted: " + System.Text.Encoding.ASCII.GetString(encrypted) + " hex: " +encryptedString);
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
        Console.ReadLine();
    }

    public static byte[]  EncryptText(String Data, byte[] Key, byte[] IV)
    {
        byte[] ret = null;
        try
        {
            MemoryStream fStream = new MemoryStream();
	          Rijndael RijndaelAlg = Rijndael.Create();
            CryptoStream cStream = new CryptoStream(fStream,
                RijndaelAlg.CreateEncryptor(Key, IV),
                CryptoStreamMode.Write);
            StreamWriter sWriter = new StreamWriter(cStream);
            try
            {
                sWriter.WriteLine(Data);
                sWriter.Flush();
                ret = fStream.ToArray();
            }
            catch (Exception e)
            {
                Console.WriteLine("An error occurred: {0}", e.Message);
            }
            finally
            {
                sWriter.Close();
                cStream.Close();
                fStream.Close();
            }
        }
        catch (CryptographicException e)
        {
            Console.WriteLine("A Cryptographic error occurred: {0}", e.Message);
        }
        return ret;
    }
}

pozdrawiam
johny

0

No to ja mam jeszcze jedno pytanko... co to jest te "IV" ? Gdzies niby czytalem ze to jakis wektor i czy nie moge go po prostu pominac?. Chcialem sobie zaszyfrowac dane DES'em i poza kluczem chce jeszcze te IV...

Druga rzecz to hash'e. Mozna w .net'cie jakos uzyskiwac hashe o okreslonej dlugosci? Np. uzywam jakiejs funkcji hashujacej i wybieram jakiej dlugosci hash mam otrzymac.

0
wasiu napisał(a)

No to ja mam jeszcze jedno pytanko... co to jest te "IV" ? Gdzies niby czytalem ze to jakis wektor i czy nie moge go po prostu pominac?. Chcialem sobie zaszyfrowac dane DES'em i poza kluczem chce jeszcze te IV...

msdn napisał(a)

For a given secret key k, a simple block cipher that does not use an initialization vector will encrypt the same input block of plain text into the same output block of cipher text. If you have duplicate blocks within your plain text stream, you will have duplicate blocks within your cipher text stream. If unauthorized users know anything about the structure of a block of your plain text, they can use that information to decipher the known cipher text block and possibly recover your key. To combat this problem, information from the previous block is mixed into the process of encrypting the next block. Thus, the output of two identical plain text blocks is different. Because this technique uses the previous block to encrypt the next block, an initialization vector is needed to encrypt the first block of data.

Innymi slowy jesli szyfrujesz tekst o dlugosci max jednego bloku danych (w desie to 64B o ile pamietam) to ten wektor nie jest potrzebny. Natomiast przy szyfrowaniu wiekszej ilosci tekstu, jest on wiazany w bloki, ktore sa szyfrowane osobno. Ale przy dobrej znajomosci algorytmu szyfrujacego, charakteru wiadomosci oryginalnej i wiedzy, ze pewne bloki sie powtarzaja, mozna sobie ulatwic poszukiwanie klucza i/ lub oryginalnej wiadomosci (bo to znaczy, ze powtarzajace sie zaszyfrowane bloki reprezentuja ten sam tekst oryginalny). Standardowo jest uzywany algorytm CBC laczenia blokow, ktory do zaszyfrowania kolejnego bloku uzywa bloku poprzedniego skombinowanego (np. xorem) z wektorem inicjalizujacym (IV). Dzieki temu ten sam tekst w innym miejscu nie bedzie mial takiej samej postaci zaszyfrowanej, bo inny byl blok poprzedzajacy.

wasiu napisał(a)

Druga rzecz to hash'e. Mozna w .net'cie jakos uzyskiwac hashe o okreslonej dlugosci? Np. uzywam jakiejs funkcji hashujacej i wybieram jakiej dlugosci hash mam otrzymac.

O ile wiem wszystkie funkcje haszujace daja na wyjscie okreslona dlugosc hasha (np. MD5 to 32B) i nie mozesz jej zmienic. Co najwyzej mozesz sam pozniej wlasna funkcja zhaszowac hasha :) lub wybrac ten o najblizszej dlugosci hasha i np. obcinac/dodawac pozostale. Byleby to obciecie nie obcinalo np. polowy, bo wtedy znacznie zwiekszasz szanse powtorzenia hasha dla roznych danych - czyli caly sens haszowania ginie.

pozdrawiam
johny

0

I tak dalej nie rozumiem idei tego wektoru inicjalizujacego... nie mozna do tego po prostu klucza uzyc? Czy przy deszyfrowaniu zatem potrzebne mi sa i klucz i wektor inicjalizujacy?

Jakim algorytmem najlepiej sie poslugiwac jesli chce cala operacje przeprowadzic jak najprosciej i uzywac tylko jednego klucza, ktorym bedzie np hash jakiegos hasla?

0
wasiu napisał(a)

I tak dalej nie rozumiem idei tego wektoru inicjalizujacego... nie mozna do tego po prostu klucza uzyc? Czy przy deszyfrowaniu zatem potrzebne mi sa i klucz i wektor inicjalizujacy?

Nie mozna uzyc, bo zazwyczaj dlugosc klucza i dlugosc wektora inicjalizujacego sa rozne. Np. des: klucz 56B, IV 64B (dlugosc bloku). Tak, przy deszyfrowaniu potrzebny jest i klucz i wektora inicjalizujacy.

Jakim algorytmem najlepiej sie poslugiwac jesli chce cala operacje przeprowadzic jak najprosciej i uzywac tylko jednego klucza, ktorym bedzie np hash jakiegos hasla?

</quote>

Ja bym to zrobil tak, ze 'moj' klucz skladalby sie z klucza wlasciwego i IV. Czyli dla DESa 'moj' klucz mialby 120B, gdzie pierwsze 56 to wlasciwy klucz a pozostale 64 to IV. Po drugie jesli w jakims algorytmie te dlugosci sa takie same, to nikt nie bronic Ci uzyc tej samej wartosci. Po trzecie uzyj GenerateIV, to nie bedziesz musial go wymyslac, a tylko zapamietac.

pozdrawiam
johny</quote>

0

Proszę bardzo:
1.) Oto metoda do kodowania stringów:

        public static string EncryptText(string plainText,
                                     string passPhrase,
                                     string saltValue,
                                     string hashAlgorithm,
                                     int passwordIterations,
                                     string initVector,
                                     int keySize)
        {
            // Convert strings into byte arrays.
            // Let us assume that strings only contain ASCII codes.
            // If strings include Unicode characters, use Unicode, UTF7, or UTF8 
            // encoding.
            byte[] initVectorBytes = Encoding.ASCII.GetBytes(initVector);
            byte[] saltValueBytes = Encoding.ASCII.GetBytes(saltValue);

            // Convert our plaintext into a byte array.
            // Let us assume that plaintext contains UTF8-encoded characters.
            byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);

            // First, we must create a password, from which the key will be derived.
            // This password will be generated from the specified passphrase and 
            // salt value. The password will be created using the specified hash 
            // algorithm. Password creation can be done in several iterations.
            PasswordDeriveBytes password = new PasswordDeriveBytes(
                                                            passPhrase,
                                                            saltValueBytes,
                                                            hashAlgorithm,
                                                            passwordIterations);

            // Use the password to generate pseudo-random bytes for the encryption
            // key. Specify the size of the key in bytes (instead of bits).
            byte[] keyBytes = password.GetBytes(keySize / 8);

            // Create uninitialized Rijndael encryption object.
            RijndaelManaged symmetricKey = new RijndaelManaged();

            // It is reasonable to set encryption mode to Cipher Block Chaining
            // (CBC). Use default options for other symmetric key parameters.
            symmetricKey.Mode = CipherMode.CBC;

            // Generate encryptor from the existing key bytes and initialization 
            // vector. Key size will be defined based on the number of the key 
            // bytes.
            ICryptoTransform encryptor = symmetricKey.CreateEncryptor(
                                                             keyBytes,
                                                             initVectorBytes);

            // Define memory stream which will be used to hold encrypted data.
            MemoryStream memoryStream = new MemoryStream();

            // Define cryptographic stream (always use Write mode for encryption).
            CryptoStream cryptoStream = new CryptoStream(memoryStream,
                                                         encryptor,
                                                         CryptoStreamMode.Write);
            // Start encrypting.
            cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);

            // Finish encrypting.
            cryptoStream.FlushFinalBlock();

            // Convert our encrypted data from a memory stream into a byte array.
            byte[] cipherTextBytes = memoryStream.ToArray();

            // Close both streams.
            memoryStream.Close();
            cryptoStream.Close();

            // Convert encrypted data into a base64-encoded string.
            string cipherText = Convert.ToBase64String(cipherTextBytes);

            // Return encrypted string.
            return cipherText;
        }

A oto wywołania takiej metody

string zaszyfrowanytext = EncryptText("Jestem genialny - czyli text do zaszyfrowania",
                                      "", //< tu klucz 32 znaków (liter i cyfr)
                                      "", //< tu klucz 32 znaków (liter i cyfr) iny niż powyższy
                                      "SHA1", //< nie zmieniamy
                                      3, //< dowonla liczba
                                      "", //< klucz 16 znaków (liter i cyfr) inny niż powyższe 2
                                      256); //< zostaje 256

2.) Metoda do kodowania znaków:

        public static string DecryptText(string cipherText,
                                     string passPhrase,
                                     string saltValue,
                                     string hashAlgorithm,
                                     int passwordIterations,
                                     string initVector,
                                     int keySize)
        {
            // Convert strings defining encryption key characteristics into byte
            // arrays. Let us assume that strings only contain ASCII codes.
            // If strings include Unicode characters, use Unicode, UTF7, or UTF8
            // encoding.
            byte[] initVectorBytes = Encoding.ASCII.GetBytes(initVector);
            byte[] saltValueBytes = Encoding.ASCII.GetBytes(saltValue);

            // Convert our ciphertext into a byte array.
            byte[] cipherTextBytes = Convert.FromBase64String(cipherText);

            // First, we must create a password, from which the key will be 
            // derived. This password will be generated from the specified 
            // passphrase and salt value. The password will be created using
            // the specified hash algorithm. Password creation can be done in
            // several iterations.
            PasswordDeriveBytes password = new PasswordDeriveBytes(
                                                            passPhrase,
                                                            saltValueBytes,
                                                            hashAlgorithm,
                                                            passwordIterations);

            // Use the password to generate pseudo-random bytes for the encryption
            // key. Specify the size of the key in bytes (instead of bits).
            byte[] keyBytes = password.GetBytes(keySize / 8);

            // Create uninitialized Rijndael encryption object.
            RijndaelManaged symmetricKey = new RijndaelManaged();

            // It is reasonable to set encryption mode to Cipher Block Chaining
            // (CBC). Use default options for other symmetric key parameters.
            symmetricKey.Mode = CipherMode.CBC;

            // Generate decryptor from the existing key bytes and initialization 
            // vector. Key size will be defined based on the number of the key 
            // bytes.
            ICryptoTransform decryptor = symmetricKey.CreateDecryptor(
                                                             keyBytes,
                                                             initVectorBytes);

            // Define memory stream which will be used to hold encrypted data.
            MemoryStream memoryStream = new MemoryStream(cipherTextBytes);

            // Define cryptographic stream (always use Read mode for encryption).
            CryptoStream cryptoStream = new CryptoStream(memoryStream,
                                                          decryptor,
                                                          CryptoStreamMode.Read);

            // Since at this point we don't know what the size of decrypted data
            // will be, allocate the buffer long enough to hold ciphertext;
            // plaintext is never longer than ciphertext.
            byte[] plainTextBytes = new byte[cipherTextBytes.Length];

            // Start decrypting.
            int decryptedByteCount = cryptoStream.Read(plainTextBytes,
                                                       0,
                                                       plainTextBytes.Length);

            // Close both streams.
            memoryStream.Close();
            cryptoStream.Close();

            // Convert decrypted data into a string. 
            // Let us assume that the original plaintext string was UTF8-encoded.
            string plainText = Encoding.UTF8.GetString(plainTextBytes,
                                                       0,
                                                       decryptedByteCount);

            // Return decrypted string.   
            return plainText;
        }

A oto wywołania takiej metody

string odkodowanytext = EncryptText("tekst zaszyfrowany",
                                      "", //< tu klucz 32 znaków (liter i cyfr)
                                      "", //< tu klucz 32 znaków (liter i cyfr) iny niż powyższy
                                      "SHA1", //< nie zmieniamy
                                      3, //< dowonla liczba
                                      "", //< klucz 16 znaków (liter i cyfr) inny niż powyższe 2
                                      256); //< zostaje 256

Pozdro!

0

troche odświeże temat...

Poniżej kod, który używam przy zapisie zaszyfrowanego tekstu do pliku

			string password = "12345678";      			
			UnicodeEncoding UE = new UnicodeEncoding();
			byte[] key = UE.GetBytes(password);
			string path1 = Directory.GetCurrentDirectory();
			
			FileStream fsFile1 = new FileStream(path1 + "\\outgoing_log.txt", FileMode.Append);
			RijndaelManaged RMCrypto = new RijndaelManaged();
			CryptoStream cs = new CryptoStream(fsFile1, RMCrypto.CreateEncryptor(key, key), CryptoStreamMode.Write);
			StreamWriter sw = new StreamWriter(cs, Encoding.Unicode);
			sw.WriteLine(log);
			sw.Close();
			fsFile1.Close();

A tutaj, który używam do odczytu zaszyfrowanych tekstów z pliku:

			string password = "12345678";      			
			UnicodeEncoding UE = new UnicodeEncoding();
			byte[] key = UE.GetBytes(password);
			
			FileStream fsFile2 = new FileStream(LogPath + "\\outgoing_log.txt", FileMode.OpenOrCreate);
			RijndaelManaged RMCryptp = new RijndaelManaged();
			CryptoStream ds = new CryptoStream(fsFile2,RMCryptp.CreateDecryptor(key, key), CryptoStreamMode.Read);
			StreamReader sr2 = new StreamReader(ds, Encoding.Unicode);
			while (!sr2.EndOfStream)
			{
				textBox2.Text = textBox2.Text.Insert(textBox2.Text.Length, sr2.ReadLine() + "\r\n");
			}
			sr2.Close();
			fsFile2.Close();

Przy zapisie i późniejszym odczycie jednej zaszyfrowanej linii z pliku wszystko niby jest OK, ale gdy do pliku dopisze drugą linię to już coś się "kaszani", bo po odczycie są "krzaczki" pomiędzy liniami:

04/11/2010 1506 SMS to 508134xxx "abc"
Ȃ쌖㨭ၐὖ͝䆑㈱010 1509 SMS to 508134xxx "abc"

0

Czy ten kod w ogole dziala? Podajesz haslo jako klucz i wektor IV, ktore musza miec okreslona dlugosc, a raczej nie maja, wiec powinien leciec wyjatek.

0

wyjątek nie występuje i kod z tego co widzę działa - jak podejrzę plik to zapis w nim jest zaszyfrowany,

korzystałem z przykładu na 159 stronie tego PDF'a:
http://student.agh.edu.pl/~feanaro/C-sharp%20%20i%20programowanie%20pod%20Windows.pdf

dlaczego piszesz, że nie zgadza się długość ??

0

Bo:

  1. http://msdn.microsoft.com/en-us/library/f9df14hc%28v=VS.90%29.aspx
msdn napisał(a)

The secret key to be used for the symmetric algorithm. The key size must be 126, 128, or 256 bits
a u Ciebie podawany klucz ma dlugosc hasla * 2 (UTF-16).

  1. wektor IV ma dlugosc szyfrowanego bloku, co w przypadku AESa (o ile pamietam) znaczy 16 bajtow.

Skompiluje jeszcze kod zaraz, to sam sobie sprawdze, ale dziwne jesli dziala.

//edit
Aaaa, juz kumam. Podajesz akurat haslo takiej dlugosci jak trzeba. Innymi slowy nie bedzie dzialac dla hasel o dlugosci roznej niz 8 znakow.

//edit2
Tak odnosnie tematu. Sprobuj czytac sr2.ReadToEnd() zamiast ReadLine, tutaj moze byc problem.

0

próbowałem już sr2.ReadToEnd() i wynik jest ten sam...

próbowałem też przy zapisie używać sw.Write(log) i też to samo...

nie wiem co tu jeszcze wykombinować....

0

U mnie hula, znaczy sie odczytuje normalnie. W jaki sposob podajesz tresc wiadomosci? Podaj przykladowy kod z trescia, ktory nie dziala.

0

szyfrowanie i zapis strumienia do pliku mam we funkcji, której argumentem jest podawany string:

void write_outgoing(string log)
		{
			string password = "12345678";      			
			UnicodeEncoding UE = new UnicodeEncoding();
			byte[] key = UE.GetBytes(password);
			string path1 = Directory.GetCurrentDirectory();
			
			FileStream fsFile1 = new FileStream(path1 + "\\outgoing_log.txt", FileMode.Append);
			RijndaelManaged RMCrypto = new RijndaelManaged();
			CryptoStream cs = new CryptoStream(fsFile1, RMCrypto.CreateEncryptor(key, key), CryptoStreamMode.Write);
			StreamWriter sw = new StreamWriter(cs, Encoding.Unicode);
			sw.WriteLine(log);
			//sw.Write(log);
			sw.Close();
			fsFile1.Close();
		}

odczyt logów (zaszyfrowanych danych z pliku) i wsatwienie ich do TextBox'a mam we funkcji:

void odczyt_logow()
		{
			string LogPath = Directory.GetCurrentDirectory();
			string password = "12345678";      			
			UnicodeEncoding UE = new UnicodeEncoding();
			byte[] key = UE.GetBytes(password);
			
			FileStream fsFile2 = new FileStream(LogPath + "\\outgoing_log.txt", FileMode.OpenOrCreate);
			RijndaelManaged RMCryptp = new RijndaelManaged();
			CryptoStream ds = new CryptoStream(fsFile2,RMCryptp.CreateDecryptor(key, key), CryptoStreamMode.Read);
			StreamReader sr2 = new StreamReader(ds, Encoding.Unicode);
			while (!sr2.EndOfStream)
			{
				textBox2.Text = textBox2.Text.Insert(textBox2.Text.Length, sr2.ReadLine() + "\r\n");
			}
			sr2.Close();
			fsFile2.Close();
		}
0

Jeszcze przykladowa tresc podaj. Jak mowilem - u mnie znaczki nie wystepuja, dziala. Podaj pelen przyklad, ktory u Ciebie wylatuje. Najlepiej minimalny, bez okienek, itp.

0

np. pod przyciskiem:

		void Button5Click(object sender, EventArgs e)
		{
			write_outgoing("04/12/2010 17:25:37 SMS  to 500123456  \"abc\"");
		}
0

Chyba sie nie dogadamy. Jedna linijka Ci dziala - sam mowiles. 2 linijki nie. U mnie 2 linijki dzialaja. Znaczy sie podejrzewam, ze w dziwny sposob te 2 linijki podajesz. Podales przyklad z jedna linijka.

0

no ok, po prostu naciskam 2x ten przycisk Button5, czyli 2 razy dodaje ten tekst do funkcji szyfrowania i zapisu do pliku.

0

Ok, no to jasne. Problem w tym, ze nie do konca rozumiesz szyfrowanie. Szyfrujesz 2 osobne teksty, a deszyfrujesz jako jeden. Problem w tym, ze algorytm jest blokowy, co oznacza, ze bloki laczone sa za pomoca poprzedniego. Poczytaj o CBC na przyklad, ten chyba jest domyslny. Efekt wynika z faktu, ze szyfrujesz 2 teksty inicjujac ponownie algorytm wektorem IV. Czyli pierwszy blok laczony jest z wektorem IV, nastepny z pierwszym, itp. Deszyfrujac idzie tak samo. Kolejna linijka czytana jest bez inicjalizacji, zatem za wektor IV sluzy ostatni zdeszyfrowany blok, czytaj ostatni blok poprzedniej linijki.

0

hmm, to musiałbym faktycznie coś się podszkolić z tego szyfrowania,

a może podpowiesz mi jakiś inny, prosty sposób ... chce uzyskać taki efekt:

muszę zapisywać pewną historię zdarzeń ale w taki sposób, żeby "operator" nie mógł w jakiś łatwy sposób tej historii usunąć (nie zakładam tutaj usunięcia pliku) / zafałszować....

0

Efekt dzialania RMCrypto.CreateEncryptor(key, key) wrzuc do skladowej klasy, tak zeby inicjalizowany byl tylko raz. Wtedy uzyskasz takie szyfrowanie jak chcesz.

1 użytkowników online, w tym zalogowanych: 0, gości: 1