|
#1
|
|||
|
|||
XTEA2
Здравствуйте!!!
Помогите пожалуйста перевести код с С на Delphi: Код:
#define XTEA2_BLOCKSIZE 16 static unsigned __int32 rol(unsigned __int32 base, unsigned __int32 shift) { unsigned __int32 res; /* only 5 bits of shift are significant*/ shift &= 0x1F; res = (base << shift) | (base >> (32 - shift)); return res; } void xtea2_decipher(unsigned int num_rounds, unsigned __int32 *v, unsigned __int32 const *k) { unsigned int i; unsigned long a, b, c, d, t, delta=0x9E3779B9, sum=delta*num_rounds; d = v[3]; c = v[2] ^ k[3]; b = v[1]; a = v[0] ^ k[2]; for (i = 0; i < num_rounds; i++) { t = d; d = c; c = b; b = a; a = t; c -= ((d << 4) ^ (d >> 5)) + (b ^ sum) + rol(k[(sum >> 11) & 3], d); sum -= delta; a -= ((b << 4) ^ (b >> 5)) + (d ^ sum) + rol(k[sum & 3], b); } v[0] = a; v[1] = b - k[0]; v[2] = c; v[3] = d - k[1]; } void XTEA2Decode(BYTE *Addr, DWORD_PTR Size, BYTE *key, DWORD dwEncMode) { int block_length, key_length, blocks_number; unsigned __int32 *crypto_block_begin; unsigned __int32 *crypto_block_end; block_length = 4; key_length = 16; crypto_block_begin = (unsigned __int32 *)Addr; blocks_number = (int)(Size >> 4); crypto_block_end = (unsigned __int32 *)(Addr + (blocks_number << 4)); while (crypto_block_begin < crypto_block_end) { xtea2_decipher(16, crypto_block_begin, (unsigned __int32 *)key); crypto_block_begin += block_length; } } Вот что у меня получилось: Код:
unit DecryptXTEA2; interface uses HashImpl; const XTEA2_BLOCKSIZE = 16; type TLongWordArray = array [0..3] of LongWord; PLongWordArray = ^TLongWordArray; procedure xtea2_decipher(num_rounds, v, k: PLongWord); procedure XTEA2Decode(Buffer: PByte; Size: Integer; Key: PByte; Mode: TEncMode); function rotl(base:LongWord; shift:LongWord): LongWord; implementation function rotl(base:LongWord; shift:LongWord): LongWord; begin shift := shift and $1F; result := (base shl shift) or (base shr (32-shift)); end; procedure xtea2_decipher(num_rounds, v, k: PLongWord); var i : LongWord; a, b, c, d, t, delta, sum : longword; begin delta := $9E3779B9; sum := delta*LongInt(num_rounds); d := PLongWordArray(v)[3]; c := PLongWordArray(v)[2] xor PLongWordArray(k)[3]; b := PLongWordArray(v)[1]; a := PLongWordArray(v)[0] xor PLongWordArray(k)[2]; for i := 0 to LongWord(num_rounds)-1 do begin t := d; d := c; c := b; b := a; a := t; c := c - ((d shl 4) xor (d shr 5)) + (b xor sum) + rotl(PLongWordArray(k)[(sum shr 11) and 3], d); sum := sum - delta; a := a - ((b shl 4) xor (b shr 5)) + (d xor sum) + rotl(PLongWordArray(k)[sum and 3], b); end; PLongWordArray(v)[0] := a; PLongWordArray(v)[1] := b - PLongWordArray(k)[0]; PLongWordArray(v)[2] := c; PLongWordArray(v)[3] := d - PLongWordArray(k)[1]; end; procedure XTEA2Decode(Buffer: PByte; Size: Integer; Key: PByte; Mode: TEncMode); const ENCMODE_BlockSize = XTEA2_BLOCKSIZE; var block_length, key_length, blocks_number : integer; crypto_block_begin, crypto_block_end : PLongWord; begin block_length := 4; key_length := 16; crypto_block_begin := PLongWord(Buffer); blocks_number := Size shr 4; crypto_block_end := PLongWord(Buffer + (blocks_number shl 4)); while LongWord(crypto_block_begin) < LongWord(crypto_block_end) do begin xtea2_decipher(PLongWord(16), PLongWord(crypto_block_begin), PLongWord(Key)); Inc(crypto_block_begin, block_length); end; end; end. Подскажите что я делаю не так? Когда прошелся отладчиком то увидел что на строке: Код:
c := c - ((d shl 4) xor (d shr 5)) + (b xor sum) + rotl(PLongWordArray(k)[(sum shr 11) and 3], d); Последний раз редактировалось Stamerlan, 19.06.2013 в 10:35. |
#2
|
||||
|
||||
Код:
result := (value shl shift) or (value shr 32-shift); Код:
result := (value shl shift) or (value shr (32-shift)); Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
Этот пользователь сказал Спасибо PhoeniX за это полезное сообщение: | ||
Stamerlan (19.06.2013)
|
#3
|
|||
|
|||
Да, действительно значение изменилось, но все равно не то видимо у меня несколько ошибок
|
#4
|
||||
|
||||
Значения a, b, c, d, sum, k[] на этом этапе совпадают с "эталонными" (из оригинального кода)?
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
Этот пользователь сказал Спасибо PhoeniX за это полезное сообщение: | ||
Stamerlan (19.06.2013)
|
#5
|
|||
|
|||
А если объявить так, как в сишной программе
Код:
function rol(base:LongWord; shift:LongWord) :LongWord; |
Этот пользователь сказал Спасибо icWasya за это полезное сообщение: | ||
Stamerlan (19.06.2013)
|
#6
|
|||
|
|||
Цитата:
Код:
function rol(base:LongWord; shift:LongWord) :LongWord; UPD: не хватало скобочек в выражениях при с и а. Надо было написать с := c - (... + ... + ...), а у меня было c := c - ... + ... + ... Всем спасибо! Последний раз редактировалось Stamerlan, 19.06.2013 в 10:58. |