Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Unbegrenzt viele Nachkommastellen (https://www.delphipraxis.net/12974-unbegrenzt-viele-nachkommastellen.html)

Dano 23. Okt 2004 00:09

Re: Unbegrenzt viele Nachkommastellen
 
Hi Hagen,
ich bins nochmal ;)

nun habe ich mir frustriert ein bier aufgemacht weil ich an einer stelle hing die mir wirklich aussichtslos erschien (die parameterübergabe).... ich habe mich echt geärgert das der mir das self dazwischenmogelt und ich den "begin" der funktion wo er den refzähler des string erhöht nicht verhintern kann.... naja, wärend ich gemütlich das bier schlürfe hats klick gemacht.... ich mach die prozedur als asm, dann kann ich mit [ebp+$04] [ebp+$08] [ebp+$0c].... mir die richtigen werte bei stdcall selber von stack holen
man könnte auch register als aufrufkonvention nehmen, wäre das selbe in grün und schneller.... aber stack ist mir zum probieren lieber ;)
die refcounter von den string's muß ich zwar selber ändern, aber ist ja nicht schwer :)



*kopf auf den tisch hau*
warum bin ich da nicht gleich drauf gekommen

also hat sich das erstmal erledigt

mfg Dano

negaH 23. Okt 2004 03:20

Re: Unbegrenzt viele Nachkommastellen
 
Ich verstehe dich jetzt nicht so richtig.

Die Methode .SetName(const Name: String); solltest du prozedurale mal so betrachten:

Delphi-Quellcode:
procedure SetName(Self: PMyRecord; const Name: String); stdcall;
Self zeigt also auf deinen Record der ja sozusagen als TObject Ersatz dient. D.h. wenn du die VMT vin deinem Interface deklarierst so müsste diese so aussehen:

Delphi-Quellcode:
type
  PMyRecord = ^TMyRecord;
  TMyRecord = packed record
    VMT: PMyVMT;
    RefCount: Integer;
    Name: String;
  end;

  PMyVMT = ^TMyVMT;
  TMyVMT = packed record
    _QueryInterface: function(Self: PMyRecord; var Obj; const IID: TGUID): HResult; stdcall;
    _AddRef: function(Self: PMyRecord): HResult; sdtcall;
    _Release: function(Self: PMyRecord): HResult; sdtcall;
    GetName: function(Self: PMyRecord): String; stdcall;
    SetName: procedure(Self: PMyRecord; const Name: String); stdcall;
    GetRefCount: function(Self:PMyRecord): Integer; stdcall;
  end;

function MyQueryInterface(Self: PMyRecord; var Obj; const IID: TGUID): HResult; stdcall;
begin
  Result := S_ERROR;
end;

function MyAddref(Self: PMyRecord): HResult; stdcall;
begin
  InterlockedIncrement(Self.RefCount);
  Result := Self.RefCount;
end;

function MyRelease(Self: PMyRecord): HResult; stdcall;
begin
  InterlockedDecrement(Self.RefCount);
  Result := Self.RefCount;
  if Result = 0 then Dispose(Self);
end;

function MyGetName(Self: PMyRecord): String; stdcall;
begin
  Result := Self.Name;
end;

procedure MySetName(Self: PMyRecord; const Name: String); stdcall;
begin
  Self.Name := Name;
end;

function MyGetRefCount(Self: PMyRecord): Integer; stdcall;
begin
  Result := Self.RefCount;
end;

const
  VMT: TVMT = (
    _QueryInterface: MyQueryInterface;
    _AddRef: MyAddRef;
    _Release: MyRelease;
    GetName: MyGetName;
    SetName: MySetName;
    GetRefCount: MyGetRefCount;
);


function Alloc: IMyInterface;
var
  MyRecord: PMyRecord;
begin
  New(MyRecord);
  MyRecord.VMT := @VMT;
  Result := IInterface(MyRecord);
end;
Ohne Gewähr, ist alles aus dem Kopf ;)

Gruß Hagen

Dano 23. Okt 2004 16:50

Re: Unbegrenzt viele Nachkommastellen
 
Hi Hagen :)

hm... bei dir sieht das mal wieder so spielend einfach aus^^
mein problem war das ich nicht wußte wie ich das self mit in den funktionsaufruf einbauen soll
ich hatte das mit der VMT etwas anders gemacht

also das soll ein versuchs-interface zu einem string sein
hab mal bisel ordnung und struktur in alles gebracht.... aber im prinzip noch genauso wie vorher
Delphi-Quellcode:
 // Das String Interface
  IString = Interface(IInterface)
    function IS_GetString: String;
    procedure IS_SetString(AString: String);
    function IS_GetRefCount: Integer;
    property RefCount: Integer read IS_GetRefCount ;
    property AString: String read IS_GetString write IS_SetString;
  end;

  // Die VMT für das String Interface
  PStringVMT = ^TStringVMT;
  TStringVMT = packed record
    QueryInterface: Pointer;
    AddRef: Pointer;
    Release: Pointer;
    GetString: Pointer;
    SetString: Pointer;
    GetRefCount: Pointer;
  end;

  // Der Record für das String Interface
  PStringIntf = ^TStringIntf;
  TStringIntf = packed record
    StringVMT: PStringVMT;
    RefCount: Integer;
    AString: String;
  end;

procedure StringInit(var Dest: IString);
function IS_QueryInterface(Self: Pointer; const IID: TGUID; out Obj): HResult; stdcall;
function IS_AddRef(Self: Pointer): Integer; stdcall;
function IS_Release(Self: Pointer): Integer; stdcall;
function IS_GetString: String;
procedure IS_SetString(AString: String);
function IS_GetRefCount: Integer;

const
  // Die VMT für IString fertig Initialisiert
  ISGlobalVMT: TStringVMT = (
    QueryInterface: @IS_QueryInterface;
    AddRef: @IS_AddRef;
    Release: @IS_Release;
    GetString: @IS_GetString;
    SetString: @IS_SetString;
    GetRefCount: @IS_GetRefCount);

