Ok, also habe ich ein kleines Programm, das ich in C# winforms eingebaut habe, das im Grunde Sicherheitskryptologie verwendet und ich versuche herauszufinden, was ich falsch im Code getan habe. Es wird die Textdatei gut verschlüsseln. Wenn ich die verschlüsselte Datei jedoch in das Textfeld einfüge und Decrypt drücke, wird die Datei nicht entschlüsselt, sondern erneut verschlüsselt.Verschlüsselung und Entschlüsselung einer Textdatei
Ich frage mich, ob ich etwas falsch mit dem Code gemacht habe.
namespace Encrypted
{
class Encryptor
{
public static string IV = "1a1a1a1a1a1a1a1a";
public static string Key = "1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a";
public static string Encrypt (string decrypted)
{
byte[] textbytes = ASCIIEncoding.ASCII.GetBytes(decrypted);
AesCryptoServiceProvider endec = new AesCryptoServiceProvider();
endec.BlockSize = 128;
endec.KeySize = 256;
endec.IV = ASCIIEncoding.ASCII.GetBytes(IV);
endec.Key = ASCIIEncoding.ASCII.GetBytes(Key);
endec.Padding = PaddingMode.PKCS7;
endec.Mode = CipherMode.CBC;
ICryptoTransform icrypt = endec.CreateEncryptor(endec.Key, endec.IV);
byte[] enc = icrypt.TransformFinalBlock(textbytes, 0, textbytes.Length);
icrypt.Dispose();
return Convert.ToBase64String(enc);
}
public static string Decrypted(string encrypted)
{
byte[] textbytes = ASCIIEncoding.ASCII.GetBytes(encrypted);
AesCryptoServiceProvider endec = new AesCryptoServiceProvider();
endec.BlockSize = 128;
endec.KeySize = 256;
endec.IV = ASCIIEncoding.ASCII.GetBytes(IV);
endec.Key = ASCIIEncoding.ASCII.GetBytes(Key);
endec.Padding = PaddingMode.PKCS7;
endec.Mode = CipherMode.CBC;
ICryptoTransform icrypt = endec.CreateEncryptor(endec.Key, endec.IV);
byte[] enc = icrypt.TransformFinalBlock(textbytes, 0, textbytes.Length);
icrypt.Dispose();
return ASCIIEncoding.ASCII.GetString(enc);
}
}
}
Dies ist die Klasse oben und unten ist die Form1:
namespace Encrypted
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnEncrypt_Click(object sender, EventArgs e)
{
string dir = textBox1.Text;
Directory.CreateDirectory("data\\" + dir);
var sw = new StreamWriter("data\\" + dir + "data.ls");
string enctxt = Encryptor.Encrypt(textBox1.Text);
sw.WriteLine(enctxt);
sw.Close();
}
private void btnDecrypt_Click(object sender, EventArgs e)
{
string dir = textBox2.Text;
Directory.CreateDirectory("data\\" + dir);
var sw = new StreamWriter("data\\" + dir + "data.ls");
string enctxt = Encryptor.Decrypted(textBox2.Text);
sw.WriteLine(enctxt);
sw.Close();
}
}
In der Decrypt-Taste muss ich Stream oder Stream verwenden. Sobald die verschlüsselte Datei in der Datei data.ls ist, kopiere ich sie und füge sie zum Entschlüsseln in das Textfeld ein. Es wird jedoch nicht entschlüsselt, es verschlüsselt die Datei nur erneut. Gibt es etwas, was ich falsch mache?
Also sollte die 'Decrypted' Methode' CreateDecryptor' aufrufen (nicht 'CreateEncryptor'), richtig? –
Nun, wenn ich den CreateDecryptor aufrufen, wird ein Fehler ausgegeben, der besagt, dass der Block kein vollständiger Block ist. – campnerd
Das nächste offensichtlichste Problem ist, dass Sie nicht die gleiche Codierung für die verschlüsselte Zeichenfolge verwenden. Sie geben eine Basis-64-Zeichenfolge von encrypt zurück, aber Sie verwenden ASCII, wenn Sie in "Decrypted" codieren. Sie sollten mit 'Convert.FromBase64String' codieren, um' textbytes' zu erhalten. –