Announcement

Collapse
No announcement yet.

Problem mit TripleDESCryptoServiceProvider

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

  • Problem mit TripleDESCryptoServiceProvider

    Servus,

    ich versuche schon seit einiger Zeit, mir eine Funktion zu basteln, die einen String mit
    TripleDESCryptoServiceProvider oder
    RijandelManaged verschlüsselt. Leider gelingt mir das nicht.

    Verschlüssle ich und arbeite bis zum entschlüsseln nur mit einem Array of Byte, funktioniert das ganze wunderbar.
    Sobald ich das Byte-Array aber zwischen Ver- und Entschlüsselung in einen String umwandle, geht nichts mehr.

    Zum Umwandeln hab ich Convert.ToBase64String bzw. auch ASCIIEncoding.GetString verwendet.

    Kann mir hierbei bitte jemand helfen?

    Vielen Dank!

    Ciao

    Benni

    P.S. Ich werde in einem Antwort-Post mal meinen bisherigen Unit-Quellcode posten!

    P.S.2 Gibt es eigentlich in Delphi 8 eine neue Möglichkeit, dynamische Arrays zu erstellen oder läuft das wie gehabt mittels z.B. folgender Type-Anweisung und SetLength etc.?

    <pre>
    type TByteArray = Array Of System.Byte;
    </pre>

  • #2
    <pre>
    unit SmallTest.Security;

    interface

    type TByteArray = Array Of System.Byte;

    TSecurity = class
    constructor Create;
    private
    function EncryptByteArray(S: TByteArray; Var IV, Key: TByteArray): TByteArray;
    function DecryptByteArray(S, IV, Key: TByteArray): TByteArray;

    function StringToByteArray(S: String): TByteArray;
    function ByteArrayToString(B: TByteArray): String;
    public
    function EncryptString(S: String; Var Key, IV: TByteArray): String; Overload;
    function DecryptString(S: String; Key, IV: TByteArray): String; Overload;
    end;

    implementation

    uses System.Security.Cryptography,
    System.IO,
    System.Text;

    { TSecurity }

    function TSecurity.ByteArrayToString(B: TByteArray): String;
    var TextConverter: ASCIIEncoding;
    begin
    TextConverter := ASCIIEncoding.Create;
    Result := TextConverter.GetString(B);
    end;

    constructor TSecurity.Create;
    begin
    Inherited;
    end;

    function TSecurity.DecryptByteArray(S, IV, Key: TByteArray): TByteArray;
    var rij: TripleDESCryptoServiceProvider;// RijndaelManaged;
    Decryptor: ICryptoTransform;
    ms: MemoryStream;
    cs: CryptoStream;
    _To, A: TByteArray;
    I: Integer;
    TextConverter: ASCIIEncoding;
    begin
    rij := TripleDESCryptoServiceProvider.Create; //RijndaelManaged.Create;
    rij.IV := IV;
    rij.Key := Key;
    Decryptor := rij.CreateDecryptor(Key, IV);
    ms := MemoryStream.Create(S);

    cs := CryptoStream.Create(ms, Decryptor, CryptoStreamMode.Read);
    SetLength(A, Length(S));
    cs.Read(A, 0, Length(A));
    Result := A;
    end;

    function TSecurity.DecryptString(S: &String; Key, IV: TByteArray): String;
    var Temp: TByteArray;
    begin
    Temp := StringToByteArray(S);
    Temp := DecryptByteArray(Temp, Key, IV);
    Result := ByteArrayToString(Temp);
    end;

    function TSecurity.EncryptByteArray(S: TByteArray; var IV,
    Key: TByteArray): TByteArray;
    var rij: TripleDESCryptoServiceProvider;//RijndaelManaged;
    Encryptor: ICryptoTransform;
    ms: MemoryStream;
    cs: CryptoStream;
    _To: TByteArray;
    TextConverter: ASCIIEncoding;
    begin
    rij := TripleDESCryptoServiceProvider.Create;//RijndaelManaged.Create;
    If (IV = Nil) Then Begin
    rij.GenerateIV;
    IV := rij.IV;
    End Else
    rij.IV := IV;
    If (Key = Nil) Then Begin
    rij.GenerateIV;
    Key := rij.Key;
    End Else
    rij.Key := Key;
    Encryptor := rij.CreateEncryptor(Key, IV);

    ms := MemoryStream.Create;
    cs := CryptoStream.Create(ms, Encryptor, CryptoStreamMode.Write);

    cs.Write(S, 0, Length(S));
    cs.FlushFinalBlock;
    Result := ms.ToArray;
    end;

    function TSecurity.EncryptString(S: &String; Var Key, IV: TByteArray): String;
    var Temp: TByteArray;
    begin
    Temp := StringToByteArray(S);
    Temp := EncryptByteArray(Temp, Key, IV);
    Result := Convert.ToBase64String(Temp);
    end;

    function TSecurity.StringToByteArray(S: &String): TByteArray;
    var TextConverter: ASCIIEncoding;
    begin
    TextConverter := ASCIIEncoding.Create;
    Result := TextConverter.GetBytes(S);
    end;

    end.
    </pre&gt

    Comment


    • #3
      Hallo,

      warum soll etwas bereits in VB.NET oder C# vorhandenes mühsam in Delphi nachgebaut werden? Der Vorteil von .NET liegt doch darin, dass die eigene Anwendung aus Teilen bestehen darf, in in verschiedenen Sprachen geschrieben wurden. Ich würde daher eines der Beispiele aus der .NET Framework-Dokumentation als C# Class Library kompilieren und die Assembly-DLL nur in D8 einbinden. Das könnte dann so aussehen:
      <pre>
      <b>using</b> System;
      <b>using</b> System.IO;
      <b>using</b> System.Text;
      <b>using</b> System.Security.Cryptography;
      <br>
      <b>namespace</b> CSEncryptetData
      {
      <font color="#003399"><i>/// &lt;summary&gt;</i></font>
      <font color="#003399"><i>/// Summary description for OSTripleDES.</i></font>
      <font color="#003399"><i>/// &lt;/summary&gt;</i></font>
      <b>public</b> <b>class</b> OSTripleDES
      {
      <b>public</b> OSTripleDES()
      {
      <font color="#003399"><i>//</i></font>
      <font color="#003399"><i>// TODO: Add constructor logic here</i></font>
      <font color="#003399"><i>//</i></font>
      }
      <br>
      <font color="#003399"><i>// Schlüssel</i></font>
      <b>private</b> <b>byte</b>[] key = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
      <br> 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24};
      <font color="#003399"><i>// Init-Vektor</i></font>
      <b>private</b> <b>byte</b>[] iv = {65, 110, 68, 26, 69, 178, 200, 219};
      <br>
      <b>public</b> <b>byte</b>[] Encrypt(<b>string</b> plainText)
      {
      UTF8Encoding utf8encoder = <b>new</b> UTF8Encoding();
      <b>byte</b>[] inputInBytes = utf8encoder.GetBytes(plainText);
      TripleDESCryptoServiceProvider tdesProvider = <b>new</b> TripleDESCryptoServiceProvider();
      <font color="#003399"><i>// TripleDES-Provider initialisieren</i></font>
      ICryptoTransform cryptoTransform = tdesProvider.CreateEncryptor(key, iv);
      <font color="#003399"><i>// Zeichenkette verschlüsseln</i></font>
      MemoryStream encryptedStream = <b>new</b> MemoryStream();
      CryptoStream cryptStream = <b>new</b> CryptoStream(encryptedStream, cryptoTransform, CryptoStreamMode.Write);
      cryptStream.Write(inputInBytes, 0, inputInBytes.Length);
      cryptStream.FlushFinalBlock();
      encryptedStream.Position = 0;
      <font color="#003399"><i>// Stream in ein Byte-Array zurückkopieren</i></font>
      <b>int</b> iLength = (<b>int</b>)encryptedStream.Length;
      <b>byte</b>[] aResult = <b>new</b> <b>Byte</b>[iLength];
      encryptedStream.Read(aResult, 0, iLength);
      cryptStream.Close();
      <b>return</b> aResult;
      }
      <br>
      <b>public</b> <b>string</b> Decrypt(<b>byte</b>[] inputInBytes)
      {
      UTF8Encoding utf8encoder = <b>new</b> UTF8Encoding();
      TripleDESCryptoServiceProvider tdesProvider = <b>new</b> TripleDESCryptoServiceProvider();
      <font color="#003399"><i>// TripleDES-Provider initialisieren</i></font>
      ICryptoTransform cryptoTransform = tdesProvider.CreateDecryptor(key, iv);
      <font color="#003399"><i>// Zeichenkette entschlüsseln</i></font>
      MemoryStream decryptedStream = <b>new</b> MemoryStream();
      CryptoStream cryptStream = <b>new</b> CryptoStream(decryptedStream, cryptoTransform, CryptoStreamMode.Write);
      cryptStream.Write(inputInBytes, 0, inputInBytes.Length);
      cryptStream.FlushFinalBlock();
      decryptedStream.Position = 0;
      <font color="#003399"><i>// Stream zurück in einen String kopieren</i></font>
      <b>int</b> iLength = (<b>int</b>)decryptedStream.Length;
      <b>byte</b>[] aResult = <b>new</b> <b>Byte</b>[iLength];
      decryptedStream.Read(aResult, 0, iLength);
      cryptStream.Close();
      UTF8Encoding aUTF8 = <b>new</b> UTF8Encoding();
      <b>return</b> aUTF8.GetString(aResult);
      }
      }
      }
      </pre>
      &gt;... array in Delphi

      Das könnte so aussehen:
      <pre>
      <b>var</b>
      aBuffer : <b>array</b> <b>of</b> Byte;
      <b>begin</b>
      SetLength(aBuffer, 100);
      ...
      <b>end</b>;
      </pre&gt

      Comment


      • #4
        Danke, Herr Kosch! Auf diese Idee bin ich natürlich nicht gekommen, aber das ist sogar noch besser, da ich das eh in mehreren Projekten brauchen werde. Vielen Dank!

        VS.NET hab ich zwar nicht, aber mit dem Kommandozeilen-Compiler ist das wahrscheinlich ohne Problem zu kompilieren, oder

        Comment


        • #5
          Oh - grad hab ich festgestellt, dass das problem doch noch das gleiche ist. Soweit wie obiger Code hatte ich auch schon in Delphi - das Problem liegt am Rückgabewert. Ich muß das Byte-Array in einen String umwandeln, doch funktioniert dann das Decrypt nicht mehr.
          Da liegt das eigentlich Problem: In der Umwandlung von einem Byte-Array in einen String und zurück. Wahrscheinlich ist hier der Bock begraben.
          Weiß hierüber noch jemand was?
          Vielen Dank

          Comment


          • #6
            Hallo,

            der C#-Kommandozeilen-Kompiler aus dem .NET Framework SDK reicht völlig aus.

            a) Text in Byte-Array ablegen:
            <pre>
            byte[] aStringByteArray;
            aStringByteArray = System.Text.Encoding.GetEncoding(1252).GetBytes("D as ist ein Test");
            string sData;
            sData = System.Text.Encoding.ASCII.GetString(aStringByteAr ray);
            MessageBox.Show(sData);
            </pre>
            b) Byte-Array als String interpretieren:
            <pre>
            sData = System.Text.Encoding.ASCII.GetString(aByteArray);
            MessageBox.Show(sData);
            </pre&gt

            Comment

            Working...
            X