- Регистрация
- 08.11.2015
- Сообщения
- 1 787
- Благодарностей
- 2 453
- Баллы
- 113
Отправлял содержимое файла, в котором ничего нет только строка со значением
В фиддлере отловил такие данные (скриншот):
Как видим - данных всего 21 байт.
Для удобства, скопировал себе их в массив:
В другом запросе нашел хеш:
Если пропустить байты через Decompress - получаю число строку со значением
В результате, стало понятно что хеш - это SHA256.
И уже с этого сделано вывод, что считывается файл, сжимается и с содержимого получается хеш.
Отлично!
Но, проблема в том, что когда я беру, полученную разжатую строку обратно сжимаю, и пытаюсь получить хеш - у меня получается другое значение.
Видимо я что-то упускаю, но никак не могу понять, почему при сжатии строки со значением
Что я делаю не так?
1
В фиддлере отловил такие данные (скриншот):
Как видим - данных всего 21 байт.
Для удобства, скопировал себе их в массив:
C#:
byte[] arrOutput1 = {
0x1F, 0x8B, 0x08, 0x00, 0x00, 0x00, 0x00,
0x00, 0x02, 0x0A, 0x33, 0x04, 0x00, 0xB7,
0xEF, 0xDC, 0x83, 0x01, 0x00, 0x00, 0x00
};
697d5abc7fded2dbb8ffc4f84c4441274ab23c9e718278a9ebb4b741ba14e69c
Если пропустить байты через Decompress - получаю число строку со значением
1
- как и должно быть.В результате, стало понятно что хеш - это SHA256.
И уже с этого сделано вывод, что считывается файл, сжимается и с содержимого получается хеш.
Отлично!
Но, проблема в том, что когда я беру, полученную разжатую строку обратно сжимаю, и пытаюсь получить хеш - у меня получается другое значение.
Видимо я что-то упускаю, но никак не могу понять, почему при сжатии строки со значением
1
я никак не могу получить такой же SHA256 хеш.Что я делаю не так?
Пример реализации:
string h = "697d5abc7fded2dbb8ffc4f84c4441274ab23c9e718278a9ebb4b741ba14e69c"; // искомое значение
// Беру байты
byte[] bytes_in = { // Так должно быть
0x1F, 0x8B, 0x08, 0x00, 0x00, 0x00, 0x00,
0x00, 0x02, 0x0A, 0x33, 0x04, 0x00, 0xB7,
0xEF, 0xDC, 0x83, 0x01, 0x00, 0x00, 0x00
};
project.SendInfoToLog(bytes_in.Length.ToString() + " 21 байт");
// Разжимаю
byte[] result_line = new byte[bytes_in.Length];
using (var ss = new MemoryStream(bytes_in)) {
using (var dss = new System.IO.Compression.GZipStream(ss, System.IO.Compression.CompressionMode.Decompress)) {
dss.Read(result_line, 0, result_line.Length);
}
}
// Смотрю строку в логе
string line_out = System.Text.Encoding.UTF8.GetString(result_line);
project.SendInfoToLog("Сжатая строка: "+line_out);
project.Variables["Variable1"].Value = line_out;
// Перевожу полученную строку в байты
byte[] bytes_out = Encoding.UTF8.GetBytes(line_out);
MemoryStream output = new MemoryStream();
using (var dstream = new System.IO.Compression.GZipStream(output, System.IO.Compression.CompressionMode.Compress)){
dstream.Write(bytes_out, 0, bytes_out.Length);
}
bytes_out = output.ToArray(); // здесь байты после сжатия
project.SendInfoToLog(bytes_out.Length.ToString() + " почему-то 23 байта");
// Извлекаю Хеши с оригинала и созданного значения
string hash_in;
string hash_out;
using (var sha256 = System.Security.Cryptography.SHA256.Create()){
hash_in = BitConverter.ToString(sha256.ComputeHash(bytes_in)).ToLower().Replace("-", ""); // Оригинал
hash_out = BitConverter.ToString(sha256.ComputeHash(bytes_out)).ToLower().Replace("-", ""); // После преобразования
}
if(hash_in == h ) project.SendInfoToLog("arrOutput1 + hash1 Совпадает - на него ровняемся: "+hash_in);
else project.SendWarningToLog("хеш плохой:" +hash_in);
if(hash_out == h ) project.SendInfoToLog("хеш хороший - это и ищу:" + hash_out);
else project.SendWarningToLog("хеш плохой: "+hash_out);