我尝试解密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 viewer打开它并查看表格等。
使用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
答案 0 :(得分: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();
}