C++ Übersetzung klemmt
Hallo,
ich muss gerade ein paar C Zeilen übersetzten. Aber da hier Äpfel und Birnen addiert werden komme ich nicht weiter.
Code:
Geschrieben habe ich es nun so:struct crypt_block { uint8 keytable[256]; uint8 state; uint8 counter; uint8 sum; }; static void init_crypt(struct crypt_block *block, uint8 *key, int len) { block->state = *key; block->counter=0; block->sum=0; } static void crypt(struct crypt_block *block, uint8 *data, int len, crypt_mode_t mode) { int i; uint8 z; for (i = 0; i < len; i++) { block->counter++; block->sum += block->keytable[block->counter]; z = data[i]; data[i] = z ^ block->keytable[(block->keytable[block->counter] + block->keytable[block->sum]) & 0xff] ^ block->state; if (!mode) z = data[i]; block->state = block->state ^ z; } }
Delphi-Quellcode:
Aber beim block.state komme ich nicht weiter. Ist ja eigentlich ein Zeiger auf ein Array ? :gruebel:
Type
TCrypt_Block = Record keytable: Array [0 .. 255] of byte; state: PArray; // to key counter: byte; sum: byte; End; PCrypt_Block = ^TCrypt_Block; procedure init_crypt(block: PCrypt_Block; key: PArray; len: Integer); begin ......... block^.state := @key; block^.counter := 0; block^.sum := 0; end; procedure crypt(block: PCrypt_Block; Data: PArray; len: Word; mode: TCrypt_Mode); Var i: Integer; z : byte; begin for i := 0 to len - 1 do begin Inc(block^.counter); block^.sum := block^.sum + block^.keytable[block^.counter]; z := Data^[i]; Data^[i] := z xor block^.keytable[(block^.keytable[block^.counter] + block^.keytable[block^.sum]) and $FF] xor block^.state; // hier klemmt es if mode = DECRYPT then z := Data^[i]; block^.state := block^.state xor z; // und hier auch end; end; Besten Dank |
Re: C++ Übersetzung klemmt
Hallo,
Delphi-Quellcode:
uint8 state
= state: Byte;
Delphi-Quellcode:
Prinzipiell.
uint8 *data
= data: PByte; |
Re: C++ Übersetzung klemmt
Hallo,
block->state = *key; Würde doch auf key[0] zeigen ? Denn Key ist z.B. ein 20 Byte Hash. |
Re: C++ Übersetzung klemmt
Code:
Da block->state nur 1 Byte groß ist, wird immer nur das erste Byte des Key verwendet und der Rest ignoriert ... fällt auch dadurch auf, daß "len" garnicht verwendet wird.
static void init_crypt(struct crypt_block *block, uint8 *key, int len)
{ block->state = *key; block->counter=0; block->sum=0; } PS: Bei len=0 und vorallem *key=nil wird es knallen, da es dort dieses Byte garnicht gibt. |
Re: C++ Übersetzung klemmt
Sorry. Komplett sieht das so :
Code:
Das hatte ich, der Übersicht wegen, weggelassen.
for (i=0; i<256; i++) {
block->keytable[i] = i; } for (i=0; i<256; i++) { j += key[i % len] + block->keytable[i]; } block->state = *key; block->counter=0; block->sum=0;
Delphi-Quellcode:
So lässt es sich jetzt compilieren. Bin mir aber mit den ganzen ^ nicht sicher. Pointer :wall:
Type
TCrypt_Block = Record keytable: Array [0 .. 255] of byte; state: Pbyte; // to key or Hash ? counter: byte; sum: byte; End; procedure crypt(block: PCrypt_Block; Data: PArray; len: Word; mode: TCrypt_Mode); Var i: Integer; z: byte; begin for i := 0 to len - 1 do begin Inc(block^.counter); block^.sum := block^.sum + block^.keytable[block^.counter]; SwapC(block^.keytable[block^.counter], block^.keytable[block^.sum]); z := Data^[i]; Data^[i] := z xor block^.keytable[(block^.keytable[block^.counter] + block^.keytable[block^.sum]) and $FF] xor block.state^; if mode = DECRYPT then z := Data^[i]; block.state^ := block.state^ xor z; end; end; Was macht das für einen Sinn, nur das erste Byte vom Hash zu nehmen ? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz