使用 SharpAESCrypt 加密字符串
Using SharpAESCrypt to encrypt strings
我决定在 C# 中使用 AES 加密的 SharpAESCrypt 实现。根据他们的文档 (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 returns 是一个空白数组...
快速代码审查揭示了一些事情,包括从讨论中看似乎是您面临的主要问题。有问题的行是
EncryptedTB.Text = Encoding.UTF8.GetString(newByteArray);
此行获取 newByteArray 中的二进制数据并告诉您的代码它是一个有效的 UTF8 字节数组。很有可能它几乎肯定不是有效的 UTF8。它的一部分可能是(例如 header),但实际加密的数据不会是,因此您不应该使用此方法来获取字符串。
如果您需要将可打印的字符串放入某种文本框中,那么对二进制数据执行此操作的正确方法是通过 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);
我决定在 C# 中使用 AES 加密的 SharpAESCrypt 实现。根据他们的文档 (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 returns 是一个空白数组...
快速代码审查揭示了一些事情,包括从讨论中看似乎是您面临的主要问题。有问题的行是
EncryptedTB.Text = Encoding.UTF8.GetString(newByteArray);
此行获取 newByteArray 中的二进制数据并告诉您的代码它是一个有效的 UTF8 字节数组。很有可能它几乎肯定不是有效的 UTF8。它的一部分可能是(例如 header),但实际加密的数据不会是,因此您不应该使用此方法来获取字符串。
如果您需要将可打印的字符串放入某种文本框中,那么对二进制数据执行此操作的正确方法是通过 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);