Autor Beitrag
Flamefire
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: Mi 04.04.07 19:14 
Ich bin grad (auch) dabei eine RSA verschlüsselung zu basteln...aber problem:
ich benutz seeehr große zahlen mithilfe der Bignum2 unit...
jetzt möchte ich die aber auch wieder in eine datei speichern...aber das laden geht dann nicht...
zum verständnis hier der code:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
var n2,e2:TBigNumber;inputf,outputf:String;f,f2:Tfilestream;b:TBigNumber;ok:boolean;t,b2:integer;
...


 n2:=BMD_StrToBigNum(Edit3.Text,false);
 e2:=BMD_StrToBigNum(Edit4.Text,false);
 Gauge1.Progress:=0;
 t:=0;
  f:=TFileStream.Create(inputf,fmOpenRead);
  try
    f2:=TFileStream.Create(outputf,fmCreate);
    try
     while f.Position<f.Size do
      begin
        t:=t+1;
        if(t=10) then begin
          t:=0;
          Gauge1.Progress:=trunc(f.Position/f.Size*100);
           Application.ProcessMessages
       end;
       b2:=0;
        f.read(b2,2);
        b:=BMD_StrToBigNum(inttostr(b2),false);
        b := FastExpMod(b,e2,n2);
        f2.writebuffer(b,SizeOf(b));
      end;
    finally
      f.Free;
    end
  finally
     f2.Free;
  end;
  Gauge1.Progress:=100;
  showmessage('Datei verschlüsselt!');


das klappt aber nicht ganz...wie kann ich jetzt die zahl in der datei speichern und sie auch wieder auslesen, ohne sie als string o.ä. zu speichern? (würde zuviel platz verbrauchen, oder?)
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: Fr 06.04.07 09:57 
Hallo,

ich weiß ja nicht, wo b := FastExpMod(b,e2,n2); in Bignum2 vorkommt, aber es gibt wohl immer überarbeitete Funktionen.
In der Version www.delphi-forum.de/download.php?id=1868 aus www.delphi-forum.de/viewtopic.php?t=51429
gibt es doch:
ausblenden Delphi-Quelltext
1:
2:
Function BMD_StrToBigNum(Str: String; HexInput: Boolean): TBigNumber;
Function BMD_BigNumToStr(Num: TBigNumber; HexOutput: Boolean): String;


Ich würde also die hexadezimale Ein-Ausgabe wählen.
Die braucht zwar den doppelten Platz als String gegenüber dem Speicherabbild von TBignumber, aber läßt sich sehr schnell hin und herwandeln und einfach als String speichern.
Es muss aber etwas geändert werden, beim Einlesen entsprechend.
Das heißt der String hat immer eine gerade Zahl an Hexadezimalstellen (2 Hexadezimalziffern entsprechen einem Byte) und kann beim Einlesen ohne Fallunterscheidung arbeiten.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
Function BMD_BigNumToStr(Num: TBigNumber; HexOutput: Boolean): String;
Var
    B, R: TBigNumber;
    X: Integer;
Begin
    Result := '';
    If HexOutput Then
      Begin
        //Zahl auf minimale Länge bringen
      BM_Optimize(Num);
        //HexString erzeugen
      For X := 0 To High(Num) Do
        Result := IntToHex(Num[X], 2) + Result;
       {//Führende Nullen entfernen , nach Optimize maximal 2 (bei Num = 0)
        Dass darf nicht genutzt werden
        While Length(Result) <> 0 Do
            If Result[1] <> '0' Then
                Break
            Else
                Delete(Result, 1, 1);
        
        If Result = '' Then
            Result := '0';
        }

    
      End
    Else


Vielleicht wäre es sinnvoll ein'0x' der Ausgabestring voranzustellen, damit man das im Editor auch sofort erkennt, was gemeint ist.

Gruß Horst
Flamefire Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: Fr 06.04.07 11:45 
ja die unit hab ich...

die funktion FastExpMod() ist die rsa verschlüssleung...
meine idee wäre: BIGNUM-->Länge in Bytes&1.Byte&2.Byte&...
und beim auslesen genauso...aber das ist aufwendig....mal sehn obs klappt
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: Fr 06.04.07 12:46 
Hallo,

mein Vorschlag ist sehr simpel und sehr schnell und der doppelte Speicherplatz auf der Festplatte dürfte wohl kaum stören.
Bei 1024 Bit = 128 Byte Schlüssel hast Du ja auch nur 256 byte für diese Zahl zu speichern.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
//schreiben
writeln(TextDatei,BMD_BigNumToStr(Num,True));
//lesen
readln(TextDatei,strBigNum);
Num :=BMD_StrToBigNum(strBigNum,true);
strBigNum :='';


Natürlich kannst Du einen stream benutzen, den Du selbst verwalten musst.
So kannst Du aber auch eine Stringliste nehmen und viele Zahlen einfach verwalten.

Gruß Horst