Announcement

Collapse
No announcement yet.

absolute Direktive in Delphi 8

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • absolute Direktive in Delphi 8

    Hallo zusammen!

    Bisher habe ich nur in Delphi 5 programmiert, versuche aber jetzt, das Programm unter Delphi 8 zu compilieren.

    Bei folgender Deklaration bricht der Compiler ab:

    VAR
    S : STRING[255];
    C: ARRAY[0..255] OF BYTE absolute s;

    Fehlermeldung:
    [Fehler]Ungültige Compileranweisung: 'absolute'

    In der Online-Hilfe ist nichts zu finden über eine nötige Veränderung des Quelltextes bei "absolute"- Direktiven.
    Es wird sogar eine ähnliche Deklaration beschrieben, trotzdem wird der Code nicht compiliert. In Delphi 5 läuft alles normal.

    Wer weiss Rat?
    Herzlichen Dank schon mal im Vorraus

  • #2
    Hallo Michael

    Ich kenne mich zwar mit D8 noch nicht aus, weiss aber, dass Absolute nicht mehr zulässig ist. Ich musste auch alle diese Anweisungen ersetzen.

    Grüsse
    Marc

    Comment


    • #3
      Wer absolute benutzt ist selber schuld. Das laesst sich doch auch mit einem variant record implementieren. Ob D8 variant records wirklich mag weiss ich allerdings auch nicht

      Comment


      • #4
        Hallo,

        was soll denn mit dem <i>... absolute s</i> erreicht werden? Anstelle eine "alte" Technik 1:1 nachzubauen, macht es mehr Sinn, nach dem "neuen" Weg zu suchen, der die gleiche Aufgabe erfüllt. Außerdem ist es Heute komplizierter als früher (siehe ANSI mit seinen Codepages vs. UTF-8). Heute müssen wir in Delphi 8 sehr aufpassen, wenn "alte" und "neue" Strings gemischt werden und dabei Zeichen oberhalb von ASCII 127 im Spiel sind. Es ist daher sinnvoller, freiwillig auf die ShortStrings zu verzichten. Für einen String gilt in Delphi 8 die neue Formel <b>String</b> = <b>WideString</b> = <b>System.String</b>-Klasse aus dem .NET Framework.
        <br><br>
        Das folgende (sinnlose) Beispiel zeigt, wie ein String als <b>array of Byte</b> (alias <b>TBytes</b>) interpretiert werden kann:
        <pre>
        <b>procedure</b> TWinForm.Button1_Click(sender: System.<b>Object</b>; e: System.EventArgs);
        <b>var</b>
        sInput : <b>String</b>;
        aByteArray : TBytes;
        sOutput : <b>String</b>;
        <b>begin</b>
        sInput := <font color="#9933CC">'Das ist ein Test'</font>;
        aByteArray := System.Text.Encoding.GetEncoding(1252).GetBytes(sI nput);
        aByteArray[0] := 100;
        sOutput := System.Text.Encoding.ASCII.GetString(aByteArray);
        MessageBox.Show(sOutput);
        <b>end</b>;
        </pre&gt

        Comment


        • #5
          Hallo!

          vielen Dank für die Rückantworten.

          Mit dem Code habe ich bislang ein einzelnes Passwort verschlüsselt:

          VAR
          Superkey : ARRAY[1..1024] OF INTEGER;
          code : longint;

          PROCEDURE Make_Key;
          VAR I : INTEGER;
          begin
          randseed := code;
          randomize;
          for i := 1 to high(superkey) do superkey[i] := random(255);
          end;

          FUNCTION Unleserlich_machen_mit_SuperKey(TSTRING) : STRING;
          VAR S : STRING[255];
          C : ARRAY[0..255] OF BYTE absolute s;
          I : INTEGER;
          BEGIN
          S := T;
          FOR I := 1 TO ORD(s[0]) DO c[i] := superkey[i] XOR c[i];
          Unleserlich_machen_mit_SuperKey := s;
          END;

          FUNCTION Leserlich_machen_mit_SuperKey(T,K:STRING) : STRING;
          VAR S : STRING[255];
          C : ARRAY[0..255] OF BYTE absolute s;
          I : INTEGER;
          BEGIN
          S := T;
          FOR I := 1 TO LENGTH(s) DO c[i] := SD_superkey[i] XOR ord(s[i]);
          leserlich_machen_mit_Superkey := s;
          END;

          In der Online-Hilfe habe ich bisher gelesen, daß es unter .NET (heute ist mein dritter Programmierabend unter .NET) wohl eigene Verschlüsselungsmethoden gibt. Nur wie man das alles aufruft weiß ich (noch) nicht. Habe aber schon gemerkt, daß ich wohl noch ne Menge Arbeit vor mir habe. Hat sich doch einiges verändert seit Delphi 5. - Naja, wer weiß wofür das gut ist.

          Wäre nett, wenn mir jemand erklären könnte, wie ich meinen Algorithmus portieren kann, oder mir den Aufruf der .NET-Methoden erklären könnte.
          Ansonsten warte ich auf die bestellten Fachbücher zur Einführung in .NET .
          Trotzdem vielen Dank!

          Michae

          Comment


          • #6
            Hallo!

            vielen Dank für die Rückantworten.

            Mit dem Code habe ich bislang ein einzelnes Passwort verschlüsselt:

            <PRE>
            VAR
            Superkey : ARRAY[1..1024] OF INTEGER;
            code : longint;

            PROCEDURE Make_Key;
            VAR I : INTEGER;
            begin
            randseed := code;
            randomize;
            for i := 1 to high(superkey) do superkey[i] := random(255);
            end;

            FUNCTION Unleserlich_machen_mit_SuperKey(TSTRING) : STRING;
            VAR S : STRING[255];
            C : ARRAY[0..255] OF BYTE absolute s;
            I : INTEGER;
            BEGIN
            S := T;
            FOR I := 1 TO ORD(s[0]) DO c[i] := superkey[i] XOR c[i];
            Unleserlich_machen_mit_SuperKey := s;
            END;

            FUNCTION Leserlich_machen_mit_SuperKey(T,K:STRING) : STRING;
            VAR S : STRING[255];
            C : ARRAY[0..255] OF BYTE absolute s;
            I : INTEGER;
            BEGIN
            S := T;
            FOR I := 1 TO LENGTH(s) DO c[i] := SD_superkey[i] XOR ord(s[i]);
            leserlich_machen_mit_Superkey := s;
            END;
            </PRE>

            In der Online-Hilfe habe ich bisher gelesen, daß es unter .NET (heute ist mein dritter Programmierabend unter .NET) wohl eigene Verschlüsselungsmethoden gibt. Nur wie man das alles aufruft weiß ich (noch) nicht. Habe aber schon gemerkt, daß ich wohl noch ne Menge Arbeit vor mir habe. Hat sich doch einiges verändert seit Delphi 5. - Naja, wer weiß wofür das gut ist.

            Wäre nett, wenn mir jemand erklären könnte, wie ich meinen Algorithmus portieren kann, oder mir den Aufruf der .NET-Methoden erklären könnte.
            Ansonsten warte ich auf die bestellten Fachbücher zur Einführung in .NET.
            Trotzdem vielen Dank!

            Michae

            Comment


            • #7
              Hallo!

              vielen Dank für die Rückantworten.

              Mit dem Code habe ich bislang ein einzelnes Passwort verschlüsselt:

              <PRE>

              VAR
              Superkey : ARRAY[1..1024] OF INTEGER;
              code : longint;


              PROCEDURE Make_Key;
              VAR I : INTEGER;
              begin
              randseed := code;
              randomize;
              for i := 1 to high(superkey) do superkey[i] := random(255);
              end;


              FUNCTION Unleserlich_machen_mit_SuperKey(TSTRING) : STRING;
              VAR S : STRING[255];
              C : ARRAY[0..255] OF BYTE absolute s;
              I : INTEGER;
              BEGIN
              S := T;
              FOR I := 1 TO ORD(s[0]) DO c[i] := superkey[i] XOR c[i];
              Unleserlich_machen_mit_SuperKey := s;
              END;


              FUNCTION Leserlich_machen_mit_SuperKey(T,K:STRING) : STRING;
              VAR S : STRING[255];
              C : ARRAY[0..255] OF BYTE absolute s;
              I : INTEGER;
              BEGIN
              S := T;
              FOR I := 1 TO LENGTH(s) DO c[i] := SD_superkey[i] XOR ord(s[i]);
              leserlich_machen_mit_Superkey := s;
              END;


              </PRE>
              In der Online-Hilfe habe ich bisher gelesen, daß es unter .NET (heute ist mein dritter Programmierabend unter .NET) wohl eigene Verschlüsselungsmethoden gibt. Nur wie man das alles aufruft weiß ich (noch) nicht. Habe aber schon gemerkt, daß ich wohl noch ne Menge Arbeit vor mir habe. Hat sich doch einiges verändert seit Delphi 5. - Naja, wer weiß wofür das gut ist.

              Wäre nett, wenn mir jemand erklären könnte, wie ich meinen Algorithmus portieren kann, oder mir den Aufruf der .NET-Methoden erklären könnte.
              Ansonsten warte ich auf die bestellten Fachbücher zur Einführung in .NET.
              Trotzdem vielen Dank!

              Michae

              Comment


              • #8
                Hallo!

                vielen Dank für die Rückantworten.

                Mit dem Code habe ich bislang ein einzelnes Passwort verschlüsselt:

                <PRE>
                VAR
                Superkey : ARRAY[1..1024] OF INTEGER;
                code : longint;

                PROCEDURE Make_Key;
                VAR I : INTEGER;
                begin
                randseed := code;
                randomize;
                for i := 1 to high(superkey) do superkey[i] := random(255);
                end;

                FUNCTION Unleserlich_machen_mit_SuperKey(TSTRING) : STRING;
                VAR S : STRING[255];
                C : ARRAY[0..255] OF BYTE absolute s;
                I : INTEGER;
                BEGIN
                S := T;
                FOR I := 1 TO ORD(s[0]) DO c[i] := superkey[i] XOR c[i];
                Unleserlich_machen_mit_SuperKey := s;
                END;

                FUNCTION Leserlich_machen_mit_SuperKey(T,K:STRING) : STRING;
                VAR S : STRING[255];
                C : ARRAY[0..255] OF BYTE absolute s;
                I : INTEGER;
                BEGIN
                S := T;
                FOR I := 1 TO LENGTH(s) DO c[i] := SD_superkey[i] XOR ord(s[i]);
                leserlich_machen_mit_Superkey := s;
                END;

                </PRE>

                In der Online-Hilfe habe ich bisher gelesen, daß es unter .NET (heute ist mein dritter Programmierabend unter .NET) wohl eigene Verschlüsselungsmethoden gibt. Nur wie man das alles aufruft weiß ich (noch) nicht. Habe aber schon gemerkt, daß ich wohl noch ne Menge Arbeit vor mir habe. Hat sich doch einiges verändert seit Delphi 5. - Naja, wer weiß wofür das gut ist.

                Wäre nett, wenn mir jemand erklären könnte, wie ich meinen Algorithmus portieren kann, oder mir den Aufruf der .NET-Methoden erklären könnte.
                Ansonsten warte ich auf die bestellten Fachbücher zur Einführung in .NET.
                Trotzdem vielen Dank!

                Michae

                Comment


                • #9
                  Hallo,

                  &gt;..wohl eigene Verschlüsselungsmethoden gibt.

                  In der Tat, das .NET Framework ist in diesem Punkt ein reines Füllhorn :-)

                  Das folgende Beispiel (davon habe ich allerdings nur eine C#-Version am Lager) demonstriert dies. Es geht darum, eine Zugangsberechtigung zu prüfen, indem der Benutzername und das Benutzerpasswort der Anwender verglichen wird. Dazu muss die eigene Anwendung die dazu benötigten Informationen speichern (Datenbank oder config-Datei). Damit dies so sicher wie nur möglich wird, greift das Beispiel auf einen <b>Salted Hash</b> zurück, daraus ergibt sich eine sehr hohe Sicherheit, da vor jedes Benutzerpasswort eine zufällige Zeichenkette gesetzt wird. Somit liefern auch zwei gleiche Benutzerpasswörter einen völlig unterschiedlichen Hash-Wert zurück (für den Fall, dass einem unbefugten die Datenbank in die Hände fällt und dieser nach Ähnlichkeiten mit anderen Benutzerpasswörtern sucht).
                  <br><br>
                  C#-Klasse generiert den Hashswert aus dem Passwort:
                  <pre>
                  <b>using</b> System;
                  <b>using</b> System.Security.Cryptography;
                  <br>
                  <b>namespace</b> OssiSoft.Security
                  {
                  <font color="#003399"><i>/// &lt;summary&gt;</i></font>
                  <font color="#003399"><i>/// Passwortverschlüsselung mit Salt-Wert</i></font>
                  <font color="#003399"><i>/// &lt;/summary&gt;</i></font>
                  <b>public</b> <b>sealed</b> <b>class</b> OSSaltedHash
                  {
                  <b>private</b> <b>readonly</b> <b>string</b> _Salt;
                  <b>private</b> <b>readonly</b> <b>string</b> _Hash;
                  <b>private</b> <b>const</b> <b>int</b> iSaltLength = 6;
                  <br>
                  <font color="#003399"><i>/// &lt;summary&gt;</i></font>
                  <font color="#003399"><i>/// Instanz darf nicht über den Default-Constructor erzeugt werden</i></font>
                  <font color="#003399"><i>/// &lt;/summary&gt;</i></font>
                  <b>private</b> OSSaltedHash()
                  {
                  }
                  <br>
                  <font color="#003399"><i>/// &lt;summary&gt;</i></font>
                  <font color="#003399"><i>/// Instanz darf nicht über den überladenen Constructor erzeugt werden</i></font>
                  <font color="#003399"><i>/// &lt;/summary&gt;</i></font>
                  <font color="#003399"><i>/// &lt;param name=&quot;sSalt&quot;&gt;&lt;/param&gt;</i></font>
                  <font color="#003399"><i>/// &lt;param name=&quot;sHash&quot;&gt;&lt;/param&gt;</i></font><br>
                  <b>private</b> OSSaltedHash(<b>string</b> sSalt, <b>string</b> sHash)
                  {
                  _Salt = sSalt;
                  _Hash = sHash;
                  }
                  <br>
                  <font color="#003399"><i>/// &lt;summary&gt;</i></font>
                  <font color="#003399"><i>/// Instanz erzeugen (nur das Passwort ist bekannt)</i></font>
                  <font color="#003399"><i>/// &lt;/summary&gt;</i></font>
                  <font color="#003399"><i>/// &lt;param name=&quot;sPwd&quot;&gt;&lt;/param&gt;</i></font>
                  <font color="#003399"><i>/// &lt;returns&gt;&lt;/returns&gt;</i></font>
                  <b>public</b> <b>static</b> OSSaltedHash Create(<b>string</b> sPwd)
                  {
                  <b>byte</b>[] r = <b>new</b> <b>byte</b>[iSaltLength];
                  <b>new</b> RNGCryptoServiceProvider().GetBytes(r);
                  <b>string</b> sSalt = Convert.ToBase64String(r);
                  <b>byte</b>[] data = System.Text.Encoding.UTF8.GetBytes(sSalt + sPwd);
                  <b>byte</b>[] hash = <b>new</b> SHA1CryptoServiceProvider().ComputeHash(data);
                  <b>string</b> sHash = Convert.ToBase64String(hash);
                  <b>return</b> <b>new</b> OSSaltedHash(sSalt, sHash);
                  }
                  <br>
                  <b>public</b> <b>static</b> OSSaltedHash Create(<b>string</b> sSalt, <b>string</b> sHash)
                  {
                  <b>return</b> <b>new</b> OSSaltedHash(sSalt, sHash);
                  }
                  <br>
                  <b>public</b> <b>bool</b> Verify(<b>string</b> sPwd)
                  {
                  <b>byte</b>[] data = System.Text.Encoding.UTF8.GetBytes(_Salt + sPwd);
                  <b>byte</b>[] hash = <b>new</b> SHA1CryptoServiceProvider().ComputeHash(data);
                  <b>string</b> sVerifyHash = Convert.ToBase64String(hash);
                  <b>return</b> _Hash.Equals(sVerifyHash);
                  }
                  <br>
                  <b>public</b> <b>string</b> Salt
                  {
                  get
                  {
                  <b>return</b> _Salt;
                  }
                  }
                  <br>
                  <b>public</b> <b>string</b> Hash
                  {
                  get
                  {
                  <b>return</b> _Hash;
                  }
                  }
                  }
                  }
                  </pre>
                  Demo des Aufrufs:
                  <pre>
                  <b>using</b> OssiSoft.Security;
                  <br>
                  ...
                  <br>
                  <b>private</b> <b>void</b> button1_Click(<b>object</b> sender, System.EventArgs e)
                  {
                  <b>string</b> sNewSalt;
                  <b>string</b> sNewHash;
                  OSSaltedHash aObj = OSSaltedHash.Create(textBox1.Text);
                  sNewSalt = aObj.Salt;
                  sNewHash = aObj.Hash;
                  listBox1.Items.Add(<b>String</b>.Format(<font color="#9933CC">&quot;Password: {0}; Salt: {1}; Hash: {2}&quot;</font>,
                  textBox1.Text, sNewSalt, sNewHash));
                  aObj = <b>null</b>;
                  <font color="#003399"><i>// prüfen</i></font>
                  aObj = OSSaltedHash.Create(sNewSalt, sNewHash);
                  <b>if</b> (aObj.Verify(textBox2.Text))
                  listBox1.Items.Add(<font color="#9933CC">&quot;Passwort stimmt überein&quot;</font>);
                  <b>else</b>
                  listBox1.Items.Add(<font color="#9933CC">&quot;Passwort stimmt NICHT überein&quot;</font>);
                  }
                  </pre>
                  P.S: Da Delphi 8 eine C#-Klasse (Assembly) einbinden und einen eigenen Nachfolger von der C#-Klasse ableiten kann, gibt es Heute (im .NET-Zeitalter) keinen Grund mehr, eine einsatzfertige C#-Implementierung erst nach Delphi zu übersetzen. Daher würde sich im Delphi 8-Beispiel nur der Aufruf ändern, aber nicht die Klasse ;-

                  Comment


                  • #10
                    Hallo!
                    Herzlichen Dank für die Hilfe, aus beruflichen Gründen habe ich momentan wenig Zeit. Ich werde aber so schnell wie möglich versuchen, das Beispiel umzusetzen.

                    Danke nochmals
                    Michae

                    Comment

                    Working...
                    X