使用aes加密流解密失败

本文关键字:解密 失败 密流 加密 aes 使用 | 更新日期: 2023-09-27 18:07:37

我正在编写两个应用程序,一个加密文件,另一个必须读取。当第一个程序中的加密和解密工作时,第二个程序无法解密文件。

这是加密数据的代码:

using (Aes aes = getAes())
{
    ICryptoTransform aesEncrypt = aes.CreateEncryptor();
    doCrypt(filePath, aesEncrypt);
}
与doCrypt:

private void doCrypt(string filePath, ICryptoTransform aesCrypto)
{
    doCrypt(filePath, filePath, aesCrypto);
}
private void doCrypt(string sourceFilePath, string targetFilePath, ICryptoTransform aesCrypto)
{
    byte[] input = File.ReadAllBytes(sourceFilePath);
    FileStream cryptoFS = new FileStream(targetFilePath, FileMode.Create);
    CryptoStream cryptoStream = new CryptoStream(cryptoFS, aesCrypto, CryptoStreamMode.Write);
    cryptoStream.Write(input, 0, input.Length);
    cryptoStream.Close();
    cryptoFS.Close();
}

和木屐:

public Aes getAes()
{
    Aes aes = AesCryptoServiceProvider.Create();
    MD5 keyHasher = MD5.Create();
    aes.Mode = CipherMode.ECB;
    aes.KeySize = 128;
    aes.BlockSize = 128;
    aes.Padding = PaddingMode.Zeros;
    aes.Key = keyHasher.ComputeHash(System.Text.Encoding.ASCII.GetBytes(pswdTB.Text));
    return aes;
}

注意: IV没有设置,因为aes运行在不使用IV

的ecb模式下。

这是第二个应用程序中要解密的代码:

Aes aes = getAes();
//MemoryStream ms = new MemoryStream();
//CryptoStream cs = new CryptoStream(ms, aes.CreateDecryptor(), CryptoStreamMode.Write);
//cs.Write(data, 0, data.Length);
//cs.Close();
//result = ms.ToArray();
//ms.Close();
FileStream cryptoFS = new FileStream("test.txt", FileMode.Create);
CryptoStream cryptoStream = new CryptoStream(cryptoFS, aes.CreateDecryptor(), CryptoStreamMode.Write);
cryptoStream.Write(data, 0, data.Length);
cryptoStream.Close();
cryptoFS.Close();
aes.Dispose();

我需要结果在byte[] result中,但出于调试目的,我将其替换为文件输出。

编辑虽然我得到输出,它没有正确解密。这是一个简短的和平测试的结果。txt: "ꕾ㩈ႂ꼥聓綨炌磌꼥聓綨炌磌ꀽ壃"该文件在加解密之前是一个XML文件。

这里的getAes是一个副本,唯一的区别是,键是由另一个方法提供的。但我查过两把钥匙都是一样的。

使用aes加密流解密失败

在。net中,CryptoStream有两种"模式"

要加密,您可以这样构建:

CryptoStream cryptoStream = new CryptoStream(outputEncryptedStream, aesCrypto, CryptoStreamMode.Write);

来解密,你像这样构建它:

CryptoStream cryptoStream = new CryptoStream(inputEncryptedStream, aesCrypto, CryptoStreamMode.Read);

在这两种情况下,你必须传递加密/将被加密的流作为第一个参数。

可以加密:

input.CopyTo(cryptoStream);
cryptoStream.FlushFinalBlock();

要解密一些东西,你可以

cryptoStream.CopyTo(output);

(你不需要/不能使用FlushFinalBlock来解密)

其中inputoutput为未加密流。