使用SharpAESCrypt加密字符串

我决定在C#中使用SharpAESCrypt AES加密实现。 根据他们的文档( https://www.aescrypt.com/sharp_aes_crypt.html ),您应该能够使用静态方法,提供密码字符串,纯文本输入流和输出流。 我从输出流中获得的数据似乎都是零。

我怀疑我做错了将字符串转换为流并返回。 任何人都可以看到下面代码明显错误的任何内容吗? (它编译并运行,但newByteArray最后填充0)

private void encryptMemStream() { byte[] byteArray = Encoding.UTF8.GetBytes(DecryptedTB.Text); using (MemoryStream plainText = new MemoryStream(byteArray)) { using (MemoryStream encryptedData = new MemoryStream()) { //plainText.Write(byteArray, 0, byteArray.Length); SharpAESCrypt.Encrypt(PasswordTB.Text, plainText, encryptedData); encryptedData.Position = 0; byte[] newByteArray = new byte[encryptedData.Length]; newByteArray = encryptedData.ToArray(); EncryptedTB.Text = Encoding.UTF8.GetString(newByteArray); } } } 

编辑:此代码的本机实现使用fileStreams,但它也应该与MemoryStreams一起使用。 我将测试文件流并在此处添加我的结果。

更多编辑:

因此,当您使用文件流时,您可以调用此代码

  //Code from the AES Crypt Library public static void Encrypt(string password, string inputfile, string outputfile) { using (FileStream infs = File.OpenRead(inputfile)) using (FileStream outfs = File.Create(outputfile)) Encrypt(password, infs, outfs); } 

哪个调用我直接调用的函数

  //Code from the AES Crypt Library public static void Encrypt(string password, Stream input, Stream output) { int a; byte[] buffer = new byte[1024 * 4]; SharpAESCrypt c = new SharpAESCrypt(password, output, OperationMode.Encrypt); while ((a = input.Read(buffer, 0, buffer.Length)) != 0) c.Write(buffer, 0, a); c.FlushFinalBlock(); } 

使用MemoryStream和FileStream显然有一些细微的区别,我不明白。 FileStream工作正常,而MemoryStream返回一个空白数组…

快速的代码审查揭示了一些事情,包括从讨论中看起来似乎是您面临的主要问题。 有问题的一行是

 EncryptedTB.Text = Encoding.UTF8.GetString(newByteArray); 

这一行是在newByteArray中获取二进制数据,并告诉你的代码它是一个有效的UTF8字节数组。 有可能它几乎肯定不会是有效的UTF8。 它的一部分可能是(例如标题),但实际加密的数据不会,因此您不应该使用此方法来获取字符串。

如果您需要一个可打印的字符串放入某种文本框中,那么对二进制数据执行此操作的正确方法是通过base64编码。

 EncryptedTB.Text = Convert.ToBase64String(newByteArray); 

Base64编码有效地采用三个字节(24位)的组,并将它们转换为四个字符的组。

我在这里的另一个注意事项是,在这两行中:

 byte[] newByteArray = new byte[encryptedData.Length]; newByteArray = encryptedData.ToArray(); 

声明一个字节数组并为其分配一个新数组。 然后,您立即放弃这个,以支持encryptedData.ToArray()中的数组。 这不会将数据放入由new byte[encryptedData.Length]分配的数组中,而是创建一个新数组并将其放入newByteArray变量中。 更好的是做到:

 byte[] newByteArray = encryptedData.ToArray(); 

完整的工作代码如下:

 byte[] byteArray = Encoding.UTF8.GetBytes(sourceText); Byte[] newByteArray; using (MemoryStream plainText = new MemoryStream(byteArray)) { using (MemoryStream encryptedData = new MemoryStream()) { SharpAESCrypt.Encrypt(password, plainText, encryptedData); newByteArray = encryptedData.ToArray(); } } EncryptedTB.Text = Convert.ToBase64String(newByteArray);