首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用aes进行CryptoStream解密失败

使用aes进行CryptoStream解密失败
EN

Stack Overflow用户
提问于 2015-08-13 11:22:49
回答 1查看 1.8K关注 0票数 0

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

这是加密数据的代码:

代码语言:javascript
复制
using (Aes aes = getAes())
{
    ICryptoTransform aesEncrypt = aes.CreateEncryptor();
    doCrypt(filePath, aesEncrypt);
}

使用doCrypt:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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,因为运行在欧洲央行模式下,它不使用IV。

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

代码语言:javascript
复制
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的一个短暂的平静:"ꕾ㩈ႂ⤙͊꼥聓綨炌磌腼ꀽ鞍壃“文件在en-和decrypton之前是一个XML文件。

这里的getAes是一个副本,唯一的区别是,密钥是由另一个方法提供的。但我检查了所用的钥匙是相等的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-13 14:08:30

在.NET中,CryptoStream有两种“模式”。

若要加密,请将其构建为:

代码语言:javascript
复制
CryptoStream cryptoStream = new CryptoStream(outputEncryptedStream, aesCrypto, CryptoStreamMode.Write);

要解密它,请如下所示:

代码语言:javascript
复制
CryptoStream cryptoStream = new CryptoStream(inputEncryptedStream, aesCrypto, CryptoStreamMode.Read);

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

要加密可以加密的内容:

代码语言:javascript
复制
input.CopyTo(cryptoStream);
cryptoStream.FlushFinalBlock();

解密你能破解的东西

代码语言:javascript
复制
cryptoStream.CopyTo(output);

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

其中inputoutput是非加密流。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31986803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档