使用SharpAESCrypt加密字符串

本文关键字:字符串 加密 SharpAESCrypt 使用 | 更新日期: 2023-09-27 18:02:40

我决定在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返回一个空白数组…

使用SharpAESCrypt加密字符串

快速查看代码可以发现一些事情,包括从讨论中可以看出您所面临的主要问题。有问题的行是

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);