Функция Hash () в util.h составляет основу большинства крипто Bitcoin в:
Код:
шаблон<имяТипа T1>
встроенный uint256 Хэш (Const Т1 pbegin, Const Т1 ПЭНД)
{
uint256 hash1;
SHA256 ((неподписанные символ *)&pbegin [0], (ПЭНД - pbegin) * SizeOf (pbegin [0]), (неподписанные символ *)&hash1);
uint256 hash2;
SHA256 ((неподписанные символ *)&hash1, SizeOf (hash1) (неподписанные символ *)&hash2);
вернуться hash2;
}
встроенный uint256 Хэш (Const Т1 pbegin, Const Т1 ПЭНД)
{
uint256 hash1;
SHA256 ((неподписанные символ *)&pbegin [0], (ПЭНД - pbegin) * SizeOf (pbegin [0]), (неподписанные символ *)&hash1);
uint256 hash2;
SHA256 ((неподписанные символ *)&hash1, SizeOf (hash1) (неподписанные символ *)&hash2);
вернуться hash2;
}
Как вы можете видеть, это пытается быть более безопасным путем хэширования дважды. Однако, это на самом деле снижает безопасность. Для того, чтобы сломать чистую SHA256, злоумышленник должен найти д 'что SHA256 (d') == SHA256 (d), для известного д. Это также достаточно, чтобы сломать Hash (). Однако злоумышленник может также атаковать внешний слой хэш, находя д»таким образом, что SHA256 (SHA256 (д ')) == SHA256 (SHA256 (г)), даже если SHA256 (д')! = SHA256 (д). Как вы можете видеть, двойное хеширование здесь делает _easier_ сломать хэш!
Лучшим решением было бы что-то вроде:
Код:
шаблон<имяТипа T1>
рядный вектор<неподписанные символ> HashV (Const Т1 pbegin, Const Т1 ПЭНД)
{
uint256 sharesult;
uint160 riperesult;
SHA256 ((неподписанные символ *)&pbegin [0], (ПЭНД - pbegin) * SizeOf (pbegin [0]), (неподписанные символ *)&sharesult);
Ripemd160 ((неподписанные символ *)&pbegin [0], (ПЭНД - pbegin) * SizeOf (pbegin [0]), (неподписанные символ *)&riperesult);
вектор<неподписанные символ> RET;
ret.insert (ret.end () (неподписанные символ *) (&sharesult) (неподписанные символ *) (&sharesult + 1));
ret.insert (ret.end () (неподписанные символ *) (&riperesult) (неподписанные символ *) (&riperesult + 1));
вернуться в отставке;
}
рядный вектор<неподписанные символ> HashV (Const Т1 pbegin, Const Т1 ПЭНД)
{
uint256 sharesult;
uint160 riperesult;
SHA256 ((неподписанные символ *)&pbegin [0], (ПЭНД - pbegin) * SizeOf (pbegin [0]), (неподписанные символ *)&sharesult);
Ripemd160 ((неподписанные символ *)&pbegin [0], (ПЭНД - pbegin) * SizeOf (pbegin [0]), (неподписанные символ *)&riperesult);
вектор<неподписанные символ> RET;
ret.insert (ret.end () (неподписанные символ *) (&sharesult) (неподписанные символ *) (&sharesult + 1));
ret.insert (ret.end () (неподписанные символ *) (&riperesult) (неподписанные символ *) (&riperesult + 1));
вернуться в отставке;
}
Ключ для конкатенации хэши, а не объединить их. Это означает, что злоумышленник должен разорвать оба хэшей - даже в самом худшем случае, это не может быть менее безопасным, чем один хэш.
К сожалению, изменение хэши бы разорвать цепь ...