使用 aes 的 CryptoStream 解密失败
Decryption with CryptoStream using aes fails
我正在编写两个应用程序,一个加密文件,另一个必须读取。虽然第一个程序中的加密和解密有效,但第二个程序无法解密文件。
这是加密数据的代码:
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();
}
和getAes:
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 在 ECB 模式下运行,不使用 IV
这是在第二个应用程序中解密的代码:
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[] 结果中,但出于调试目的,我将其替换为文件输出。
编辑 虽然我得到了输出,但没有正确解密。
这是短暂和平的结果test.txt:“ꕾ㩈ႂ⤙͊꼥灓綨炒锅腼ꀽ鞍壃”
该文件在加密和解密之前是一个 XML 文件。
这里的getAes是一个副本,唯一的区别是,密钥是由另一种方法提供的。但我检查过使用的键是否相同。
在 .NET 中 CryptoStream
有两个 "modes".
要加密,您可以像这样构建它:
CryptoStream cryptoStream = new CryptoStream(outputEncryptedStream, aesCrypto, CryptoStreamMode.Write);
解密你构建它:
CryptoStream cryptoStream = new CryptoStream(inputEncryptedStream, aesCrypto, CryptoStreamMode.Read);
在这两种情况下,您都必须将 encrypted/would 加密流作为第一个参数传递。
要加密您可以:
input.CopyTo(cryptoStream);
cryptoStream.FlushFinalBlock();
你可以解密一些东西
cryptoStream.CopyTo(output);
(你不用need/can不用FlushFinalBlock
解密)
其中 input
和 output
是未加密的流。
我正在编写两个应用程序,一个加密文件,另一个必须读取。虽然第一个程序中的加密和解密有效,但第二个程序无法解密文件。
这是加密数据的代码:
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();
}
和getAes:
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 在 ECB 模式下运行,不使用 IV
这是在第二个应用程序中解密的代码:
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[] 结果中,但出于调试目的,我将其替换为文件输出。
编辑 虽然我得到了输出,但没有正确解密。 这是短暂和平的结果test.txt:“ꕾ㩈ႂ⤙͊꼥灓綨炒锅腼ꀽ鞍壃” 该文件在加密和解密之前是一个 XML 文件。
这里的getAes是一个副本,唯一的区别是,密钥是由另一种方法提供的。但我检查过使用的键是否相同。
在 .NET 中 CryptoStream
有两个 "modes".
要加密,您可以像这样构建它:
CryptoStream cryptoStream = new CryptoStream(outputEncryptedStream, aesCrypto, CryptoStreamMode.Write);
解密你构建它:
CryptoStream cryptoStream = new CryptoStream(inputEncryptedStream, aesCrypto, CryptoStreamMode.Read);
在这两种情况下,您都必须将 encrypted/would 加密流作为第一个参数传递。
要加密您可以:
input.CopyTo(cryptoStream);
cryptoStream.FlushFinalBlock();
你可以解密一些东西
cryptoStream.CopyTo(output);
(你不用need/can不用FlushFinalBlock
解密)
其中 input
和 output
是未加密的流。