【发布时间】: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()之前使用MemoryStream和cryptoStream.CopyTo(memoryStream)。) -
@JonSkeet 就是这样。非常感谢。这是我第一次玩密码学,我错过了最明显的事情。
-
好的 - 将添加一个答案。
标签: c# encryption aes