implementation

procedure IS_SetString(AString: String);
// stdcall: [ebp+$04] RücksprungAdresse
// [ebp+$08] Self(pointer auf interfacerecord)
// [ebp+$0c] String
// register: EDX String, EAX Self
// todo
// strings copy
// wenn refcount > 1 dann copy on demand
asm
  PUSH EAX              // self sichern
  LEA  EAX, [EAX+$08]   // Dest String nach EAX
  PUSH EDX              // Src String sichern
  MOV  EDX, ESP         // Zeiger auf Src
  CALL IS_LStrAsg       // procedure IS_LStrAsg(var dest; const source);


  usw.....
mein problem war das ich die funktionen so wie bei normalen objekten realisieren wollte.... und da gabs probleme mit dem self
im interface wird SetString ohne Self deklariert.... aber die eigentliche funktion muß mit self implementiert werden... aber ich habe beides gleich ohne self gehabt.... war irgendwie ein riesiger denkfehler von mir

naja, aber jetzt geht es einwandfrei *freu*
vielen dank Hagen :)

allerdings hatte ich mir mit dem string als test selber einen gemacht.... weil der compiler selber diverse stringumwandlungen einbaut und dabei unterscheidet woher der string kommt ob global... local... aus dynamischen resourcen(dll...) oder aus dem code,
und das müßte ich alles selber mit asm einbauen um die sicherheit zu geben das ein string nicht freigegeben wird der nicht freigegeben werden darf....

aber bei deiner variante kümmert sich der compiler wieder selber um alles ;)

mfg Dano

Dano 23. Okt 2004 19:21

Re: Unbegrenzt viele Nachkommastellen
 
so, und nun das fertige ergebniss :)
Delphi-Quellcode:
unit InterfaceString;

interface  

type
  // Das String Interface
  IString = Interface(IInterface)
    function IS_GetString: String;
    procedure IS_SetString(AString: String);
    function IS_GetRefCount: Integer;
    property RefCount: Integer read IS_GetRefCount ;
    property AString: String read IS_GetString write IS_SetString;
  end;

  // Die VMT für das String Interface
  PStringVMT = ^TStringVMT;
  TStringVMT = packed record
    QueryInterface: Pointer;
    AddRef: Pointer;
    Release: Pointer;
    GetString: Pointer;
    SetString: Pointer;
    GetRefCount: Pointer;
  end;

  // Der Record für das String Interface
  //PPStringIntf = ^PStringIntf;
  PStringIntf = ^TStringIntf;
  TStringIntf = packed record
    StringVMT: PStringVMT;
    RefCount: Integer;
    AString: String;
  end;


procedure StringInit(var Dest: IString);
function IS_QueryInterface(Self: PStringIntf; const IID: TGUID; out Obj): HResult; stdcall;
function IS_AddRef(Self: PStringIntf): Integer; stdcall;
function IS_Release(Self: PStringIntf): Integer; stdcall;
function IS_GetString(Self: PStringIntf): String;
procedure IS_SetString(Self: PStringIntf; AString: String);
function IS_GetRefCount(Self: PStringIntf): Integer;

function InterlockedIncrement(var I: Integer): Integer;
function InterlockedDecrement(var I: Integer): Integer;

const
  // Die VMT für IString fertig Initialisiert
  ISGlobalVMT: TStringVMT = (
    QueryInterface: @IS_QueryInterface;
    AddRef: @IS_AddRef;
    Release: @IS_Release;
    GetString: @IS_GetString;
    SetString: @IS_SetString;
    GetRefCount: @IS_GetRefCount);  

implementation

// Initialisiert das interface
procedure StringInit(var Dest: IString);
var
  NewIString: PStringIntf;
begin
  New(NewIString);
  NewIString^.StringVMT:=@ISGlobalVMT;
  NewIString^.RefCount:=0;
  NewIString^.AString:='Neues Interface';
  //SetLength(NewIString^.AString,$ffffff); //test ob IString freigegeben wird
  Dest:=IString(NewIString);
end;

function IS_QueryInterface(Self: PStringIntf; const IID: TGUID; out Obj): HResult; stdcall;
begin Result := HResult($80004002); end;

function IS_AddRef(Self: PStringIntf): Integer;
begin
  InterlockedIncrement(Self.RefCount);
  Result := Self.RefCount;
end;

// refcounter verringern und bei 0 den string freigeben
function IS_Release(Self: PStringIntf): Integer;
begin
  InterlockedDecrement(Self.RefCount);
  Result := Self.RefCount;
  if Result = 0 then begin
    Self.AString:='';
    Dispose(Self);
  end;
end;

function IS_GetString(Self: PStringIntf): String;
begin
  Result:=Self.AString;
end;

procedure IS_SetString(Self: PStringIntf; AString: String);
begin
  Self.AString:=AString;
end;

function IS_GetRefCount(Self: PStringIntf): Integer;
begin
  Result:=Self.RefCount;
end;

function InterlockedIncrement(var I: Integer): Integer;
asm
      MOV  EDX,1
      XCHG EAX,EDX
 LOCK XADD [EDX],EAX
      INC  EAX
end;

function InterlockedDecrement(var I: Integer): Integer;
asm
      MOV  EDX,-1
      XCHG EAX,EDX
 LOCK XADD [EDX],EAX
      DEC  EAX
end;

end.
nur schade das man bei
Delphi-Quellcode:
IIString.AString:='lalalalalalalalalala';
kein "Copy on Write Demand" einbauen kann


aber immerhin funzt es erstmal:)

mfg Dano

negaH 24. Okt 2004 18:36

Re: Unbegrenzt viele Nachkommastellen
 
Das stimmt, bei solchen Zugriffen kann das Interface nicht "Copy on Write Demand" machen. Deshalb auch meine Entscheidung alle DECMath Funktionen eben prozedural mit Overloading zu designen. In diesem Moment kann man VAR Parameter benutzen, ergo "Copy on Write Demand"

Allerdings ;) LongStrings in Delphi haben selber ein Referencecounting und Copy on Write Demand Feature.
Falls also deiner Interface nur in Delphi Sourcen verwendet werden sollen, so hast du auf Grund der LongStrings indirekt denoch ein Copy on Write Demand und Memory Sharing.

Gruß Hagen

Dano 24. Okt 2004 21:45

Re: Unbegrenzt viele Nachkommastellen
 
hi Hagen :)

das war ja nur ein test mit dem IString
die normalen strings sind natürlich um vieles besser

ich sags mal so:
nicht IString selber war mein ziel, sondern der weg zu IString und dem verstehen warum/wie es geht war das ziel
also der weg war das ziel.....
das ich strings als testopfer genommen habe war einfach eine entscheidung
irgendeinen sinn mußte ich der "selbsterkenntniss" ja geben ;)
einen richtigen sinn würde das erst mit objekten machen... dann kann man nie vergessen die freizugeben^^
oder dein waitcursor... der ist eigentlich auch genial :)
aber das beste sind natürlich die IInteger :)

ich habe dabei eine menge gelernt
ist eigentlich ein cooler trick mit den interfaces

jetzt wo ich weiß wie es geht kann man überlegen ob und wie man es verwendet ;)

mfg Dano

Nepos 17. Apr 2005 16:22

Re: Unbegrenzt viele Nachkommastellen
 
Ich weiß das dass thema schon länger zurückliegt aber ich wollte trotzdem eine frage wagen...
Ich bin in die kryptologie erst vor kürzerem eingestiegen. Seit dem fasinierte mich der RSA-Alogarithmus sehr. (fragt mich nicht warum...ich weiß es selber nicht^^)
Ich habe ein erfolgreiches programm geschreieben, doch wobald ich in eine höere potenz gehe (im rahmen z.b.: 7000^90)
zeigt er nur noch 0 an...es scheint mir delphi würde das nicht schaffen.
Ich benutze immoment den variablen typ extended.

Jetzt las ich hier in diesem thread über möglichkeiten der hohen stellen nach dem komma etc.
Ist es möglich dies in wenigen sätzen einem mathematisch nicht so weit entwickelten menschen wie mir^^ nahe zubringen was sinnvoll für mich ist zu tuhen.

Ich schäte negah's beiträge sehr!!! Doch verstehe ich höchstens 50%.

Meine frage ist es ist es möglich IInteger oä in mein programm o. Unit einzubinden das ich dieses wie eine andere von delphi's variablen einzubinden??
(Wie z.b.: var i:IInteger)

Oder muss man das ganz anders machen?

Ich freue mich über alle anregungen...

vielen dank für alle antworten im vorraus

NEPOS

negaH 18. Apr 2005 05:52

Re: Unbegrenzt viele Nachkommastellen
 
Ja das geht:

Delphi-Quellcode:

uses NInts, NMath;

interface

implementation

procedure RSA;
// RSA 1024 Bit verschlüsselung
var
  P,Q: IInteger;
  N: IInteger;   
  E,D: IInteger;
  U,Dp,Dq: IInteger;
  M,C: IInteger;  
  X,Y: IInteger;  
begin
// Schüssel Erzegung
  repeat
    NRnd(P, 512);
    NBit(P, 512 -2, True);
    NMakePrime(P, [1, 2]);
    repeat
      NRnd(Q, 512);
      NBit(Q, 512 -2, True);
      NMakePrime(Q, [1, 2]);
    until NCmp(P, Q) <> 0;
    if NCmp(P, Q) < 0 then NSwp(P, Q);   
    NMul(N, P, Q);
  until NSize(N) = 1024;

  NDec(P);
  NDec(Q);
  NLCM(U, P, Q);    
  repeat
    repeat
      NRnd(E, NLog2(NSize(N)) * 4);  
      NOdd(E, True);
    until NGCD1(E, P) and NGCD1(E, Q);
  until NInvMod(D, E, U) and (NSize(D) >= NSize(E)) and NGCD1(D, N);

  NMod(Dp, D, P);  
  NMod(Dq, D, Q);  
  NInc(P);
  NInc(Q);
  NInvMod(U, P, Q);

// privater und öffentlicher RSA Schlüssel sind nun fertig
// N,E ist der öffentliche Schlüssel
// N,D der private Schlüssel, wobei
// U,Dp,Dq,P,Q dazu gehören damit wir die Entschlüsselung um Faktor 4 beschleunigen können


// verschlüssele M den PlainText zu CipherText C = M^E mod N
  NSet(M, 'Unser Geheimnis', 256);
  NMod(M, N);         
  NPowMod(C, M, E, N);         

// entschlüssele C per Chinese Remainder Theorem ca. 4 mal schneller als normale Variante
  NPowMod(X, C, Dp, P);
  NPowMod(Y, C, Dq, Q);
  NCRT(Y, NInt([X, Y]), NInt([Dp, Dq]), NInt([U]));

// Y = M entschlüsselt
end.
Wie du siehst einfach per Uses einbinden und schwups ist RSA fertig.

gruß Hagen

Nepos 18. Apr 2005 16:54

Re: Unbegrenzt viele Nachkommastellen
 
Vielen dank Hagen :thumb: für deine Antwort! Ich verzweifel trotzdeines mitgelieferten quellcodes...denn irgendwie bin ich zu dumm den wuellcode einzubinden...
Ich habe ihn versucht in die Unit und in den "QUellcode" (Projekt -> Quellcode anzeigen) doch er zeigt beim copelieren eine reihe fehlermeldungen an... :cry:
Wie z.B. das er nicht mit IInteger etc zurecht kommt.
Bei der NMath sagt er "Deklaration erwartet, text ende gefunden"

Ich benutze D7 und habe Hagens DECMathD7 in die Lib kopiert...

