Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Rijndael DEC 5.2 und Cryptography von Visual Studio (https://www.delphipraxis.net/182929-rijndael-dec-5-2-und-cryptography-von-visual-studio.html)

TheProfi 27. Nov 2014 11:16

Rijndael DEC 5.2 und Cryptography von Visual Studio
 
Moin,

wir wollen Loginpasswörter die in einer MSSQL gespeichert sind, ver- und entschlüsseln sowohl in XE6 mit DEC 5.2 und Visual Studio 2013 damit wir das Anmeldefenster bauen können. Nun ist es so, dass wir dabei nicht auf die selben Ergebnisse kommen :(

Code Visual Studio
Code:
       public static string EncryptString(string stringToEncrypt,string encryptionKey)
        {
            string encrypted = String.Empty;
            byte[] key = Encoding.Unicode.GetBytes(encryptionKey);

            RijndaelManaged RMCrypto = new RijndaelManaged();      
            MemoryStream ms = new MemoryStream();
            CryptoStream cs = new CryptoStream(ms, RMCrypto.CreateEncryptor(key, key), CryptoStreamMode.Write);

            byte[] encryptedString = Encoding.ASCII.GetBytes(stringToEncrypt);
            cs.Write(encryptedString, 0, encryptedString.Length);
            cs.FlushFinalBlock();

            return Convert.ToBase64String(ms.ToArray());
            ms.Close();
            cs.Close();
        }
Key: 12345678 (encryptionKey)
Wert: test (stringToEncrypt)
Ergebnis: 1iJosVDlt3OJZeMtfWhulQ==

Delphi-Quellcode:
   with TCipher_Rijndael.Create do
   begin
     try
       m1.Lines.Add('KEY : '+ wsKey);
       m1.Lines.Add('Text : '+ wsString);

       SetLength(vKEY,16);
       setlength(vIV,16);
       vKey := TEncoding.Unicode.GetBytes(wsKey);
       vIv := TEncoding.Unicode.GetBytes(wsKey);
       Init(vkey, 16, vKey, 16);
       Mode := cmCBCx;
       Data := EncodeBinary(wsString, TFormat_MIME64);
       m1.Lines.Add('Data : '+ Data + ' '+inttostr(length(data)));
     finally
       Free;
     end;
   end;
KEY : 12345678 (wsKey)
Text : test (wsString)
Data : 8jnglg==

Wir haben hier bewusst auf Hash und Salt verzichte um erstmal eine gemeinsame Basis zu finden. Hat jemand dazu eine Idee???

gammatester 27. Nov 2014 11:28

AW: Rijndael DEC 5.2 und Cryptography von Visual Studio
 
Ja, kommt so häufig vor, daß sich es sich fast als FAQ eignet:

DEC-Modus cmCBCx ist nicht standard.

Zitat: Cipher Block Chainung, with CFB8 padding of truncated final block

TheProfi 27. Nov 2014 11:31

AW: Rijndael DEC 5.2 und Cryptography von Visual Studio
 
Zitat:

Zitat von gammatester (Beitrag 1281303)
Ja, kommt so häufig vor, daß sich es sich fast als FAQ eignet:

DEC-Modus cmCBCx ist nicht standard.

Zitat: Cipher Block Chainung, with CFB8 padding of truncated final block

OK - was ist denn Standard - wir haben im Forum vieles gefunden, hat uns aber nicht weitergeholfen...

gammatester 27. Nov 2014 11:42

AW: Rijndael DEC 5.2 und Cryptography von Visual Studio
 
Ihr müßt erst einmal herausbekommen, was eigentlich auf VS-Seite verwendet wird. Also

1. Schlüsselgröße: 128,192, oder 256 Bit

2. Betriebmodus (ECB, CBC, CTR, CFB ...).

3. IV (Initialisierungsvektoren falls nicht ECB)

4. Bei ECB und CBC müssen die Textlängen ein Vielfaches von 16 Bytes sein, sonst wird Padding verwendet (Welches?). Hier ist der Nicht-Standard von DEC: die ganzen 16-Bytesblocks wird CBC verwendet, für den Rest CFB8.

Möglich Lösungen: Da DEC keinen CTR-Modus kann, könntet ihr zB immer CFB8 verwenden. Oder ein PKCS7-Padding auf VS-Seite, das auf DEC-Seite manuell entfernt wird.

Auf jeden Fall müssen die Punkte 1 und 3 geklärt werden.

Edit: Übrigens ist '12345678' (wahrscheinlich) kein gültiger Schlüssel, sondern der wird (??) via Key-Derivation-Function/Hash aus '12345678' erzeugt.

TheProfi 27. Nov 2014 12:10

AW: Rijndael DEC 5.2 und Cryptography von Visual Studio
 
Zitat:

Zitat von gammatester (Beitrag 1281310)
Ihr müßt erst einmal herausbekommen, was eigentlich auf VS-Seite verwendet wird. Also

1. Schlüsselgröße: 128,192, oder 256 Bit

2. Betriebmodus (ECB, CBC, CTR, CFB ...).

3. IV (Initialisierungsvektoren falls nicht ECB)

4. Bei ECB und CBC müssen die Textlängen ein Vielfaches von 16 Bytes sein, sonst wird Padding verwendet (Welches?). Hier ist der Nicht-Standard von DEC: die ganzen 16-Bytesblocks wird CBC verwendet, für den Rest CFB8.

Möglich Lösungen: Da DEC keinen CTR-Modus kann, könntet ihr zB immer CFB8 verwenden. Oder ein PKCS7-Padding auf VS-Seite, das auf DEC-Seite manuell entfernt wird.

Auf jeden Fall müssen die Punkte 1 und 3 geklärt werden.

Edit: Übrigens ist '12345678' (wahrscheinlich) kein gültiger Schlüssel, sondern der wird (??) via Key-Derivation-Function/Hash aus '12345678' erzeugt.

zu 1. 256 Bit
zu 2. ECB

Code:
        public static string EncryptString(string stringToEncrypt,string encryptionKey)
        {
            string encrypted = String.Empty;
            byte[] key = Encoding.Unicode.GetBytes(encryptionKey);

            RijndaelManaged RMCrypto = new RijndaelManaged();      
            RMCrypto.Mode = CipherMode.ECB;
            RMCrypto.KeySize = 256;
            MemoryStream ms = new MemoryStream();
            CryptoStream cs = new CryptoStream(ms, RMCrypto.CreateEncryptor(key, key), CryptoStreamMode.Write);

            byte[] encryptedString = Encoding.ASCII.GetBytes(stringToEncrypt);
            cs.Write(encryptedString, 0, encryptedString.Length);
            cs.FlushFinalBlock();

            return Convert.ToBase64String(ms.ToArray());
            ms.Close();
            cs.Close();
        }
Nachdem wir es auf cmECBx in Delphi umgestellt haben bekommen wir die Meldung: Message length for cmECBx must be a multiple of 16 bytes

Dawn87 27. Nov 2014 12:14

AW: Rijndael DEC 5.2 und Cryptography von Visual Studio
 
gelöscht

cookie22 27. Nov 2014 12:32

AW: Rijndael DEC 5.2 und Cryptography von Visual Studio
 
Zitat:

Zitat von TheProfi (Beitrag 1281319)
Nachdem wir es auf cmECBx in Delphi umgestellt haben bekommen wir die Meldung: Message length for cmECBx must be a multiple of 16 bytes

Das hört sich ganz danach an, als wenn du dich da selbst um das Padding kümmern musst. Ganz nebenbei solltet ihr fals es möglich ist, nicht ECB verwenden, denn das ist der unsicherste Modus.

TheProfi 27. Nov 2014 13:54

AW: Rijndael DEC 5.2 und Cryptography von Visual Studio
 
Reicht es eventuell aus wenn man Passwort einfach nur als HASH speichert?
Dies läst sich mit VS und Delphi einfach umsetzen.

Delphi-Quellcode:
   wsString := 'test';
   wsKey := '123456';
   try
     Hash := THash_SHA256.Create; //var Hash : TDECHash;
     vKey := TEncoding.Unicode.GetBytes(wsKey);
     m1.Lines.Add('Hash : ' + Hash.CalcBinary(wsstring+wskey, TFormat_MIME64));
   finally
     Hash.Free;
   end;
Code:
       public static string GenerateHashWithSalt(string password,string key)
        {
            string sHashWithSalt = password + key;
            byte[] saltedHashBytes = Encoding.UTF8.GetBytes(sHashWithSalt);
            System.Security.Cryptography.HashAlgorithm algorithm = new System.Security.Cryptography.SHA256Managed();
            byte[] hash = algorithm.ComputeHash(saltedHashBytes);
            return Convert.ToBase64String(hash);
        }


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:28 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