【问题标题】:C# Decrypting a AES256 encrypted fileC#解密AES256加密文件
【发布时间】:2014-08-21 14:09:05
【问题描述】:

我正在尝试解密一个 AES256 编码文件,但我得到一个损坏的文件输出。

我有一个 256 位(64 个字符)十六进制 AES 密钥和一个 128 位(32 个字符)十六进制 IV 密钥,我正在使用以下代码将其转换为字节数组。

public byte[] StringToByteArray(String hex)
{
    int NumberChars = hex.Length / 2;
    byte[] bytes = new byte[NumberChars];

    using (var sr = new StringReader(hex))
    {
        for (int i = 0; i < NumberChars; i++)
            bytes[i] =
              Convert.ToByte(new string(new char[2] { (char)sr.Read(), (char)sr.Read() }), 16);
    }

    return bytes;
}

我用于解密的实际代码如下。

public string DecryptCrypt7(byte[] data, string keyString, string ivString)
{
    byte[] aesHash = StringToByteArray(keyString);
    byte[] ivHash = StringToByteArray(ivString);

    try
    {
        using (var rijndaelManaged = new RijndaelManaged
        {
            Key = aesHash,
            IV = ivHash,
            Mode = CipherMode.CBC,
            Padding = PaddingMode.None,
            BlockSize = 128,
            KeySize = 256
        })
        {
            using (var memoryStream = new MemoryStream(data))
            {
                using (var cryptoStream = new CryptoStream(memoryStream, rijndaelManaged.CreateDecryptor(aesHash, ivHash), CryptoStreamMode.Read))
                {
                    return new StreamReader(cryptoStream).ReadToEnd();
                }
            }
        }
    }
    catch (CryptographicException e)
    {
        Console.WriteLine("A Cryptographic error occurred: {0}", e.Message);
        return null;
    }
}

它确实会解密文件,但它显然已损坏,因为我无法使用 sqlite db 查看器打开它并查看表等。

使用 OpenSSL 通过 CygWin 解密它并使用以下命令正确解密它,我可以使用查看器查看文件中的所有表。

openssl enc -aes-256-cbc -d -nosalt -nopad -bufsize 16384 -in file.crypt7 -K $(cat aes.txt) -iv $(cat iv.txt) > file.db

【问题讨论】:

  • 原始数据是二进制数据还是文本?因为您将其作为纯文本返回...
  • @JonSkeet 我相信它是二进制的。
  • 那你为什么要把它作为一个字符串返回呢?这很可能是问题所在。首先尝试只加密纯文本文件 - 如果您得到相同的纯文本,那么这确实是问题所在,您的方法应该返回 byte[] 。 (考虑在返回memoryStream.ToArray() 之前使用MemoryStreamcryptoStream.CopyTo(memoryStream)。)
  • @JonSkeet 就是这样。非常感谢。这是我第一次玩密码学,我错过了最明显的事情。
  • 好的 - 将添加一个答案。

标签: c# encryption aes


【解决方案1】:

问题是您的原始数据是二进制数据,但您在解密后将其转换为字符串。所以你只需要改变你的方法返回一个byte[],然后把你的解密方法的结尾改成:

using (Stream encrypted = new MemoryStream(data),
       decrypted = new CryptoStream(encrypted, 
           rijndaelManaged.CreateDecryptor(aesHash, ivHash), CryptoStreamMode.Read),
       copy = new MemoryStream())
{
    decrypted.CopyTo(copy);
    return copy.ToArray();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-13
    相关资源
    最近更新 更多