简体   繁体   English

C#解密AES256加密文件

[英]C# Decrypting a AES256 encrypted file

I'm trying to decrypt a AES256 coded file but I'm getting a corrupted file output. 我正在尝试解密AES256编码文件,但文件输出已损坏。

I have a 256bit (64 chars) hex AES key and a 128bit (32 chars) hex IV key that I'm converting to byte arrays with the following code. 我有一个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;
}

The actual code I'm using for decryption is as follows. 我用于解密的实际代码如下。

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;
    }
}

It does decrypt the file, but it's clearly corrupted as I can't open it with an sqlite db viewer and see the tables, etc. 它确实解密了文件,但由于我无法使用sqlite db查看器打开它并查看表等,因此它显然已损坏。

Decrypting it via CygWin using OpenSSL with the following command decrypts it properly and I can view all the tables in the file using a viewer. 通过CygWin使用OpenSSL通过以下命令对它进行解密,可以正确解密它,并且我可以使用查看器查看文件中的所有表。

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

The problem is that your original data is binary data, but you're converting it to a string after you've decrypted it. 问题在于您的原始数据是二进制数据,但是在解密之后,您正在将其转换为字符串。 So you just need to change your method to return a byte[] , then change the end of your decryption method to: 因此,您只需要更改方法以返回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();
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM