Witam próbuję zaszyfrować i odszyfrować w dowolnie odległym czasie tekst. Czyli prócz zaszyfrowania potrzebuję przechowywać gdzieś klucz i wektor tak??. Wydaje mi się, że napisałem kod poprawnie, aczkolwiek po odszyfrowaniu nie uzyskuje wejściowego tekstu. Nie wiem gdzie tkwi błąd. Help
Oto kod:
using System;
using System.Collections.Generic;
using System.Text;
using System.Security.Cryptography;
using System.IO;
namespace algorytm_rijndaela
{
public sealed class CryptoString
{
private static byte[] klucz()
{
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
return (encoding.GetBytes("kLHVGFFKLHsdkfh9q910udf0usDFA/sv"));
}
private static byte[] wektor()
{
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
return (encoding.GetBytes("asgfreqwe_>:{}>?"));
}
private CryptoString() { }
private static byte[] savedKey = klucz();
private static byte[] savedIV = wektor();
public static byte[] key
{
get { return savedKey; }
set {savedKey = value;}
}
public static byte[] IV
{
get { return savedKey; }
set { savedIV = value; }
}
private static void RdGenerateSecretKey(RijndaelManaged rdProvider)
{
if (savedKey == null)
{
rdProvider.KeySize = 256;
rdProvider.GenerateKey();
savedKey = rdProvider.Key;
}
}
private static void rdGenerateSecredInitVector(RijndaelManaged rdProvider)
{
if (savedIV == null)
{
rdProvider.GenerateIV();
savedIV = rdProvider.IV;
}
}
public static string Encrypt(string originalStr)
{
byte[] originalStrAsByte = Encoding.ASCII.GetBytes(originalStr);
byte[] originalBytes = { };
MemoryStream memStream = new MemoryStream(originalStrAsByte.Length);
RijndaelManaged rijndael = new RijndaelManaged();
RdGenerateSecretKey(rijndael);
rdGenerateSecredInitVector(rijndael);
if (savedKey == null || savedIV == null)
{
throw (new NullReferenceException("Klucz savedKey i wektor inicjujący nie mogą być puste"));
}
System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
Console.Write("klucz : ");
Console.WriteLine(enc.GetString(savedKey) + " " + savedKey.Length.ToString());
Console.Write("wektor : ");
Console.WriteLine(enc.GetString(savedIV) + " " + savedIV.Length.ToString());
Console.ReadKey();
ICryptoTransform rdTransform = rijndael.CreateEncryptor((byte[])savedKey.Clone(), (byte[])savedIV.Clone());
CryptoStream cryptoStream = new CryptoStream(memStream, rdTransform, CryptoStreamMode.Write);
cryptoStream.Write(originalStrAsByte, 0, originalStrAsByte.Length);
cryptoStream.FlushFinalBlock();
originalBytes = memStream.ToArray();
memStream.Close();
cryptoStream.Close();
rdTransform.Dispose();
rijndael.Clear();
string encryptedStr = Convert.ToBase64String(originalBytes);
return (encryptedStr);
}
public static string decrypt(string encryptedStr)
{
byte[] encryptedStrAsBytes = Convert.FromBase64String(encryptedStr);
byte[] initialText = new byte[encryptedStrAsBytes.Length];
RijndaelManaged rijndael = new RijndaelManaged();
MemoryStream memStream = new MemoryStream(encryptedStrAsBytes);
if (savedKey == null || savedIV == null)
{
throw (new NullReferenceException("Klucz savedKey i wektor inicjujący nie mogą być puste"));
}
System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
Console.Write("klucz : ");
Console.WriteLine(enc.GetString(savedKey) + " " + savedKey.Length.ToString());
Console.Write("wektor : ");
Console.WriteLine(enc.GetString(savedIV) + " " + savedIV.Length.ToString());
Console.ReadKey();
ICryptoTransform rdTransform = rijndael.CreateEncryptor((byte[])savedKey.Clone(), (byte[])savedIV.Clone());
CryptoStream cryptoStream = new CryptoStream(memStream, rdTransform, CryptoStreamMode.Read);
cryptoStream.Read(initialText, 0, initialText.Length);
memStream.Close();
cryptoStream.Close();
rdTransform.Dispose();
rijndael.Clear();
string decryptedStr = Encoding.ASCII.GetString(initialText);
return (decryptedStr);
}
}
class Program
{
static void Main(string[] args)
{
string tekst = "afvgsafg23534wt";
string zaszyfruj = CryptoString.Encrypt(tekst);
Console.WriteLine("Hasło: " + tekst + " " + " Zaszyfrowane: " + zaszyfruj);
StreamWriter plik_1 = new StreamWriter("d:\\plik.txt");
plik_1.Write(zaszyfruj);
plik_1.Close();
StreamReader plik_2 = new StreamReader("d:\\plik.txt");
string odszyfruj = plik_2.ReadLine();
plik_2.Close();
Console.WriteLine("Hasło: " + odszyfruj);
Console.Write("Odszyfrowane: " + CryptoString.decrypt(odszyfruj));
Console.ReadKey();
}
}
}
przykład napisany w Visual Studio 2005
heh znalazłem byka o jezu jezu :) nie będe pisał gdzie. Temat można usunąc, wola moderatora u mnie już działa :)