Muss ich das irgendwie installiern?? Soweit ich das verstanden habe nicht...

ich hoffe ihr könnt mir helfen :lol:

Nepos

negaH 19. Apr 2005 06:16

Re: Unbegrenzt viele Nachkommastellen
 
Nichts in Lib kopieren, mit der Zeit würde sich da ja der ganze Rotz ansammeln.

Du entpackst die ZIP mit Ordnern und fertig ist alles installiert. Die im ZIP enthaltenen Dateiem im Ordner \LibInt\ sind nur die Header der Units vom DECMath. Sie enthalten also keine Implementation und können somit auch nicht direkt in dein Program eingebunden werden. Sie dienen dir als Dokumentation. (Edit: also auf KEINEN Fall dorthin ein Suchpfad legen, sonst versucht Delphi die teile wirklich zu komplieren)

Du musst auch garnichts einbinden ausser den Namen der Units in den Uses Klauseln. Dann musst du nur noch die Projektoptionen öffnen und den Pfad festlegen. Am besten schaust du dir mal ganz genau das DEMO Projekt an, auch dessen Projektoptionen. Dieses Projekt ist so eingestellt das es ohne zusätzliche Konfiguration vom Delphi denoch sofort compilierbar ist.

Für deine Projekte stehen dir nun zwei Möglichkeiten offen:

1.) du kompilierst ohne Packages und bindest somit die DCU vom DECMath in deine Anwendung ein. Dies übernimmt der Compiler/Linker für dich autom.

2.) du erzeugst dein Projekt mit Packages. Dazu müssen die Projektoptionen geändert werden und bei den benötigten Packages trägst du DECMath ein. Zu deiner EXE musst du dann natürlich auch die Packages mit installieren, sprich in diesem Falle die Datei DECMath.bpl.

Die von mir im Forum geposteten Versionen des DECMaths sind sogenannte binäre Distributationen, sie enthalten also nicht die vollständigen Quelltexte, sind aber voll funktionstüchtig und nicht eingeschränkt. Einzigste Lizenzbestimmung ist das du sie nicht weiter vertreiben darfst und nur in privaten oder rein akademischen Projekten verwenden kannst. Alles was darüber hinausgeht muß mit mir schriftlich abgeklärt werden (ich bin aber eine kulante und umgängliche Type :-)

Gruß Hagen

Nepos 11. Mai 2005 17:16

Re: Unbegrenzt viele Nachkommastellen
 
Ich habe richtig viel probiert aber er sagt einfach immer das

Zitat:

"die datei nicht gefunden: .../lib/Nmath.pas"
egal was ich mache...ich hab immer wieder hagens demos angeguggt... aber ohne sichtlichen erfolg...

kann mir jemand step by step den weg zum einbinden der entsprechenden dateien erklären? also für einen "einbinde-idioten" wie mir?

sobald ich in der use die NMath einbinde sagt er er wolle die *.pas haben...doch ich soll ja die dcu nehem...aber wie

Danke im vorraus!!!!

Nepos

negaH 11. Mai 2005 20:48

Re: Unbegrenzt viele Nachkommastellen
 
Hi

1.) enpacke das ZIP mit Ordnern zb. in einen Ordner Namens d:\DEC_D5\ für die D5 Version, danach sollten Unterordner existieren -> \LibInt\, \Fact\, \Demo\.
Im Ordner \DEC_D5\ sollten die *.DCU + DECMath.bpl liegen

2.) öffne das Projekt in \Demo\ -> Test.bpg

3.) öffne dort Projektoptionen und schaue dir die Verzeichnisoptionen an. Im Suchpfad steht "..\" also wörtlich "suche alle nötigen Dateien im übergeordneten Pfad relativ gesehen zum Pfad des aktuellen Projektes".

x.) falls du in den Projektoptionen "mit Packages compilieren" angehackt hast so muß in den "benötigten Packages"-> "DECmath" zusätzlich eingetragen werden. Zusätzlich kopierst du DECMath.bpl in den Ordner der Text.exe

Das wars.

Es sollten KEINE Suchpfade auf den Ordner \LibInt\ liegen, eventuell zur Sicherheit mal umbenennen. Dieser Ordner enthält PASCAL Sourcen deren Implementation von mir entfernt wurde. Sie dienen der Dokumentation um zu sehen welche Funktionen die Units exportieren.

Es darf KEIN Zugriff auf eine eventuelle Installation des normalen DEC's existieren. D.h. falls du DEC Version x.x installiert haben solltest -> sprich Unit DECutil.pas/Cipher.pas etc. pp. dann deinstalliere sie aus Delphi und benenne deren Basisordner temporär um. Die DECMath Distributation benutzt eine nicht offizielle Version vom DEC. Ist die offizielle Version auf deinem Rechner installiert so versucht Delphi DECMath erneut vollständig zu kompilieren (obwohl das im grunde nicht nötig wäre). Sogesehen ist das eine fast unüberwindliche Hürde im Delphi Compiler selber um elegant verscheidene Versionstände benutzen zu können. Das Projektmanagement in Borland PASCAL und somit auch Delphi ist seit anbegin immer schon tückisch.

[edit]
und es wird NICHTS kopiert, nirdendwohin, nicht in Delphis Lib Ordner oder sonst wohin, allerhöchstens in den Papierkorb. Es wird auch KEINE Komponente installiert oder ergleichen
[/edit]

Gruß Hagen

Nepos 12. Mai 2005 14:58

Re: Unbegrenzt viele Nachkommastellen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hoffe ich nerve euch nciht zu sehr aber ich bin total gefrustet...
Er möchte einfach immer andere dateien...als ich :wall: :wall: :wall: :pale:
Damit ich meine bemühungen nicht alten einstellungen zum opfer fallen habe ich delphi neu installiert.
Darauf hin bemerkte ich das er versucht die ganze zeit aus dem borlandordner rave5 die dateien zu holen...(sihe angehängtes bild)
Was ist bei mir blos los?

