AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

C++ Übersetzung klemmt

Ein Thema von totti14 · begonnen am 31. Mai 2010 · letzter Beitrag vom 31. Mai 2010
Antwort Antwort
totti14

Registriert seit: 26. Mai 2005
Ort: Bremen
90 Beiträge
 
Delphi 10.3 Rio
 
#1

C++ Übersetzung klemmt

  Alt 31. Mai 2010, 16:21
Hallo,
ich muss gerade ein paar C Zeilen übersetzten. Aber da hier Äpfel und Birnen addiert werden komme ich nicht weiter.

Code:

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;
  }
}
Geschrieben habe ich es nun so:

Delphi-Quellcode:
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;
Aber beim block.state komme ich nicht weiter. Ist ja eigentlich ein Zeiger auf ein Array ?

Besten Dank
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

Re: C++ Übersetzung klemmt

  Alt 31. Mai 2010, 16:31
Hallo,

Delphi-Quellcode:
uint8 state

=

state: Byte;

Delphi-Quellcode:
uint8 *data

=

data: PByte;
Prinzipiell.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
totti14

Registriert seit: 26. Mai 2005
Ort: Bremen
90 Beiträge
 
Delphi 10.3 Rio
 
#3

Re: C++ Übersetzung klemmt

  Alt 31. Mai 2010, 16:46
Hallo,

block->state = *key;

Würde doch auf key[0] zeigen ? Denn Key ist z.B. ein 20 Byte Hash.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#4

Re: C++ Übersetzung klemmt

  Alt 31. Mai 2010, 17:02
Code:
static void init_crypt(struct crypt_block *block, uint8 *key, int len)
{
  block->state = *key;
  block->counter=0;
  block->sum=0;
}
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.

PS: Bei len=0 und vorallem *key=nil wird es knallen, da es dort dieses Byte garnicht gibt.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
totti14

Registriert seit: 26. Mai 2005
Ort: Bremen
90 Beiträge
 
Delphi 10.3 Rio
 
#5

Re: C++ Übersetzung klemmt

  Alt 31. Mai 2010, 17:17
Sorry. Komplett sieht das so :
Code:
 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;
Das hatte ich, der Übersicht wegen, weggelassen.



Delphi-Quellcode:
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;
So lässt es sich jetzt compilieren. Bin mir aber mit den ganzen ^ nicht sicher. Pointer
Was macht das für einen Sinn, nur das erste Byte vom Hash zu nehmen ?
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:12 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