Вверх ↑
Этот топик читают: Гость
Ответов: 17
Рейтинг: 0
#1: 2017-01-26 04:56:46 ЛС | профиль | цитата
При компиляции схемы, компонент hashsum (SHA512 или SHA384) выдаёт в одном компиляторе (FPC) один результат, а в другом (Delphi) другой.

Слово password

Компилятор Delphi SHI512=fa29ad8635ce15a564a5975f7ba94492ce185476ff0e0cd0f06de20f0f279623713778a433d066489710cdbb7c530024c8d5e013f710849869cc6589fedb785c
Компилятор FPC SHI512=b109f3bbbc244eb82441917ed06d618b9008dd09b3befd1b5e07394c706a8bb980b1d7785e5976ec049b46df5f1326af5a2ea6d103fd07c95385ffab0cacbc86

В Ваших интернетах, On-Line компиляторы выдуют результат как FPC



Add(MainForm,2953706,21,105)
{
Width=881
Height=110
Caption="Delphi"
Position=1
}
Add(Edit,12980779,161,119)
{
Left=5
Top=10
Width=130
Text="password"
}
Add(Button,517459,112,175)
{
Left=145
Top=10
Caption="SHA512"
link(onClick,9663469:doHashsum,[])
}
Add(Hashsum,9663469,161,175)
{
HashType=4
link(onResult,590874:doText,[])
link(Data,12980779:Text,[])
}
Add(Label,590874,231,175)
{
Left=5
Top=35
Width=545
}
карма: 0

0
vip
#1.1контекстная реклама от партнеров
Ответов: 8886
Рейтинг: 823
#2: 2017-01-26 10:37:14 ЛС | профиль | цитата
rav, Win7, 64
hashsum.jpg
карма: 19

0
Ответов: 233
Рейтинг: 12
#3: 2017-01-26 10:48:21 ЛС | профиль | цитата
Проверил у себя - тоже разный результат.

Леонид, а зачем ты показываешь результат MD5?
карма: 2

0
Ответов: 8886
Рейтинг: 823
#4: 2017-01-26 12:40:57 ЛС | профиль | цитата
Iliya, ничего не меняя запустил схему ТС на разных компиляторах, результат на картинке
карма: 19

0
Ответов: 4612
Рейтинг: 746
#5: 2017-01-26 12:58:22 ЛС | профиль | цитата
Подтверждаю: результат разный и под Delphi - неверный. У Леонида либо не та схема, либо сбился тип хеша. SHA384 тоже отличаются.

Редактировалось 1 раз(а), последний 2017-01-26 13:01:58
карма: 26

0
Ответов: 2059
Рейтинг: 131
#6: 2017-01-26 14:18:40 ЛС | профиль | цитата
Подтверждаю: результат разный и под Delphi - неверный.

И у меня FPC и Delphi7 правильный результат, а Delphi(4) штатный - не верный.
карма: 6

0
Ответов: 4612
Рейтинг: 746
#7: 2017-01-26 14:30:13 ЛС | профиль | цитата
Только что хотел сказать, чтобы проверили на Delphi 7. Какая-то лажа у Delphi 4 получается при операциях с Int64.
В файле SHA.pas в функции sha512_compress() вот в этом фрагменте получается неверный результат функции Gamma0(W [i - 15]):
for i := 16 to 79 do
    W[i] := Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W [i - 15]) + W[i - 16];

Редактировалось 1 раз(а), последний 2017-01-26 14:30:23
карма: 26

0
Ответов: 2059
Рейтинг: 131
#8: 2017-01-26 14:37:31 ЛС | профиль | цитата
Netspirit, Спасибо, что подсказал.
Какая-то лажа у Delphi 4 получается при операциях с Int64.

У меня в одной программе с Int64 лажа шла, никак не мог найти причину.
Сейчас попробовал на Delphi 7 - всё нормально.
var
dwTotalLow, dwTotalHigh: DWORD;
cbTotal, cbReaded: Int64;

dwTotalLow := GetFileSize(hInputFile, @dwTotalHigh);
cbTotal := dwTotalLow or (Int64(dwTotalHigh) shl 32);

Редактировалось 2 раз(а), последний 2017-01-26 14:57:46
карма: 6

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#9: 2017-01-26 14:59:47 ЛС | профиль | цитата
Netspirit писал(а):
вот в этом фрагменте получается неверный результат

Есть какие-либо предложения по решению данной проблемы?
карма: 22

0
Ответов: 2059
Рейтинг: 131
#10: 2017-01-26 15:06:09 ЛС | профиль | цитата
Главное, что результат стабильный, а какие там циферки не столь важно для данного компонента.
Проблема вылезает, когда результат работы будет использоваться в других приложениях, сделанных на других компиляторах.
карма: 6

0
Ответов: 4612
Рейтинг: 746
#11: 2017-01-26 15:23:00 ЛС | профиль | цитата
nesco писал(а):
Есть какие-либо предложения по решению данной проблемы?
Я не специалист в ассемблере, но покопавшись, выяснил, что в названных функциях в последней операции (x shr 6)/(x shr 7) Delphi использует инструкцию SAR. Если вместо неё вручную поставить SHR, то результат получается правильный.
SHR Int64 Debug

Из описания инструкции SAR понятно, что она сохраняет знак числа (последний бит) после сдвига, тогда как SHR - нет. Не нашел в Delphi 4 беззнакового UInt64. Может на беззнаковом типе он не будет применять SAR?

Кто разбирается в ассемблере, нужно просмотреть функции Gamma0 и Gamma1 и попробовать либо заставить Delphi сгенерировать код с использованием в этих местах SHR, либо самому вставить ассемблерный фрагмент, выполняющий что нужно.

--- Добавлено в 2017-01-26 15:52:08

Вот так вроде работает:

{$ifdef VER120}
function shr64(const a: Int64; b: Byte): Int64;
begin
Result := a shr b;
end;
{$endif}

function Gamma0(x: Int64): Int64;
begin
Result := (ror64(x, 1) xor ror64(x, 8) xor {$ifdef VER120}shr64(x, 7){$else}(x shr 7){$endif});
end;

function Gamma1(x: Int64): Int64;
begin
Result := (ror64(x, 19) xor ror64(x, 61) xor {$ifdef VER120}shr64(x, 6){$else}(x shr 6){$endif});
end;
В чем прикол - я так и не понял. Может, можно что-то получше придумать.

Редактировалось 9 раз(а), последний 2017-01-26 16:46:05
карма: 26

1
Голосовали:Galkov
Ответов: 2059
Рейтинг: 131
#12: 2017-01-26 17:58:39 ЛС | профиль | цитата
В чем прикол - я так и не понял

Только алхимики движут науку!
function Sigma0(x: Int64): Int64;
begin
Result := (ror64(x, 28) xor ror64(x, 34) xor ror64(x, 39));
end;

function Sigma1(x: Int64): Int64;
begin
Result := (ror64(x, 14) xor ror64(x, 18) xor ror64(x, 41));
end;

function Gamma0(x: Int64): Int64;
begin
Result := (ror64(x, 1) xor ror64(x, 8) xor (x shr 7));
end;

function Gamma1(x: Int64): Int64;
begin
Result := (ror64(x, 19) xor ror64(x, 61) xor (x shr 6));
end;

Тогда уже и Sigma0 и Sigma1
Честно говоря, я начал в ассемблере делать... Но заплатки делать это не верно.
Может быть на 7 перейти? (Побочных явлений не наблюдал)
Самое главное - все довольны будут!

Редактировалось 2 раз(а), последний 2017-01-26 18:19:48
карма: 6

0
Ответов: 4612
Рейтинг: 746
#13: 2017-01-26 18:32:44 ЛС | профиль | цитата
flint2 писал(а):
Тогда уже и Sigma0 и Sigma1
Зачем? Проблема только в реализации дельфийского оператора shr для Int64, причем, как можно заметить по представленному решению, у него на этот случай есть две разные реализации. Но от чего зависит какую он выберет - я не в курсе (для вынесенной в отдельную функцию shr он генерирует совершенно другой ассемблер).
карма: 26

0
Ответов: 2059
Рейтинг: 131
#14: 2017-01-26 19:41:11 ЛС | профиль | цитата
Netspirit, а может быть в ассемблере...
Нет!
в отдельную функцию shr он генерирует совершенно другой ассемблер

Дурацкое предложение:
Перейти на 7 и взять за эталон.
Чего то у меня не пошло с 1-2 компонентами, чего-то изменил и всё нормально.
Может я ошибаюсь, есть какие-то подводные камни?
И ассемблер нормальный и ...
Астапа несло:
... но что делать с KOL...
Это уже я вперёд забежал.
Как чудесно я себе положил
CLASSES
CONSTS
SYSCONST
SYSUTILS
TYPINFO
и забот нет, кроме как на форуме не заработает.
http://forum.hiasm.com/getfile/38002
P.S.
Для контроллеров есть другие языки и инструменты, чтоб код был маленьким.
А KOL пусть как балласт болтается, много места не занимает.
Допустим, кому приспичело, может нормальные списки, деревья и много чего не сподвертом делать.

Редактировалось 4 раз(а), последний 2017-01-26 20:14:57
карма: 6

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#15: 2017-01-27 11:49:27 ЛС | профиль | цитата
Пофиксил юнит SHA.pas
карма: 22

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)