Vielen dank für eure bemühungen...

Nepos

negaH 13. Mai 2005 00:43

Re: Unbegrenzt viele Nachkommastellen
 
Ok, öffne den Explorer, drücke auf Suchen Button, wähle Arbeitsplatz, gebe in Suche die datei "NMath.*" oder "NInts.*" oder "DECUtil.*" ein.

Es dürfen nur die Dateien im Ordner \DEC_D5\LibInt\ und \DEC_D5\ gefunden werden. Falls doch woanders welche stehen LÖSCHEN !!

Und benenne mal den Rave5 Ordner in Rave5_ um.
Überprüfe deine globalen Suchpfade in der Delphi Konfiguration.

Sorry, aber im Delphi sind zwei Sachen wichtig:
1.) die Suchpfade schön sauber halten, eine nicht mehr benötigte Komponentensammlung korrekt deinstallieren, d.h. eben auch Suchpfade säubern
2.) niemals irdendwas in den \Lib\ Ordner oder sonstwo in die Delphi Ordner rein kopieren, immer schön parallel in einem ganz separatem Projekt Ordner seine Projekte und installierte 3'rd party Komponenten installieren.

Gruß Hagen

Nepos 16. Mai 2005 21:11

Re: Unbegrenzt viele Nachkommastellen
 
*heul* ich habe schon alles gemacht ....

Also:
1. Ich öffne delphi mit einem neuen - ganz normalen - projekt.
2. Ich tage NMath in der use-klausel dazu...
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, NMath;

type
  TForm1 = class(TForm)
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

end.
3. ich speicher das projekt ab und in den ordner wo das projekt ist habe ich die NMath.dcu
4. im suchpfad steht '..\'
5. ich klicke auf kompilieren
6. Delphi zeit das er die NMath.pas nicht finden kann.

Ich habe gemerkt das Delphi die NMAth.pas immer in den bibliotek-pafden sucht...

so das war mein letzter versuch ... wenn das nicht klappt muss ich den kram entweder in c schreiben oder ich muss ne andere lösung finden... :'(

vielen dank für eure bemühungen...

Nepos

negaH 17. Mai 2005 08:42

Re: Unbegrenzt viele Nachkommastellen
 
Sorry Junge aber was machst du für'n Scheiß, versuche doch erstmal dich an das zu halten was man dir empfohlen hat.

Ok, das was du oben beschrieben hast kann ja garnicht laufen. Du speicherst in den Ordner des Projektes auch die NMath.dcu. Mann, ich sagte doch -> NICHTS wird kopiert.

Also, du hast das ZIP entpackt, so wie oben geschrieben ? Ja ?
Nun legst du unter dem Ordner \DEC_D5\ einen neuen Ordner an. Mit Namen \MyTest\ und speicherst darin dein neues projekt. Im Suchpfad dieses Projektes trägst du '..\' ein. Logisch, da ja ausgehend vom Ordner \DEC_D5\MyTest\ im übergeordneten Ordner \DEC_D5\ die *.DCU's liegen, verstanden ?

Du separierst also mit folgender Logik:

- im Basis-Pfad -> "x:\MyLib\" liegen alle DCU's, Packages etc. pp.
- ausgehend von diesem Basis-Pfad gibt es Unterordner für die verschiednene Projekte
- innerhalb dieser Projekte wird der Suchpfad auf "..\" gesetzt, das entspräche dem absoluten Pfad "x:\MyLib\".
- absolute Pfadangaben sind immer schlecht, siehe Delphi selber, deshalb nutzen wir eine relative Pfadangabe mit "..\"
- du kannst also NICHT an beliebigen Orten dein Projekt speichern, es MUSS in einem Unterordner ausgehend von der DECMath Lib liegen.


Diese Vorgehensweise ist ideal zur Verteilung von DEMO-/Test-sourcen wie das DECMath. Denn nun benötigt man keine einzigste Einstellung im Delphi oder System selber. Alleine die Suchpfade in den Projekten reichen aus.

Gruß Hagen

Nepos 18. Mai 2005 14:18

Re: Unbegrenzt viele Nachkommastellen
 
Ich hab noch eine frage:

in welche uses klausel soll man das ganze einbinden :lol: ...die frage hört sich bestimmt sehr dumm an aber egal was ich mache... wenn ich die NMath in die Use klausel einbinde die zwischen 'Unit' und 'Interface' ist sucht der immer die *.pas datei... Laut Delphi hilfe ist das weil die die dort eingebunden sind neu kompiliert werden. Es gibt aber andere bereiche zB im implementations Teil wo einfach nur darauf zugegriffen wird aber nicht neu kompiliert...
Delphi-Hilfe:
Zitat:

Werden im interface-Abschnitt einer Unit Änderungen vorgenommen, müssen die von dieser Unit abhängigen Units neu compiliert werden. Werden die Änderungen dagegen nur im implementation- oder einem anderen Abschnitt einer Unit vorgenommen, müssen die abhängigen Units nicht neu compiliert werden. Der Compiler überwacht diese Abhängigkeiten und nimmt Neucompilierungen nur vor, wenn dies erforderlich ist.
Anderer seits sah ich *ich-blind-fisch* das du in deinem RSA-Code die uses über die interface geschrieben hast...welches aber mit meinem Delphi überhaupt nciht geht...
Probiert hab ich alles drei schon und immer wollte er die "c:\math\NMath.pas" haben... die dcus findet er schon...
Ne andere Sache ist die Das wenn ich "mit laufzeit package" kompiliere also dort "DECMath" eingetragen habe, aber in die use klausel nichts eingebunden habe kann ich es kompilieren... wobei dann der RSA code nicht funzt da ihm die ganzen befehle etc nichts sagen...
Noch eins. Wenn ich ganz am anfang bei Unitdei NMath eitrage dann sagt er "Modul-Header fehlt oder ist fehlerhaft"
So das waren noch ein paar versuche vieleicht kann mir noch jemand weiterhelfen...

:coder2:

Vieln Dank

Nepos

negaH 18. Mai 2005 18:51

Re: Unbegrenzt viele Nachkommastellen
 
Hi Nepos,

ehrlich gesagt ist es schon komisch das du der Einzigste bist der solch massiven Probleme hat. Es ist echt simpel, du enpackst die ZIP öffnest zb. das DEMO projekt und schwups kannst du kompilieren und testen.

Die Meldung "fehlerhaftes Modul oder Header fehlt" deutet ganz stark darauf hin das du die Dateien im Ordner \LibIntf\ entweder irgendwohin kopiert hast oder einen Suchpfad darauf liegen hast.
Du machst jetzt folgendes, (und zwar EXAKT step by step wie ich es schreibe).

1.) delphi beenden
2.) c:\math\ komplett löschen
3.) Explorer öffnen und nach "NMath.*; DECUtil.*; NInts.*;" suchen lassen
4.) alle dort gefundenen Dateien werden gelöscht und deren Ordner nach den anderen DEC Dateien durchsucht und diese ebenfalls gelöscht
5.) nun die ZIP erneut aus der DP downloaden
6.) ZIP entpacken in den Ordner "D:\DEC_D5\", diesen legst du vorher neu an
7.) Delphi starten
8.) Projekt d:\DEC_D5\Demo\Test.bpg öffnen
9.) compilieren
10.) starten

Wenn das alles reibungslos geht öffnest du die Source TestUnit.pas in diesem Projekt:
11.) kopiere obige Procedure RSA in diese Datei, an's Ende vor initialization
12.) in der Intialization Sektion stehen RegisterProc() Aufrufe, füge als ersten zeile nachfolgenden Source ein

RegisterProc('\Nepos\RSA Test', '', RSA, vk_F11);

13.) compiliere und starte das Prohjet
14.) im Menu findest du einen Entrag "Nepos", draufklicken
15.) es geht ein Menupopup auf mit einem Eintrag "RSA Test", draufklicken
16.) die obige RSA Procedure wird aufgerufen, mit Writeln(NStr(M)) kannst du Ausgaben erzeugen, mit Breakpoints kannst du Tracen


Gruß Hagen

negaH 18. Mai 2005 18:57

Re: Unbegrenzt viele Nachkommastellen
 
Ob nun NMath in der Uses Klausel im interface oder implementation Teil geschrieben wird ist für eine Neucompilation absolut unwichtig. Der Compiler compiliert autom. alles das neu was er neu kompilieren muß. Hast du auf deinem Rechner zb. eine Unit DECUtil.pas die nicht vom gleichen Datum wie meine *.DCU ist, so versucht der Compiler diese DCU's neu zu kompilieren. Deshalb muß DECUtil.pas aus dem DEC Part I eben gelöscht werden.
Das macht der Compiler unabhängig wo und wie die Unit in der Uses Klausel steht. Der einzigste Unterschied besteht darin ob man eventuelle Typdeklarationen im zb. nachfolgender TForm1 Deklaration benötigt werden. Hast du also in TForm1 zb. ein Feld vom Typ IInteger zu muß NInts, NMath in der Usdes Klausel des Interface stehen. Wird garnichts innerhalb dieses Interface aus den Units verwendet so kann man diese Units, privat, im Implementation Teil einbinden.

Gruß Hagen

Nepos 19. Mai 2005 12:17

Re: Unbegrenzt viele Nachkommastellen
 
Ich bin auch sehr verwundert das ich das als einziger nicht hinbekomme... das frustriert auch ziemlich...

So ich habe alles 100% so gemacht wie du gesagt hast! Jedoch will delphi die ConsoleForm.pas haben...
Ich habe auf dem rechner nach anderen consoleforms gesucht jedoch waren die unter "c:\dec_d5\" die einzigen...
Auch mit Delphi 3 hatte ich nicht mehr erfolg als mit D7. Ist auch nicht verwunderlich aber ich wollte es mal ausprobieren...in meiner Not.
So weit ich mittlerweile weiß ist es der grund wenn er die datei nochmal findet und die eine aktueller ist oder so das er die dann nochmal Compilieren will...jedoch ist weit und breit nirgend eine ConsoleForm...
Jedoch hatte nicht nur ich das prob (http://www.delphipraxis.net/internal...ht=consoleform) was aber ein schwachertrost ist ....

MFG Nepos

negaH 19. Mai 2005 14:09

Re: Unbegrenzt viele Nachkommastellen
 
Zitat:

"c:\dec_d5\" die einzigen...
Auch mit Delphi 3 hatte ich nicht mehr erfolg als mit D7
???? Was nun :) willst du Delphi 5, 6 oder 7 benutzen ? für Delphi 3 gibts DECMath nicht.

Es ist wichtig das du hier im Thread exakt die DECmath Version download'st die auch zur Delphi Version passt. Also DECMathD5.zip für Delphi 5, DECMathD6.zip für Delphi 6 und DECMathD7.zip für Delphi 7.

ConsoleForm.dfm und ConsoleForm.dcu liegen dann im DCU Ordner parat -> \DEC_Dx\*

Ich habe es nun nochmal selber ausgetestet. Rechner nackig gemacht, sprich alle meine Entwicklungspfade die DEC enthalten umbenannt, so das garantiert keine Suchpfade darauf verweisen.
Danach DECMathD7.zip in einen Ordner d:\DEC_D7\ entpackt, MIT ORDNERN entpacken.
Danach Delphi 7 gestartet, in d:\DEC_D7\Demo\Test.pbg geöffnet, alles compiliert und die Test.exe gestartet.
Danach Delphi 7 geschlossen, den Ordner d:\DEC_D7\ komplett gelöscht.
Danach auf Lafwerk C:\ einen Ornder DEC_D7 anglegt und erneut dahinein die ZIP entpackt.
Delphi 7 wieder gestartet, Test.pbg geöffent und neu compiliert, danach gestartet.

Ging alles absolut problemlos. Ich verstehe also nicht was bei dir das Problem sein soll.

Ich arbeite nun schon seit 15 Jahren mit Delphi/Borland Pascal, benutze auch schon fast so lange exakt diese Form der Installationen meiner Projekte, und habe bisher noch nie irgendwelche Probleme damit gehabt.
Es MUSS also funktionieren!

Falls es dann immer noch nicht bei dir funktioniert, tja dann weis ich auch nicht weiter :(

Gruß Hagen

Rain 27. Aug 2005 01:37

Re: Unbegrenzt viele Nachkommastellen
 
Hallo Hagen,

deine 'Große Zahlen Bibliothek' ist echt super. Ich hab gestern die IsProbablyPrim Funktion gut gebrauchen können.

Kommst du eigentlich aus Bonn ????

negaH 27. Aug 2005 12:11

Re: Unbegrenzt viele Nachkommastellen
 
Zitat:

Kommst du eigentlich aus Bonn ????
Nein.

Zitat:

deine 'Große Zahlen Bibliothek' ist echt super. Ich hab gestern die IsProbablyPrim Funktion gut gebrauchen können.
Und, wie war die Installation ? Hat die reibungslos funktioniert ?

Gruß Hagen

Rain 27. Aug 2005 13:30

Re: Unbegrenzt viele Nachkommastellen
 
Hab alle DCUs in meinen Ordner kopiert und das wars.
Hat bestens geklappt.

Rain 24. Feb 2007 17:20

Re: Unbegrenzt viele Nachkommastellen
 
Wow, ist ja schon einige Zeit (mehr als ein Jahr) her, daß ich in diesen Thread geschrieben hab und danach war noch keiner nach mir hier. :stupid:

Ich hab die tollen langen Integers schon einige Male gut gebrauchen können und bin immer wieder begeistert. (bisher in D7)

Jetzt hab ich die Turbo-Delphi für win32. Meine Frage an Hagen:
Kann man auch für Turbo-Delphi die passenden Bibliotheken bekommen? :?:

DGL-luke 24. Feb 2007 17:45

Re: Unbegrenzt viele Nachkommastellen
 
Versuchs mal mit der D7-Version. Aber bitte hier keine Fragen dazu stellen, wie man die zum Laufen kriegt, Hagen reagiert manchmal sehr empfindlich, wenn man bei der Installation außerhalb seiner Spezifikationen rumfrickelt und es nicht hinkriegt ;-)

(Wenn da nur DCUs sind, is der Ofen natürlich aus, soweit überblick ich das ganze jetzt nicht)

Dano 5. Aug 2011 21:13

Attacken auf RSA
 
hallo

mein problem ist "Common Modulus Attack"

"Bei diesem Angriff geht man davon aus, dass Bob (der Sender) an Alice und an Ali eine Nachricht übermittelt, die den gleichen Modulus aufweisen (N)"

also N, E1, E2, C1 und C2 ist bekannt
Inzwischen kann ich auch einige übungsaufgaben auch lösen, doch bei einer stimmt die prüfung von C1 nicht :(
Code:
unit Unit2;

interface

uses Unit1, Nints;

Procedure ComModAtt2(N,E1,E2,C1,C2: IInteger);

implementation

Procedure ComModAtt2(N,E1,E2,C1,C2: IInteger);
var
  M,D,U,V,A,B,C: IInteger;
  Sgn: Integer;
begin
  Form1.Memo5.Clear;
  Form1.Memo5.Lines.Add('N= '+NStr(N,NStrFormatDez));
  Form1.Memo5.Lines.Add('E1= '+NStr(E1,NStrFormatDez));
  Form1.Memo5.Lines.Add('E2= '+NStr(E2,NStrFormatDez));
  Form1.Memo5.Lines.Add('C1= '+NStr(C1,NStrFormatDez));
  Form1.Memo5.Lines.Add('C2= '+NStr(C2,NStrFormatDez));

  // ggT(E1,E2), E1*U+E2*V=1
  NGCD(D,U,V,E1,E2);
  Form1.Memo5.Lines.Add('');
  Form1.Memo5.Lines.Add('NGCD(D,U,V,E1,E2);');
  Form1.Memo5.Lines.Add('D= '+NStr(D,NStrFormatDez));
  Form1.Memo5.Lines.Add('U= '+NStr(U,NStrFormatDez));
  Form1.Memo5.Lines.Add('V= '+NStr(V,NStrFormatDez));
  NMul(A,E1,U);
  NMul(B,E2,V);
  NAdd(C,A,B);
  Form1.Memo5.Lines.Add('E1*U= '+NStr(A,NStrFormatDez));
  Form1.Memo5.Lines.Add('E2*V= '+NStr(B,NStrFormatDez));
  Form1.Memo5.Lines.Add('Sum= '+NStr(C,NStrFormatDez));        //muß 1 sein

  Sgn:=NSgn(U);
  if Sgn=-1 then NInvMod(C1,N) else NInvMod(C2,N);
  Form1.Memo5.Lines.Add('');
  Form1.Memo5.Lines.Add('NInvMod');
  Form1.Memo5.Lines.Add('C1= '+NStr(C1,NStrFormatDez));
  Form1.Memo5.Lines.Add('C2= '+NStr(C2,NStrFormatDez));
  NAbs(U);
  NAbs(V);
  //NPow(A,C1,NInt32(U));
  //NPow(B,C2,NInt32(V));
  NPowMod(A,C1,U,N);
  NPowMod(B,C2,V,N);
  NMul(M,A,B);
  NMod(M,N);
  Form1.Memo5.Lines.Add('');
  Form1.Memo5.Lines.Add('M(Dez)= '+NStr(M,NStrFormatDez));
  Form1.Memo5.Lines.Add('M(Hex)= '+NStr(M,NStrFormatHex));
  //Form1.Memo5.Lines.Add('M(Str)= '+NStr(M,256));

  // Gegenprobe
  //NMod(M, N);
  NPowMod(C1, M, E1, N);
  Form1.Memo5.Lines.Add('C1-Prüfung(Dez)= '+NStr(C1,NStrFormatDez));
end;

end.
dabei gild:
Code:
N:=402394248802762560784459411647796431108620322919897426002417858465984510150839043
30871212331051092261069037808551940774250258597856343810132119101903400539
27719366298693602053832477210261514496605439665282540146366485326403978575807916485639542483427
00568953634713286153354659774351731627683020456167612375777


E1:=3
E2:=17

C1:=2394500555365791264104330571199555682432088780374415580523455380604299102278641969063454277
5400049964152157551294447338004786562367966440122936534520806805
09956002487963581299506769508427247587430445433434269388456788927763963152408982656489198933847
23100132425351735921836372375270138768751862889295179915967

C2:=1383726409187124416350484327961837451631640337599336920157386880435148768080304194088666589
2614957261904997547953351803854312378143963536798820459974041130
44647105382346754095529545434399805222434169327598340069737179640327120984737524964711822752164
38174279723470286674311474283278293265668947915374771552561
doch die prüfung von C1 stimmt nicht
Code:
C1-Prüfung(Dez)= 229 748 883 401 527 166 400 260 684 242 392 683 037 469 523 041 872 042
 980 844 846 342 550 340 518 503 592 032 573 441 380 746 571 208 
620 262 300 506 317 236 122 652 396 681 944 603 811 686 899 149 909 108 149 973 290 629 735
 474 070 166 041 694 507 597 661 203 560 787 563 388 577 200 545 
258 718 291 160 899 361 354 003 355 196 008 305 806 812 154 227 397 942 403 831 325 878 222
 902 530 245 122 071 910 219
bei anderen vorgaben funktionierte es...
habe auch extra eigene RSA packete erstellt und mit dieser funktion getestet
habe ich irgendwo ein fehler im code?

wäre über hilfe dankbar,

mfg Dano

gammatester 5. Aug 2011 23:25

AW: Unbegrenzt viele Nachkommastellen
 
Das ist aber eine eigenwillige Interpretation von "Common Modulus Attacke"! Normalerweise ist dies Situation:

Bob: N, e1, d1 alle bekannt
Alice: N, e2 bekannt, von Bob gesucht d2=?

Mit seinen Angaben kann Bob N=p*q faktorisieren und d2 berechnen (bzw einen äquivalenten Geheimschlüssel).

gammatester 6. Aug 2011 08:56

AW: Unbegrenzt viele Nachkommastellen
 
Hallo, ich habe gerade mal ein wenig Literatur angeschaut, und bemerkt daß Deine Attacke wirklich auch unter "Common Modulus" läuft (und ich habe selbst vor über einen Jahr ein solches Demoprogramm für meine MPArith-RSA-Unit geschrieben).

Ich kann Deine Rechnung mit meinen Routinen nachvollziehen, bei mir ist übrigens auch m^e2 ungleich c2. Da die ganze Rechnung eigentlich trivial ist:

Voraussetzung: c1 = m^e1 mod n, c2 = m^e2 mod n.

Berechne mit erweitertem GCD: u*e1 + v*e2 = 1

Dann gilt: c1^u*c2^v = m^(e1*u)*m^(e2*v) = m^(u*e1 + v*e2) = m^1 = m

Da e1,e2 teilerfremd sind, mit u=6, v=-1 sollte m eigentlich berechnet werden können, WENN die Voraussetzungen stimmen.

Das scheint mir der einzige Anhaltspunkt für einen Fehler zu sein! Hast Du c1 und c2 selbst aus m berechnet? Wenn ja, poste es doch mal. Mein berechnetes m ist

m = 26002876987877775190361557548489331852259354915301 9384765768600715250637538 24282061019671425762467214234562338819547212408526 652061848635849964322015502199 81557879879742320530299944627310252826350236091418 607481941348004944530848076278 28351442483638107586760292651456892855464402992980 040644004040959655693485

Aber wie gesagt, m^e1 <> c1 und m^e2 <> c2.

Gruß Gammatester

Dano 7. Aug 2011 00:54

AW: Unbegrenzt viele Nachkommastellen
 
hi

mein M ist auch
Code:
260 028 769 878 777 751 903 615 575 484 893 318 522 593 549 153
019 384 765 768 600 715 250 637 538 242 820 610 196 714 257 624 672 142 345 623 388 195
472 124 085 266 520 618 486 358 499 643 220 155 021 998 155 787 987 974 232 053 029 994
462 731 025 282 635 023 609 141 860 748 194 134 800 494 453 084 807 627 828 351 442 483
638 107 586 760 292 651 456 892 855 464 402 992 980 040 644 004 040 959 655 693 485
hm, also muß ich vlt noch irgendwo einen fehler haben oder die aufgabe ist damit nicht lösbar:(
c1 und c2 waren vorgaben gewesen... ich check das noch mal
danke für die gegenrechnung, zeigt mir erstmal das ich richtig gerechnet habe^^

aber wenn alles stimmt muß ja nach M^E1 mod N wieder das c1 rauskommen *grübel*

Code:
NGCD(D,U,V,E1,E2);
Divisor=  1
U=  6
V= -  1

E1*U= 18
E2*V= - 17
Sum=  1
mfg Dano

Dano 9. Aug 2011 08:53

AW: Unbegrenzt viele Nachkommastellen
 
*kopftisch*

hallo nochmal, habe den fehler gefunden

E2:= $10001; // =65 537

weiß nich wie ich auf 17 kam :(
hatte wohl 10001 als binärzahl gelesen^^
aber jetzt stimmt alles auch mit den gegenrechnungen

mfg Dano


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:14 Uhr.
Seite 3 von 3     123   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz