Сейчас на форуме: ManHunter, rmn, _MBK_, tyns777, UniSoft (+10 невидимых)

 eXeL@B —› Программирование —› Вопрос знатокам С++
Посл.ответ Сообщение


Ранг: 247.7 (наставник), 3thx
Активность: 0.160
Статус: Участник
Халявщик

Создано: 12 марта 2012 00:25 · Поправил: depler
· Личное сообщение · #1

есть функция на С++, начинается так:

Code:
  1. void bsha1_hash(const char* input, size_t length, char* result) {
  2.          int i;
  3.          unsigned int a, b, c, d, e, g;
  4.          char data[1024];
  5.          memset(data, 0, 1024);
  6.          memcpy(data, input, length);
  7.          unsigned int* ldata = (unsigned int*) data;
  8.  
  9.  
  10.  
  11.          for (= 0; i < 64; i++) {
  12.                  ldata[+ 16] = LSB4(ROL(1, LSB4(ldata[i] ^ ldata[i+8] ^ ldata[i+2] ^ ldata[i+13]) % 32));
  13.          }


Задача - переписать на delphi, застопорился на месте

unsigned int* ldata = (unsigned int*) data;

и соответсвенно заполнении его. Насколько я понимаю С++ ldata - это указатель на массив data, но не пойму тогда, почему к нему обращаются как к обычному массиву, и заполняет он data както странно. Вот например data[16] какому элементу data соответствует?

-----
Лень - это подсознательная мудрость




Ранг: 590.6 (!), 408thx
Активность: 0.360.18
Статус: Модератор

Создано: 12 марта 2012 00:43
· Личное сообщение · #2

указатель и массив - это по сути одно и то же. И то и то указывает на область памяти. индексация массива - это смещение в элементах от начала буфера. Соответствено, &ldata[16] == &data[16 * sizeof(int)]

-----
старый пень




Ранг: 222.2 (наставник), 115thx
Активность: 0.140.01
Статус: Участник

Создано: 12 марта 2012 00:44 · Поправил: HandMill
· Личное сообщение · #3

depler пишет:
Вот например data[16] какому элементу data соответствует?


попытаюсь исправить для начала вопрос:
Вот например ldata[16] какому элементу data соответствует?
ответ:
соответствует 16 * sizeof(int) элементу массива data (умножаем на sizeof(int) ибо приведение типов).

При переводе с си на делфи, стоит напомнить что в си нумерация элементов массивов в отличае от делфи начинается с 0.

При объявлении массива:
char data[1024];
помните что data является указателем на массив. И так будет в любом языке программирования.

Выражение
(unsigned int*) data;
ничто иное как банальное приведение типов.

-----
все багрепорты - в личные сообщения





Ранг: 247.7 (наставник), 3thx
Активность: 0.160
Статус: Участник
Халявщик

Создано: 12 марта 2012 01:02 · Поправил: depler
· Личное сообщение · #4

r_e, HandMill в теории оно конечно так, но вот наваял на делфи:

Code:
  1. function bsha1_hash(password: string): string;
  2. type xx=array of DWORD;
  3. var
  4. i: integer;
  5. a, b, c, d, e, g: DWORD;
  6. data: array of DWORD;
  7. ldata: ^xx;
  8. begin
  9. setlength(data, 1024);
  10. //fillchar(ldata, 1024, 0);
  11.  
  12. for I := 1 to length(password) do
  13.   data[i-1]:=ord(password[i]);
  14.  
  15. ldata:=@data;
  16. for i := 0 to 63 do
  17.   data[(+ 16)*sizeof(DWORD)]:=LSB4(ROL(1, LSB4(data[i] xor data[i+8] xor data[i+2] xor data[i+13]) mod 32));


В приниципе должно работать, но delphi заполняет "строго по математике" 64, 68, 72... С++ начинает почему то с 66, затем 70, откуда то 72, и т.д. Выкладываю полный исходник этой штуки. Гляньте, то ли я дурак, то ли лыжи не едут. )) Если можно упростите функцию, чтобы без указателей была.

--> Link <--

-----
Лень - это подсознательная мудрость




Ранг: 590.6 (!), 408thx
Активность: 0.360.18
Статус: Модератор

Создано: 12 марта 2012 01:09
· Личное сообщение · #5

depler
Неинтересно =) Если с++ заполняет как ты пишешь, то приведенный код неверный.
Ищи где накосячил.

-----
старый пень





Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

Создано: 12 марта 2012 03:12
· Личное сообщение · #6

1) при типе data: array of DWORD;
====> C
memcpy(data, input, length);
не идентично
====> Delphi
for i := 1 to length(password) do
data[i-1]:=ord(password[i]);

в первом случае (при рассмотрении побайтно 'p', 'a', 's', 's' ....
во втором 'p',0,0,0,'a',0,0,0,'s',0,0,0,'s',0,0,0 ....

2) ldata не используется

3) при типе data: array of DWORD;
ИМХО вместо data[(i + 16)*sizeof(DWORD)] достаточно data[i+16], как дальше по выражению.

-----
127.0.0.1, sweet 127.0.0.1




Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 12 марта 2012 11:06 · Поправил: VodoleY
· Личное сообщение · #7

depler а не рассматривали ли вы библиотечку для делфи dcpcrypt2-laz-2.0.3-2, там много крипто и хешей под делфю портированно, я ей частенько пользуюсь и sha там есть...
Code:
  1. procedure TDCP_sha1.Compress;
  2. var
  3.   A, B, C, D, E: DWord;
  4.   W: array[0..79] of DWord;
  5.   i: longword;
  6. begin
  7.   Index:= 0;
  8.   Move(HashBuffer,W,Sizeof(HashBuffer));
  9.   for i:= 0 to 15 do
  10.     W[i]:= SwapDWord(W[i]);
  11.   for i:= 16 to 79 do
  12.     W[i]:= ((W[i-3] xor W[i-8] xor W[i-14] xor W[i-16]) shl 1) or ((W[i-3] xor W[i-8] xor W[i-14] xor W[i-16]) shr 31);
  13.   A:= CurrentHash[0]; B:= CurrentHash[1]; C:= CurrentHash[2]; D:= CurrentHash[3]; E:= CurrentHash[4];
  14.  

вот кусок из модуля.. как по мне весьма похоже

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....


| Сообщение посчитали полезным: sendersu, DimitarSerg

Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 12 марта 2012 16:45
· Личное сообщение · #8

иногда проще выучить с++

-----
Реверсивная инженерия - написание кода идентичного натуральному


| Сообщение посчитали полезным: BoRoV


Ранг: 247.7 (наставник), 3thx
Активность: 0.160
Статус: Участник
Халявщик

Создано: 12 марта 2012 17:48
· Личное сообщение · #9

По правде говоря, это почти sha1 называется broken sha1 или xsha1, используется в протоколе battle.net. Что печально - он есть на С++, C#, java, perl, php, НО не на делфи ((
А у мня мозгов не хватает.

-----
Лень - это подсознательная мудрость




Ранг: 309.8 (мудрец), 21thx
Активность: 0.170
Статус: Участник

Создано: 12 марта 2012 18:04
· Личное сообщение · #10

Где тут c++?

-----
Shalom ebanats!


| Сообщение посчитали полезным: Oott

Ранг: 590.6 (!), 408thx
Активность: 0.360.18
Статус: Модератор

Создано: 12 марта 2012 18:07
· Личное сообщение · #11

SLV
Мосье буквоед?

-----
старый пень


| Сообщение посчитали полезным: DimitarSerg


Ранг: 247.7 (наставник), 3thx
Активность: 0.160
Статус: Участник
Халявщик

Создано: 13 марта 2012 02:43
· Личное сообщение · #12

Таки накодил я эту хрень, туды ее в качель )) Если кому интересно:

Code:
  1. function calc_bsha1_hash(password: string): string;
  2.  
  3. function ConvertBytes(x: DWORD): string;
  4. var s: string;
  5. begin
  6. s:=inttohex(x, 8);
  7. result:=
  8.   char(strtoint('$'+s[7]+s[8]))+
  9.   char(strtoint('$'+s[5]+s[6]))+
  10.   char(strtoint('$'+s[3]+s[4]))+
  11.   char(strtoint('$'+s[1]+s[2]));
  12. end;
  13.  
  14. function ROL(x: DWORD; n: cardinal): DWORD;
  15. begin
  16.   Result := (shl n) OR (shr (32-n));
  17. end;
  18.  
  19. function ROR(x: DWORD; n: cardinal): DWORD;
  20. begin
  21.   Result := (shr n) OR (shl (32-n));
  22. end;
  23.  
  24. var
  25. i: integer;
  26. a, b, c, d, e, g: DWORD;
  27. data: array of byte;
  28. ldata: array of DWORD;
  29. s: string;
  30. xc: integer;
  31.  
  32. begin
  33. setlength(data, 1024);
  34. setlength(ldata, 256);
  35.  
  36. for I := 1 to length(password) do
  37.   data[i-1]:=ord(password[i]);
  38.  
  39. for i := 0 to 255 do
  40.   begin
  41.   s:='$'+inttohex(data[i*4+3], 2)+
  42.        inttohex(data[i*4+2], 2)+
  43.        inttohex(data[i*4+1], 2)+
  44.        inttohex(data[i*4], 2);
  45.  
  46.   ldata[i]:=strtoint(s);
  47.   end;
  48.  
  49. for i := 0 to 63 do
  50.   ldata[i+16]:=ROL(1, (ldata[i] xor ldata[i+8] xor ldata[i+2] xor ldata[i+13]) mod 32);
  51.  
  52. a:=$67452301;
  53. b:=$efcdab89;
  54. c:=$98badcfe;
  55. d:=$10325476;
  56. e:=$c3d2e1f0;
  57. g:=0;
  58. xc:=0;
  59.  
  60. for i:=0 to 19 do
  61.   begin
  62.   g:=ldata[xc] + ROL(a, 5) + e + ((and c) or (not b and d)) + $5A827999;
  63.   e:=d;
  64.   d:=c;
  65.   c:=ROL(b, 30);
  66.   b:=a;
  67.   a:=g;
  68.   xc:=xc+1;
  69.   end;
  70.  
  71. for i:=0 to 19 do
  72.   begin
  73.   g:=(xor c xor b) + e + ROL(g, 5) + ldata[xc] + $6ed9eba1;
  74.   e:=d;
  75.   d:=c;
  76.   c:=ROL(b, 30);
  77.   b:=a;
  78.   a:=g;
  79.   xc:=xc+1;
  80.   end;
  81.  
  82. for i:=0 to 19 do
  83.   begin
  84.   g:=ldata[xc] + ROL(g, 5) + e + ((and b) or (and c) or (and b)) - $70E44324;
  85.   e:=d;
  86.   d:=c;
  87.   c:=ROL(b, 30);
  88.   b:=a;
  89.   a:=g;
  90.   xc:=xc+1;
  91.   end;
  92.  
  93.  
  94. for i:=0 to 19 do
  95.   begin
  96.   g:=(xor c xor b) + e + ROL(g, 5) + ldata[xc] - $359d3e2a;
  97.   e:=d;
  98.   d:=c;
  99.   c:=ROL(b, 30);
  100.   b:=a;
  101.   a:=g;
  102.   xc:=xc+1;
  103.   end;
  104.  
  105. a:=a+$67452301;
  106. b:=b+$efcdab89;
  107. c:=b+$98badcfe;
  108. d:=d+$10325476;
  109. e:=e+$c3d2e1f0;
  110.  
  111. result:=
  112.   ConvertBytes(a)+
  113.   ConvertBytes(b)+
  114.   ConvertBytes(c)+
  115.   ConvertBytes(d)+
  116.   ConvertBytes(e);
  117. end;


-----
Лень - это подсознательная мудрость


| Сообщение посчитали полезным: Dart Sergius, igorca

Ранг: 23.4 (новичок)
Активность: 0.010
Статус: Участник

Создано: 09 мая 2012 01:16
· Личное сообщение · #13

Вообще то это не С++, а код школьника.
Признаки:
1) Судя по коду глобальная область видимости функции - то есть по простому: функционал по каким то причинам вынесен за пределы класса. Скорее всего изначально на этапе проектирования допущена ошибка, либо вообще не проектировали и об UML ничего не знали, сразу код писали. Либо это метод класса и код приведён не полностью.
2) Magic Value разбросаны по коду, как мусор по хате:
char data[1024];
memset(data, 0, 1024);
for (i = 0; i < 64; i++);
ldata[i + 16];
и т.д. Так не пишут.
3)
unsigned int* ldata = (unsigned int*) data;
Грубая ошибка: Запрещённое приведение в стиле Си, когда должно выполняться приведение в стиле С++, для этого у языка имеются соответствующие операторы.
4) unsigned int a, b, c, d, e, g;
Бестолковые имена переменных.



Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 09 мая 2012 01:26
· Личное сообщение · #14

Мистер мега кодер. Вы дату постов смотрели? Да и решен уже вопрос топика.

Первое предупреждение.

| Сообщение посчитали полезным: plutos
 eXeL@B —› Программирование —› Вопрос знатокам С++
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати